在区间 上,采用梯形公式计算 的定积分
如果将区间 二等分,采用梯形公式计算 的定积分
其中
如果将区间 三等分,采用梯形公式计算 的定积分
其中
由此可以得到递推式
表示两次迭代的相对误差,即
若 满足要求,则停止迭代。python代码
import math
###自适应梯形公式求积分
##
def Func(x):
return 1/( 1+pow(x,2) )
def AdaptiveTrapzCtrl(Func, a, b, eps = 1e-6):
kmax = 9000 #最大迭代步数
h = b-a # 积分区间
n = 1
t0 = 0.5*h*(Func(a) + Func(b))
for k in range(1,kmax+1):
sumf = 0
for i in range(1,n+1):
sumf += Func(a+(i-0.5)*h)
t = 0.5*(t0 + h*sumf)
if (k > 1):
if (math.fabs(t-t0) <= eps*math.fabs(t)): break
if (math.fabs(t) <= eps and math.fabs(t) <= math.fabs(t-t0)): break
h *= 0.5
n *= 2
t0 = t
if (k >= kmax): print("已经达到最大迭代步数!")
return t
T = AdaptiveTrapzCtrl(Func, 0.6, 1, eps = 1e-6)
print(T)
计算结果是0.24497869339807107,精确值为:
算法基本原理:把原区间分为一系列小区间(n份),在每个小区间上都用小的梯形面积来近似代替原函数的积分,当小区间足够小时,就可以得到原来积分的近似值,直到求得的积分结果满足要求的精度为止。但是这个过程中有一个问题是步长的取值,步长太大精度难以保证,步长太小会导致计算量的增加。