黎曼(Riemann)对定积分的定义是:积分区间划分为无数子区间,子区间内任意一点的函数值乘以子区间的长度得到一个矩形面积,然后将这些矩形面积累加起来可以得到积分值。中点法则(Midpoint Rule)是取子区间的中点的函数值作为矩形的高,如图所示
对于定积分 ,将积分区间 划分成4个等长子区间,每个子区间中点的函数值为 .可以得到定积分的近似值为:
如果划分为8个子区间,可得到
精确值是0.69314781... 子区间划分越多,误差就越小。
为了配合编程实现,可以通过将子区间的数量增加三倍来设计算法,而不是前面的辛普森,龙贝格公式增加两倍子区间。如图所示,空心圆圈表示必须计算的新值,而实心圆圈表示前一个迭代步计算的值。
可得到递推式:
[算例]用中点法则求
import math
### Midpoint ruler求积分
### y = 4/( 1+x^2 )
def Func(x):
return 4/( 1+pow(x,2) )
def MidPointIntegrate(Func, a, b, eps = 1e-6):
kmax = 5000 # 最大迭代步数
f1p6 = 1./6.
f5p6 = 5./6.
h = b-a
n = 1
m0 = h * Func(a+0.5*h)
for k in range(1,kmax+1):
sumf = 0
for i in range(1,n+1):
sumf += Func(a+(i-f5p6)*h) + Func(a+(i-f1p6)*h)
m = (m0 + h*sumf)/3
if (math.fabs(m - m0) <= eps * math.fabs(m)): break
h /= 3
n *= 3
m0 = m
if (k >= kmax): print("已经达到最大迭代步数!")
return m
S = MidPointIntegrate(Func, 0, 1, eps = 1e-6)
print(S)
结果为