尝试这段代码,效果很好。
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开头的行。代码损坏了。
显然,派生函数句柄不支持积分操作,还是我错过了什么?
简短回答:您应该添加
'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 有点误导。