复化求积方法
复化梯形公式
将 [a,b] 进行 n 等分,节点 xk=a+kh,h=nb−a,k=0,1,…,n。在每个小区间 [xk,xk+1] 上应用梯形公式并求和:
I=k=0∑n−1∫xkxk+1f(x)dx≈k=0∑n−12h[f(xk)+f(xk+1)]=2h[f(a)+f(b)+2k=1∑n−1f(xk)]≡Tn
几何意义:用 n 个梯形面积之和逼近曲边梯形面积。随着 n 增大,折线逐步贴合原曲线。
复化 Simpson 公式
Simpson 公式需要区间中点,因此将 [a,b] 进行 2n 等分,步长 h=2nb−a,节点 xk=a+kh(k=0,1,…,2n)。共 2n+1 个节点。
在每两个小区间组成的大区间 [x2k−2,x2k] 上应用 Simpson 公式:
∫x2k−2x2kf(x)dx≈62h[f(x2k−2)+4f(x2k−1)+f(x2k)]
对所有 k=1,…,n 求和,得到复化 Simpson 公式:
Sn=3h[f(a)+f(b)+4k=1∑nf(x2k−1)+2k=1∑n−1f(x2k)]
注:复化 Simpson 的系数呈现 1,4,2,4,2,…,4,1 的规律。
复化梯形误差
若 f(x)∈C2[a,b],则存在 η∈(a,b) 使得:
R(f,Tn)≡∫abf(x)dx−Tn=−12b−ah2f′′(η),h=nb−a
证明:
在单个小区间 [xk,xk+1] 上,梯形公式的局部误差为:
∫xkxk+1f(x)dx−2h[f(xk)+f(xk+1)]=−12h3f′′(ξk),ξk∈(xk,xk+1)
对 n 个小区间求和:
R(f,Tn)=k=0∑n−1(−12h3f′′(ξk))=−12h2⋅hk=0∑n−1f′′(ξk)
由于 f′′ 连续,由积分中值定理的离散形式,存在 η∈(a,b) 使得:
hk=0∑n−1f′′(ξk)=(b−a)f′′(η)
代入即得结论。
复化 Simpson 误差
若 f(x)∈C4[a,b],则存在 η∈(a,b) 使得:
R(f,Sn)=−180b−ah4f(4)(η),h=2nb−a
等价地,若记 h1=nb−a=2h,则:
R(f,Sn)=−2880b−ah14f(4)(η)
证明:
在区间 [x2k−2,x2k](长度 2h)上,Simpson 公式的局部误差为:
∫x2k−2x2kf(x)dx−62h[f(x2k−2)+4f(x2k−1)+f(x2k)]=−2880(2h)5f(4)(ξk)=−90h5f(4)(ξk)
对 k=1,…,n 求和,并利用 n=2hb−a:
R(f,Sn)=−90h5k=1∑nf(4)(ξk)=−180b−ah4f(4)(η)
注:对比可见,复化梯形误差 O(h2),复化 Simpson 误差 O(h4)。
算法实现
def composite_trapezoidal(f, a, b, n):
"""复化梯形公式,n等分"""
h = (b - a) / n
s = 0.5 * (f(a) + f(b))
for k in range(1, n):
s += f(a + k * h)
return h * s
def composite_simpson(f, a, b, n):
"""
复化 Simpson 公式,2n 等分(n 个 Simpson 区间)
返回 S_n
"""
h = (b - a) / (2 * n)
s = f(a) + f(b)
for k in range(1, 2 * n):
if k % 2 == 1:
s += 4 * f(a + k * h) # 奇数节点,权重 4
else:
s += 2 * f(a + k * h) # 偶数节点,权重 2
return h * s / 3.0
逐次分半法
动机
复化公式要求预先给定步长 h,但实际问题中往往难以估计 f′′ 或 f(4) 的界。
逐次分半法(Successive Halving)通过动态加密网格,并利用相邻两次计算结果的差进行事后误差估计,从而自适应地控制精度。
梯形逐次分半递推
设 Tn 已计算,现将所有小区间对半分,新增中点 xk+1/2=xk+2h。利用节点复用,T2n 可表示为:
T2n=21Tn+2hk=1∑nf(xk−1/2)
Simpson 逐次分半递推
类似地,S2n 的小区间对半分,分为 4n 等分,新增中点 xk+1/2=xk+2h。则其递推公式为:
S2n=21Sn+32hk=1∑2nf(xk−1/2)−3hk=1∑nf(x2k−1)
复化梯形的事后估计
复化梯形误差满足 R(f,Tn)≈ch2,其中 c 与 f′′ 相关。分半后:
R(f,T2n)≈c(2h)2=41R(f,Tn)
于是:
T2n−Tn=(I−R(f,T2n))−(I−R(f,Tn))≈3R(f,T2n)
即:
I−T2n≈3T2n−Tn
停止准则:若容许误差为 ε,当 ∣T2n−Tn∣<3ε 时,可终止计算并以 T2n 作为近似值。
复化 Simpson 的事后估计
同理,R(f,Sn)≈ch4,分半后 R(f,S2n)≈161R(f,Sn)。于是:
S2n−Sn≈15R(f,S2n)
即:
I−S2n≈15S2n−Sn
停止准则:当 ∣S2n−Sn∣<15ε 时停止。
算法实现
def adaptive_trapezoidal(f, a, b, eps=1e-10, max_iter=20):
"""
逐次分半梯形法
"""
n = 1
h = b - a
T_prev = h * (f(a) + f(b)) / 2.0 # T_1
for _ in range(max_iter):
# 计算新增中点函数值之和
mid_sum = sum(f(a + (k - 0.5) * h) for k in range(1, n + 1))
T_curr = 0.5 * T_prev + 0.5 * h * mid_sum # T_{2n}
if abs(T_curr - T_prev) < 3 * eps:
return T_curr
T_prev = T_curr
h /= 2.0
n *= 2
return T_prev
Richardson 外推法
一般原理
设真值 F∗ 的数值近似 F1(h) 满足误差展开:
F∗−F1(h)=a1hp1+a2hp2+⋯+akhpk+⋯,0<p1<p2<⋯
将步长缩为 qh(通常 q=1/2),有:
F∗−F1(qh)=a1(qh)p1+a2(qh)p2+⋯
两式线性组合消去首项 a1hp1:
(1−qp1)F∗−[F1(qh)−qp1F1(h)]=a2(qp2−qp1)hp2+⋯
定义外推值:
F2(h)=1−qp1F1(qh)−qp1F1(h)
则 F2(h) 逼近 F∗ 的误差阶提升至 O(hp2)。
递推定义:对 m=2,3,…,
Fm(h)=1−qpm−1Fm−1(qh)−qpm−1Fm−1(h)
Fm(h) 的误差阶为 O(hpm)。
注:
外推(extrapolation)与插值(interpolation)相对。
插值是在已知数据点之间估计函数值;外推则是利用已知步长上的计算值,向步长 h→0 的外推,以消去低阶误差项。
Romberg 求积
构造原理
Romberg 求积在复化梯形公式的基础上应用 Richardson 外推。关键在于复化梯形的误差展开仅含偶次幂:
R(f,Tn)=a2h2+a4h4+a6h6+⋯
这由 单区间误差的奇次幂结构 容易看出。
递推公式
记 T0(k)=T(h/2k) 为步长 h/2k 的复化梯形值(区间 2kn 等分)。应用 Richardson 外推:
Tm(k)=1−(1/2)2mTm−1(k+1)−(1/2)2mTm−1(k)=4m−14mTm−1(k+1)−Tm−1(k),k,m≥0
Tm(k) 的截断误差为 O(h2m+2)。
特殊情形:
- m=1:T1(k)=34T0(k+1)−T0(k),误差 O(h4)。
- m=2:T2(k)=1516T1(k+1)−T1(k),误差 O(h6)。
注:T1(k) 实际上就是复化 Simpson 公式在对应网格上的值。
T 表计算流程
Romberg 求积的计算过程呈下三角表格(T 表):
k=0k=1k=2k=3误差m=0(梯形)T0(0) 1thT0(1) 2ndT0(2) 4thT0(3) 7thO(h2)⟶↗⟶↗⟶↗m=1(Simpson)T1(0) 3rdT1(1) 5thT1(2) 8thO(h4)⟶↗⟶↗m=2(Cotes)T2(0) 6thT2(1) 9thO(h6)⟶↗m=3(Romberg)T3(0) 10thO(h8)
计算顺序:按列从左到右,在每一列中利用相邻两行的低阶值外推高阶值。第 0 列通过逐次分半梯形公式计算,后续各列纯为代数组合,无额外函数求值。
算法实现
def romberg(f, a, b, max_k=10, eps=1e-12):
"""
Romberg 求积算法。
T[k][m] 存储 T_m^{(k)},其中:
- 第 0 列 T[k][0] = T_0^{(k)} 为复化梯形(步长 h/2^k)
- 外推列按 T_m^{(k)} = (4^m * T_{m-1}^{(k+1)} - T_{m-1}^{(k)}) / (4^m - 1)
最高精度值位于 T[0][k]。
"""
T = [[0.0] * (max_k + 1) for _ in range(max_k + 1)]
# 初始梯形:T_0^{(0)},区间 1 等分
h = b - a
T[0][0] = h * (f(a) + f(b)) / 2.0
for k in range(1, max_k + 1):
# ---- 计算第 0 列:T_0^{(k)}(逐次分半梯形) ----
n = 2 ** k
h = (b - a) / n
mid_sum = sum(f(a + (i - 0.5) * h) for i in range(1, n + 1))
T[k][0] = 0.5 * T[k-1][0] + h * mid_sum
# ---- Richardson 外推,填充当前行可计算的所有列 ----
# 计算 T_m^{(k-m)},存储于 T[k-m][m]
for m in range(1, k + 1):
row = k - m
T[row][m] = (4**m * T[row+1][m-1] - T[row][m-1]) / (4**m - 1)
# 检查对角线元素 T[0][k] 的收敛性
if k >= 1 and abs(T[0][k] - T[0][k-1]) < eps:
return T[0][k]
return T[0][max_k]
复杂度与对比分析
| 方法 | 误差阶 | 自适应停止 | 光滑性要求 | 核心计算量 |
|---|
| 复化梯形 | O(h2) | N | C2 | n+1 次求值 |
| 复化 Simpson | O(h4) | N | C4 | 2n+1 次求值 |
| 逐次分半梯形 | O(h2) | Y | C2 | 动态增长,约 2k 次 |
| Romberg | O(h2m+2) | Y | C2m+2 | 同梯形,外推 O(m2) |
注:
-
Romberg 求积的性价比极高。
举例来说,达到 O(h8) 精度仅需第 0 列的 T0(0),…,T0(3) 共 1+2+4+8=15 个函数值,而直接复化 Simpson 要达到同等精度可能需要数百个节点。
-
然而,Romberg 要求 f 具有足够的高阶光滑性;若 f(2m+2) 不存在或过大,高阶外推可能失效,此时应退回低阶公式或逐次分半法。