对积分的嵌套调用失败

问题描述 投票:0回答:1

尝试这段代码,效果很好。

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);

但是如果您取消注释以积分Val开头的行。代码损坏了。

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

matlab numerical-integration integral function-handle
1个回答
1
投票

简短回答:您应该添加

'ArrayValued'
选项:

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

解释

您应该阅读错误消息:

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

因为

derivedF2
以矢量化方式计算,即通过提供
f
向量而不是单个标量,同时在不同的
y
坐标处计算
y
,MATLAB 无法以矢量化方式计算外积分也是这样。因此,您应该将
'ArrayValued'
选项添加到外积分,即:

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

请注意,

ezplot
还会生成以下相关警告:

警告:函数无法对数组输入求值;对函数进行向量化可以加快其计算速度并避免 需要循环数组元素。

请注意,问题纯粹与

integral
的嵌套调用有关,以下代码也会导致相同的错误:

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

什么是数组值函数?

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

因此,如果

@(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);
    

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

Array Valued 的另一种解释是告诉 matlab 不要使用向量化,但对于这种解释,名称 Array Valued 有点误导。

© www.soinside.com 2019 - 2024. All rights reserved.