自适应辛普森积分法的误差控制与递归实现
题目描述
自适应辛普森积分法是一种通过递归细分区间并自动控制误差的数值积分方法。给定函数 \(f(x)\) 在区间 \([a, b]\) 上的积分 \(I = \int_a^b f(x) \, dx\),要求以指定精度 \(\epsilon\) 近似计算其值。核心思想是:若当前区间用辛普森公式的近似结果与左右子区间辛普森公式之和的差值超过误差容限,则递归细分区间。
解题过程
- 辛普森公式回顾
在区间 \([a, b]\) 上,辛普森公式的近似积分为:
\[ S(a, b) = \frac{b - a}{6} \left[ f(a) + 4f\left( \frac{a + b}{2} \right) + f(b) \right]. \]
其代数精度为 3,即对不超过三次的多项式精确成立。
- 误差估计策略
将区间 \([a, b]\) 平均分为两个子区间 \([a, m]\) 和 \([m, b]\)(其中 \(m = \frac{a + b}{2}\)),分别应用辛普森公式后求和:
\[ S(a, m) + S(m, b) = \frac{b - a}{12} \left[ f(a) + 4f\left( \frac{a + m}{2} \right) + 2f(m) + 4f\left( \frac{m + b}{2} \right) + f(b) \right]. \]
定义整体近似值 \(S_1 = S(a, b)\),细分后近似值 \(S_2 = S(a, m) + S(m, b)\)。若满足:
\[ |S_1 - S_2| < 15 \epsilon, \]
则接受 \(S_2\) 作为该区间的积分值(其中 \(\epsilon\) 为用户指定的容差)。系数 15 源于误差分析的缩放关系(详见步骤 4)。
-
递归细分逻辑
- 计算 \(S_1\) 和 \(S_2\)。
- 若误差检验通过,返回 \(S_2 + \frac{S_2 - S_1}{15}\) 作为修正值(利用误差估计提升精度)。
- 否则,递归处理 \([a, m]\) 和 \([m, b]\) 两个子区间,并将结果相加。
-
误差系数 15 的推导
辛普森公式的截断误差为:
\[ E = -\frac{(b - a)^5}{2880} f^{(4)}(\xi), \quad \xi \in [a, b]. \]
假设 \(f^{(4)}(x)\) 在小区间上变化不大,则:
\[ S_1 - I \approx \alpha (b - a)^5, \quad S_2 - I \approx 2\alpha \left( \frac{b - a}{2} \right)^5 = \frac{\alpha}{16} (b - a)^5. \]
两式相减得:
\[ S_1 - S_2 \approx \left(1 - \frac{1}{16}\right) \alpha (b - a)^5 = 15 (S_2 - I). \]
因此,实际误差满足 \(|I - S_2| \approx \frac{1}{15} |S_1 - S_2|\)。在递归中,若要求 \(|I - S_2| < \epsilon\),只需控制 \(|S_1 - S_2| < 15\epsilon\)。
- 算法实现示例
注意:递归时容差减半(\(\epsilon/2\)),确保总误差受控;复用函数值避免重复计算。def adaptive_simpson(f, a, b, eps, whole=None): m = (a + b) / 2 if whole is None: whole = f(a) + 4*f(m) + f(b) left = f(a) + 4*f((a + m)/2) + f(m) right = f(m) + 4*f((m + b)/2) + f(b) S1 = (b - a) * whole / 6 S2 = (b - a) * (left + right) / 12 if abs(S1 - S2) < 15 * eps: return S2 + (S2 - S1) / 15 else: return adaptive_simpson(f, a, m, eps/2, left) + \ adaptive_simpson(f, m, b, eps/2, right)
关键点总结
- 通过比较不同细分层次的辛普森近似值来估计误差。
- 递归细分仅在误差超限时进行,避免不必要的计算。
- 误差系数 15 源于辛普森公式的误差阶分析,是自适应控制的核心。