Matlab数值积分避免点

时间:2015-06-24 22:19:59

标签: matlab numerical-integration

我正在使用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

1 个答案:

答案 0 :(得分:1)

我找到了一个强制正确输出的环绕函数,其中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