首先,我不确定这是否是发布此内容的最佳位置,但由于没有专门的Matlab社区,我在此处发布此内容。
为了给出一点背景知识,我目前正在对等离子体物理模拟进行原型设计,该模拟涉及三重积分。最内部的积分可以通过分析完成,但对于外部两者,这是不可能的。我一直认为最好使用接近统一的值,从而将我最内层的积分归一化,使其无单位,通常取值接近于1。然而,与早期版本的代码相比,这个最里面的积分评估为1e-50的数值,数值双重积分,使用原生Matlab函数integral2
,目标相对容差为1e-6 ,现在需要大约1000倍的功能评估才能收敛。因此,我的模拟现在需要大约12小时而不是之前的20分钟。
问题
所以我的问题是:
我感谢任何帮助或见解,特别是因为我不完全理解Matlab的integral2
函数的内部工作原理以及使用它时应该注意什么。
如果我不知道任何更好,我会得出结论,1e-50数量级的被积函数比1e + 0的数量级更好,但这似乎没有意义。是否有一些数字原因可能实际情况如此?
TL; DR ,当函数乘以Matlab的integral2
以1e-50为因子进行数值积分,然后结果依次为1e + 50因子,积分给出相同的结果,但收敛速度更快,我不明白为什么。
编辑:
我准备了一个简短的脚本来说明问题。这里两个结果之间的相对差异大约为1e-4,因此低于integral2
的实际相对容差。然而,在我原来的问题中,差异甚至更小。
fun = @(x,y,l) l./(sqrt(1-x.*cos(y)).^5).*((1-x).*sin(y));
x = linspace(0,1,101);
y = linspace(0,pi,101).';
figure
surf(x,y,fun(x,y,1));
l = linspace(0,1,101); l=l(2:end);
v1 = zeros(1,100); v2 = v1;
tval = tic;
for i=1:100
fun1 = @(x,y) fun(x,y,l(i));
v1(i) = integral2(fun1,0,1,0,pi,'RelTol',1e-6);
end
t1 = toc(tval)
tval = tic;
for i=1:100
fun1 = @(x,y) 1e-50*fun(x,y,l(i));
v2(i) = 1e+50*integral2(fun1,0,1,0,pi,'RelTol',1e-6);
end
t2 = toc(tval)
figure
hold all;
plot(l,v1);
plot(l,v2);
plot(l,abs((v2-v1)./v1));