试试这段代码,它工作正常。
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 不要使用矢量化,但对于这种解释,数组值这个名字有点误导。