对于朴素的 Simpson 方法,想要获得精确的积分结果,需要将积分区间等分为大量的小区间进行求和积分。而实际上,在函数值波动较小的区域,并不需要如此高的划分精度,这种不必要的区间划分导致了计算效率的降低。自适应 Simpson 积分实现了动态地确定划分精度,极大提高了计算效率。其核心代码如下所示。
double simpson(double a,double b)
{
double c = a + (b-a)/2;
return (F(a) + 4*F(c) + F(b))*(b-a)/6;
}
double asr(double a,double b,double eps,double A)
{
double c = a + (b-a)/2;
double L = simpson(a,c), R = simpson(c,b);
if(fabs(L + R - A) <= 15*eps) return L + R + (L + R - A)/15.0;
return asr(a,c,eps/2,L) + asr(c,b,eps/2,R);
}
上面的代码中,出现了 15
这个神秘的数字,这是使用自适应 Simpson 积分时的推荐取值。关于使用数字 15
的原因,可阅读这篇论文。
我们为什么要使用 Simpson 积分法?
在进行数值积分时,一些被积函数的原函数不容易求解或者不能求解。而 Simpson 方法不需要求解原函数,只需要知道被积函数的表示式便可以方便精确地求解积分。另外,Simpson 方法的积分结果较为精确、容易实现(核心代码只有几行),自适应 Simpson 积分法的效率较高等等,都是其优点。
03 May 2017