对积分的嵌套调用失败



试试这段代码,它工作正常。

a=1;b=2;
% A two-variate function 
f2= @(x,y) x+y;
derivedF2=@(x) integral(@(y) f2(x,y), a,b);
% Test the evaluation of the derived function handle
derivedF2(0);
% Test the integration of the derived function handle
% integralVal=integral(derivedF2,a,b);
% integralVal=integral(@(x) derivedF2(x),a,b);
% Test plotting of the derived function handle
figure(11);
ezplot(derivedF2);

但是,如果您取消注释以积分瓦尔开头的行。代码中断。

显然,派生的函数句柄不支持集成操作,还是我错过了什么?

简短回答:您应该添加'ArrayValued'选项:

integralVal=integral(derivedF2,a,b, 'ArrayValued', true);

解释

您应该阅读错误消息:

函数的输出必须与输入的大小相同。如果 FUN 是数组值积分,则设置 'ArrayValued' 选项为 true。

由于derivedF2是以矢量化方式评估的,即它通过提供y向量而不是单个标量来同时评估不同y坐标下的f,因此 MATLAB 也无法以矢量化方式评估外部积分。因此,您应该将'ArrayValued'选项添加到外积分中,即:

integralVal=integral(derivedF2,a,b, 'ArrayValued', true);

请注意,ezplot还会生成以下相关警告:

警告:函数无法对数组输入进行求值;对函数进行矢量化可能会加快其求值速度并避免 需要遍历数组元素。

请注意,该问题纯粹与对integral的嵌套调用有关,以下代码也会导致相同的错误:

integralVal=integral(@(x) integral(@(y) f2(x,y), a,b),a,b);

什么是数组值函数?

。接受标量输入并返回向量、矩阵或 N-D 数组输出的函数。

因此,如果@(y) f2(x, y)是一个数组,则x是一个数组值函数,即它返回一个标量输入为y的数组。

有两种可能性可以避免数组值问题:

  • 避免@(y) f2(x, y)是一个数组值函数,即避免x是一个数组。这可以通过指出derivedF2是上面阐述的数组值函数来完成,尽管 - 严格来说 - 它不是一个数组值函数,即积分应该具有相同数量的输出和输入。但是,它在内部使用数组值函数,即@(x) f2(x, y)是一个数组值函数,因为 Matlab 默认以矢量化的方式计算积分,即它使用向量进行y

  • 告诉 Matlab@(y) f2(x, y)是一个数组值函数

    derivedF2=@(x) integral(@(y) f2(x,y), a,b, 'ArrayValued', true);
    

    这可能是一种更直观的方法,但速度较慢,因为内部积分的调用频率比外部积分高得多。

数组值的另一种解释是你告诉 matlab 不要使用矢量化,但对于这种解释,数组这个名字有点误导。

最新更新