Matlab数值积分避让点

Matlab numerical integral avoid point

我正在使用 integralN 函数对复杂函数进行 4 维积分(如果您有兴趣,我将其放在 post 的末尾)。

我从 (r1, r2) = (1.8, 1.8) 开始进行整合。从分析上讲,此函数定义在 r1 = r2 处,但在数值上,Matlab 将具有匹配坐标的所有内容视为 NaN.

有什么办法可以避免这种行为吗?作为仅供参考,将 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

我想出了一个可以强制正确输出的环绕函数,其中 funMatchfunNoMatch 是 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