自适应辛普森积分法
题目描述
计算定积分 \(I = \int_{a}^{b} f(x) \, dx\) 的数值近似值,其中被积函数 \(f(x)\) 在区间 \([a, b]\) 上连续但可能变化剧烈(如存在陡峭变化区域)。要求设计一种自适应算法,根据函数局部的变化程度动态调整步长,在保证精度的同时减少计算量。
解题过程
1. 基础工具:辛普森公式
首先回顾辛普森公式(1/3法则):将区间 \([a, b]\) 等分为2个子区间(3个节点),积分近似值为:
\[S(a, b) = \frac{b - a}{6} \left[ f(a) + 4f\left(\frac{a+b}{2}\right) + f(b) \right] \]
该公式对次数不超过3的多项式精确成立。
2. 自适应策略的核心思想
若直接在整个区间上使用固定步长的复合辛普森公式,可能因局部变化大而导致误差分布不均。自适应方法的核心:
- 将区间二分,分别计算左右半区的辛普森值 \(S(a, m)\) 和 \(S(m, b)\)(其中 \(m = \frac{a+b}{2}\))。
- 若整体区间 \([a, b]\) 的辛普森值 \(S(a, b)\) 与左右半区之和 \(S(a, m) + S(m, b)\) 的差值满足精度要求,则接受该结果;否则递归处理左右半区。
3. 误差估计与递归条件
设 \(m = \frac{a+b}{2}\),定义:
- \(S_1 = S(a, b)\)(整体区间辛普森值)
- \(S_2 = S(a, m) + S(m, b)\)(二分后两个半区的辛普森值之和)
误差估计值:
\[E = |S_1 - S_2| \]
若 \(E < \varepsilon\)(\(\varepsilon\) 为用户指定的误差容忍值),则接受 \(S_2\) 作为积分近似值;否则分别对 \([a, m]\) 和 \([m, b]\) 递归应用相同判断。
4. 算法步骤(伪代码)
定义函数 adaptive_simpson(f, a, b, ε):
m = (a + b) / 2
S1 = simpson(f, a, b) # 整体区间辛普森值
S2 = simpson(f, a, m) + simpson(f, m, b) # 二分后求和
if |S1 - S2| ≤ 15ε: # 注:15倍ε的推导见后续说明
返回 S2 + (S2 - S1)/15 # 误差修正
else:
返回 adaptive_simpson(f, a, m, ε/2) + adaptive_simpson(f, m, b, ε/2)
其中 simpson(f, a, b) 是计算 \(S(a, b)\) 的函数。
5. 关键细节:误差修正与15倍ε的由来
- 理论分析表明,辛普森公式的误差项与区间长度的5次方成正比,即:
\[ I - S_1 \approx k (b-a)^5, \quad I - S_2 \approx 2k \left(\frac{b-a}{2}\right)^5 = \frac{k(b-a)^5}{16} \]
- 两式相减得:
\[ S_2 - S_1 \approx \frac{15}{16} k (b-a)^5 \implies I - S_2 \approx \frac{S_2 - S_1}{15} \]
- 因此修正公式为 \(I \approx S_2 + \frac{S_2 - S_1}{15}\),且递归条件中的阈值设为 \(15\varepsilon\) 以保证整体误差控制在 \(\varepsilon\) 内。
6. 示例演示
计算 \(I = \int_{0}^{1} \sqrt{x} \, dx\)(真值 \(\frac{2}{3}\)),设 \(\varepsilon = 10^{-4}\):
- 第一层:\(S_1 \approx 0.638071\), \(S_2 \approx 0.656526\), \(E \approx 0.018455 > 15\varepsilon\) → 递归二分。
- 左半区 \([0, 0.5]\) 继续递归(因 \(\sqrt{x}\) 在0附近变化剧烈),右半区 \([0.5, 1]\) 可能直接满足精度。
- 递归至子区间长度足够小或误差达标后终止,最终结果接近 \(0.666666\)。
7. 总结
自适应辛普森法通过局部误差估计动态分配计算资源,特别适合处理变化剧烈的函数。其核心是二分递归与误差修正,兼顾了精度和效率。