首页 > 解决方案 > Matlab integral2 可以处理非匿名函数吗?

问题描述

我有一个用户定义的函数

function[Rout2] = SSP2(a1,a2,b1,b2,pB)  
if a1/b1>a2/b2
   if pB<=a1-b1*a2/b2
      Rout2 = (a1-pB)/b1; 
   else
       if pB<=a1+a2
          Rout2 = (a1+a2-pB)/(b1+b2); 
       else
          Rout2 = 0;  
       end
   end
else
    if pB<=a2-b2*a1/b1
       Rout2 = (a2-pB)/b2;  
    else
        if pB<=a1+a2
           Rout2 = (a1+a2-pB)/(b1+b2);  
        else
           Rout2 = 0;   
        end
    end     
end
end

b1,b2,pB都是参数。我想用Matlab integral2这个功能来集成a1 in [0,t1]a2 in [0,t2]. 我最初尝试过

integral2(SSP2,0,t1,0,t2)

但它不起作用。然后我想这可能是我传递了额外的参数。所以我做了以下修改

function[R] = NumericalIntegration(b1,b2,pB,t1,t2)
function[Rout2] = SSP2(a1,a2)  
if a1/b1>a2/b2
   if pB<=a1-b1*a2/b2
      Rout2 = (a1-pB)/b1; 
   else
       if pB<=a1+a2
          Rout2 = (a1+a2-pB)/(b1+b2); 
       else
          Rout2 = 0;  
       end
   end
else
    if pB<=a2-b2*a1/b1
       Rout2 = (a2-pB)/b2;  
    else
        if pB<=a1+a2
           Rout2 = (a1+a2-pB)/(b1+b2);  
        else
           Rout2 = 0;   
        end
    end     
end
end
R = integral2(@SSP2,0,t1,0,t2);
end

现在,在函数内部NumericalIntegration,函数SSP2可以访问参数b1,b2,pB。我认为它应该工作。但事实并非如此。当我在主程序中调用该函数NumericalIntegration时,它会生成错误“输入参数不足”。我想知道是因为Matlab integral2只能使用那些单行匿名函数吗?

标签: matlabintegrationanonymous-function

解决方案


这里的问题是您定义函数的方式。要使用内置函数进行双重积分,被积函数应正确矢量化。

一种方法是使用 for 循环重写您的函数,以处理a1a2是二维数组的情况[m,n]。但是您可以使用 MATLAB 逐元素乘法和逻辑运算符将您的函数定义为:

function[Rout2] = SSP2(a1,a2,b1,b2,pB)
    Rout2 = 0*a1;

    Rout2 = Rout2 + ((a1-pB)/b1).*(a1/b1>a2/b2).*(pB<=a1-b1*a2/b2) + &
        ((a2-pB)/b2).*(a1/b1<=a2/b2).*(pB<=a2-b2*a1/b1);
end

然后创建匿名函数并将其称为:

b1 = rand;
b2 = rand;
pB = rand;

fun = @(a1,a2) SSP2(a1,a2,b1,b2,pB);

t1 = rand;
t2 = rand;
I = integral2(fun,0,t1,0,t2)

只需相应地定义您的参数和b1集成限制。b2pBt1t2


推荐阅读