Matlab中数值积分的被积函数归一化

时间:2018-04-08 20:13:25

标签: matlab numerical-integration

首先,我不确定这是否是发布此内容的最佳位置,但由于没有专门的Matlab社区,我在此处发布此内容。

为了给出一点背景知识,我目前正在对等离子体物理模拟进行原型设计,该模拟涉及三重积分。最内部的积分可以通过分析完成,但对于外部两者,这是不可能的。我一直认为最好使用接近统一的值,从而将我最内层的积分归一化,使其无单位,通常取值接近于1。然而,与早期版本的代码相比,这个最里面的积分评估为1e-50的数值,数值双重积分,使用原生Matlab函数integral2,目标相对容差为1e-6 ,现在需要大约1000倍的功能评估才能收敛。因此,我的模拟现在需要大约12小时而不是之前的20分钟。

问题

所以我的问题是:

  1. 旧版本中更快的收敛是否可能仅仅是因为额外的评估作为舍入误差而消失,并且即使它通过1e-6相对容差,结果也不值得信赖?在我运行的几个测试中,两个版本的结果似乎相同。
  2. 关于数值积分被积函数归一化的最佳实践是什么?
  3. 有没有办法改善数值积分的收敛性,特别是如果被积函数可能有奇点?
  4. 我感谢任何帮助或见解,特别是因为我不完全理解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));
    

0 个答案:

没有答案