我正在使用integralN函数来执行复杂函数的4维积分(如果您感兴趣我将它放在帖子的末尾)。
我正在(r1, r2) = (1.8, 1.8)
开始进行整合。从分析上看,这个函数是在r1 = r2
定义的,但数值上,Matlab将匹配坐标的所有内容视为NaN
。
有什么方法可以避免这种行为吗?作为一个FYI,将eps
添加到下限的一个不起作用。
f1 =@(r) 5*r.^2 + 2;
f2 =@(r) 2*r.^2 + 12;
f1p = der(f1);
f2p = der(f2);
dF = @(r1,t1,r2,t2)((r1.*r2.*(f1(r1)-f2(r2)+(-r1+r2.*cos(t1-t2)).*f1p(r1)).*(f1(r1)-f2(r2)+(r2-r1.*cos(t1-t2)).*f2p(r2)))./(pi.*(r1.^2+r2.^2-2.*r1.*r2.*cos(t1-t2)+(f1(r1)-f2(r2)).^2).^2))
function df = der(f)
syms x
df = matlabFunction(diff(f(x)));
end
答案 0 :(得分:1)
我找到了一个强制正确输出的环绕函数,其中funMatch
和funNoMatch
是4d函数,我的限制存储在Limit
中。
f = @(r1, t1, r2, t2) selective(funMatch, funNoMatch, r1 == r2, r1, t1, r2, t2);
res = integralN(f, Limit(1,1), Limit(1,2), Limit(2,1), Limit(2,2), Limit(3,1), Limit(3,2), Limit(4,1), Limit(4,2), 'RelTol',1e-1, 'AbsTol',1e-3);
function res = selective(funMatch, funNoMatch, cond, varargin)
res = zeros(size(cond));
Match = cellfun(@(x) x(cond), varargin, 'uni', 0);
NoMatch = cellfun(@(x) x(~cond), varargin, 'uni', 0);
res(cond) = funMatch(Match{:});
res(~cond) = funNoMatch(NoMatch{:});
end