函数子程序中二重积分书写

在函数子程序中运用函数句柄求二重积分值
这是用于fminsearch函数求最小值的被求函数,需要写一个二重积分,里面含有变量x,这里类似一个局部函数的形式
function [U_s,Uadhesion,Ubending,Uion,constrain1,constrain2] = U_s(x)
global D rou E u0 u1 x1 x2 A B N F G
Nf = 1000;
t = linspace(0,x2,Nf);
s = linspace(0,x2,Nf);
yplus = 0.5*(u1-u0)/x2*(t+s)+u0;
for i = 1:N
     yplus = yplus+x(i)*(sin(i*t/x2)+sin(i*s/x2));
end
V = @(t,s)A./(sqrt((t-s).^2+(yplus(t,s)).^2)).^12-B./(sqrt((t-s).^2+(yplus(t,s)).^2)).^6;
Uadhesion = rou^2*integral2(V,x1,x2,x1,x2);

报错: 输入参数的数目不足。
出错 U_s (第 24 行)
yplus = yplus+x(i)(sin(it/x2)+sin(i*s/x2));

主要问题在于复合函数,求积分一直出错。这里做不到直接代入,因为有函数迭代求和;也无法做局部函数,因为带有x(i)。
要求出这部分Uadhesion的值,含自变量x

img

在您的代码中,您在定义了 yplus 后,再次使用 yplus 作为函数参数传递给 V 函数,但是在这里您并没有给出 yplus 的参数。这可能是导致报错的原因之一。

另一个可能导致问题的原因是,您在调用 integral2 函数时,没有传递正确的函数句柄。在您的代码中,V 函数是一个匿名函数,接受两个参数 t 和 s,因此在调用 integral2 时,应该传递 V(t,s) 而不是 V。

正确的写法应该是这样的:

Uadhesion = rou^2 * integral2(@(t,s)V(t,s),x1,x2,x1,x2);

这样,我们就能正确地计算出积分值了。

https://wenku.baidu.com/view/e5ffeb3dab114431b90d6c85ec3a87c241288a4a.html?_wkts_=1670929502339&bdQuery=matlab+%E5%87%BD%E6%95%B0%E5%AD%90%E7%A8%8B%E5%BA%8F%E4%B8%AD%E4%BA%8C%E9%87%8D%E7%A7%AF%E5%88%86%E4%B9%A6%E5%86%99