在
提到,辛普森积分最简单的形式是
也就是说至少要三个积分点,两个积分子区间。所以,自适应辛普森积分公式要从S1起步,即

将 式与自适应梯形公式
比较,可得
由此可以得到递推式
若以 表示前后两次计算结果的相对误差,即
若满足要求,则停止计算。python代码
import math###自适应辛普森公式求积分##def Func(x):return 1/( 1+pow(x,2) )def AdaptiveSimpsonCtrl(Func, a, b, eps = 1e-6):kmax = 9000 #最大迭代步数h = b-a # 积分区间n = 1t0 = 0.5*h*(Func(a) + Func(b))for k in range(1,kmax+1):sumf = 0for i in range(1,n+1): sumf += Func(a+(i-0.5)*h)t = 0.5*(t0 + h*sumf)s = (4*t - t0)/3if (k > 1):if (math.fabs(s-s0) <= eps * math.fabs(s)): breakif (math.fabs(s) <= eps and math.fabs(s) <= math.fabs(s-s0)): breakh *= 0.5n *= 2s0 = st0 = tif (k >= kmax): print("已经达到最大迭代步数!")return sS = AdaptiveSimpsonCtrl(Func, 0, 1, eps = 1e-6)print(S)

计算结果是0.7853981628062056,精确值为
算法基本原理:把原区间分为一系列小区间(n份),在每个小区间上都用小的梯形面积来近似代替原函数的积分,当小区间足够小时,就可以得到原来积分的近似值,直到求得的积分结果满足要求的精度为止。但是这个过程中有一个问题是步长的取值,步长太大精度难以保证,步长太小会导致计算量的增加。
★★★★往期相关★★★★