Matlab integral2 可以处理非匿名函数吗?
Can Matlab integral2 deal with a non-anonymous function?
我有一个用户自定义函数
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
时,它会生成错误 "Not enough input arguments"。我想知道是因为 Matlab integral2
只能与那些单行匿名函数一起使用吗?
这里的问题是您定义函数的方式。要使用内置函数进行二重积分,应正确矢量化被积函数。
一种方法是使用 for 循环重写您的函数,以处理 a1
和 a2
是维度 [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
、b2
和 pB
以及积分限制 t1
和 t2
。
我有一个用户自定义函数
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
时,它会生成错误 "Not enough input arguments"。我想知道是因为 Matlab integral2
只能与那些单行匿名函数一起使用吗?
这里的问题是您定义函数的方式。要使用内置函数进行二重积分,应正确矢量化被积函数。
一种方法是使用 for 循环重写您的函数,以处理 a1
和 a2
是维度 [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
、b2
和 pB
以及积分限制 t1
和 t2
。