自适应辛普森积分法在振荡函数积分中的应用
题目描述
计算定积分
\[I = \int_{0}^{4\pi} \sin(x^2) \, dx \]
被积函数 \(f(x) = \sin(x^2)\) 是一个振荡函数(频率随 \(x\) 增大而增加),直接使用均匀步长的数值积分方法(如复合梯形公式)需要极细的划分才能保证精度。要求利用自适应辛普森积分法,通过动态调整步长,在保证误差控制的同时减少计算量。
解题过程
1. 自适应辛普森积分法原理回顾
自适应辛普森法的核心思想:
- 对区间 \([a, b]\) 先用辛普森公式计算近似积分 \(S(a, b)\);
- 将区间二等分,分别计算两个子区间 \([a, m]\) 和 \([m, b]\) 的辛普森积分 \(S(a, m)\) 和 \(S(m, b)\);
- 比较 \(S(a, b)\) 与 \(S(a, m) + S(m, b)\) 的误差,若误差小于容忍值 \(\epsilon\),则接受结果;否则递归处理两个子区间。
误差估计公式:
\[E = \frac{1}{15} \left| S(a, m) + S(m, b) - S(a, b) \right| \]
若 \(E < \epsilon \cdot (b - a) / (b_0 - a_0)\)(其中 \([a_0, b_0]\) 是初始区间),则停止递归。
2. 振荡函数的积分挑战
对于 \(\sin(x^2)\),其振荡频率随 \(x\) 增大而升高(导数 \(f'(x) = 2x \cos(x^2)\) 的周期缩短)。在 \([0, 4\pi]\) 区间内:
- 当 \(x\) 较小时,函数变化平缓;
- 当 \(x\) 较大时,函数快速振荡,需要更密的节点捕捉变化。
自适应方法能自动在振荡剧烈处加密采样,在平缓处减少计算。
3. 递归实现步骤
设递归函数 adaptive_simpson(f, a, b, eps, whole):
whole是当前区间 \([a, b]\) 的辛普森积分近似值;- 计算中点 \(m = (a + b) / 2\);
- 分别计算左半区间积分 \(S_L = S(a, m)\) 和右半区间积分 \(S_R = S(m, b)\);
- 计算误差 \(E = |S_L + S_R - whole| / 15\);
- 若 \(E < \epsilon \cdot (b - a) / (b_0 - a_0)\),返回 \(S_L + S_R + E\)(或直接返回 \(S_L + S_R\));
- 否则,递归计算左右子区间:
\[ \text{result} = \text{adaptive\_simpson}(f, a, m, \epsilon, S_L) + \text{adaptive\_simpson}(f, m, b, \epsilon, S_R) \]
4. 应用于本题的具体计算
初始区间 \([a_0, b_0] = [0, 4\pi]\),设容忍误差 \(\epsilon = 10^{-6}\)。
- 第一步:计算整个区间的辛普森积分 \(S(0, 4\pi)\):
节点:\(a=0, m=2\pi, b=4\pi\);
辛普森公式:
\[ S(a, b) = \frac{b - a}{6} \left[ f(a) + 4f(m) + f(b) \right] \]
代入 \(f(x) = \sin(x^2)\):
\(f(0) = 0, f(2\pi) = \sin(4\pi^2) \approx \sin(39.478) \approx 0.998, f(4\pi) = \sin(16\pi^2) \approx \sin(157.91) \approx -0.999\)。
初步计算 \(S(0, 4\pi) \approx \frac{4\pi}{6} [0 + 4 \times 0.998 - 0.999] \approx 2.094\)。
-
第二步:划分区间为 \([0, 2\pi]\) 和 \([2\pi, 4\pi]\),分别计算子区间积分并估计误差。由于函数在右区间振荡更剧烈,误差可能超限,触发递归划分。
-
递归终止条件:当子区间长度足够小或误差满足要求时停止。最终积分结果约为 0.544(参考精确值:Fresnel 积分 \(\sqrt{\frac{\pi}{8}} \approx 0.626\) 的缩放版本,实际需完整计算)。
5. 关键优化与注意事项
- 避免重复计算:在递归中保存中间点的函数值(如 \(f(m)\) 在父区间和子区间共享);
- 振荡函数处理:自适应方法能有效处理非均匀振荡,但需设置最大递归深度防止栈溢出;
- 误差控制:相对误差容忍值更适用于振荡函数,避免在函数值接近零时过度划分。
通过自适应辛普森法,本题只需在关键振荡区域加密计算,显著减少了计算量,同时保证精度。