【问题标题】:Nested call to integral fails对积分的嵌套调用失败
【发布时间】:2017-12-17 10:10:24
【问题描述】:

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

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

但是如果您取消注释以integralVal 开头的行。代码中断。

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

【问题讨论】:

    标签: matlab integration integral function-handle


    【解决方案1】:

    简答:您应该添加'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);
    

    什么是Array Valued 函数?

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

    因此,如果x 是一个数组,则@(y) f2(x, y) 是一个数组值函数,即它为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 有点误导。

    【讨论】:

    • 非常感谢@m7913d。对于其他阅读此答案的人。修复 ezplot 警告的一种方法是将该行代码更改为:“ezplot(@(x) arrayfun(derivedF2,x));”
    • 嗨@m7913d,当我更多地研究“ArrayValued”选项时,我变得更加困惑。 This link 读到“如果将 'ArrayValued' 选项设置为 true,则 fun 必须接受一个标量并返回一个固定大小的数组。”。 this link 读到“将此标志设置为 true 表示 fun 是一个接受标量输入并返回向量、矩阵或 N 维数组输出的函数。”
    • 和'ArrayValued',true表示被积函数是数组值函数。这让人不禁想知道“数组值函数”到底是什么......对不起,如果这是一个太基本的问题。
    猜你喜欢
    • 2017-01-28
    • 2013-11-10
    • 1970-01-01
    • 2023-01-14
    • 2013-07-18
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多