自适应积分(Adaptive Simpson):基于辛普森公式与误差估计,按区间局部复杂度自适应细分,实现对 ∫_a^b f(x) dx 的自动精度控制。通常较固定步长更高效与稳健。
Description: Adaptive Simpson integration with automatic error control using recursive subdivision and Simpson error estimate. Time: Data-dependent; typically near O(n) evals for smooth f, worst-case large Status: tested
-
函数/接口(据实现)
- double simpson_once(double a, double b, double fa, double fm, double fb)
- 单次辛普森:S = (b−a)/6 · (fa + 4·fm + fb),其中 m=(a+b)/2。
- double adaptiveSimpson(double a, double b, double eps, auto f, int maxDepth=20)
- 返回 ∫_a^b f(x) dx 的近似值,绝对误差控制在 eps 左右;若达到最大深度则返回当前估计。
- 常用包装 integrate(f, a, b, eps):内部缓存 f 在端点与中点的值,避免重复计算。
- double simpson_once(double a, double b, double fa, double fm, double fb)
-
核心算法(递归 ASR)
- 记 m=(a+b)/2,l=(a+m)/2,r=(m+b)/2;已知 fa=f(a), fm=f(m), fb=f(b)。
- 计算:
- S = Simpson(a,b,fa,fm,fb)
- Sl = Simpson(a,m,fa,f(l),fm)
- Sr = Simpson(m,b,fm,f(r),fb)
- err ≈ |Sl + Sr − S|
- 判定:
- 若 err ≤ 15·eps,则返回 Sl + Sr + (Sl + Sr − S)/15(Richardson 外推修正)。
- 否则对 [a,m] 与 [m,b] 递归,分别用 eps/2,并将结果相加。
- 终止:达到 maxDepth 时返回 Sl + Sr(或直接 S,视实现)。
-
误差与稳定性
- 误差估计基于辛普森局部误差的 15 倍关系;(Sl+Sr−S)/15 作为误差补偿项。
- 对剧烈振荡或奇异点,递归会在问题区域细分更多层次;必要时拆分区间或变量代换。
- 浮点稳定:累加使用 Kahan 或排序累加可减小损失;对非常大的区间可先线性缩放。
-
复杂度
- 与函数复杂度相关;平滑区域较少细分,评估次数远小于均匀网格。
- 最坏情形(处处尖峰/强振荡)可能接近遍历细分到 maxDepth。
-
实用建议
- 选择 eps 为目标绝对误差;需要相对误差时可按 |I| 自适应设 eps = rel · (|S|+1)。
- 对不定/广义积分(无界区间或端点奇异)先做变换:如 x=t/(1−t) 将 [0,∞) 映到 [0,1)。
- 并行化:粗粒度上可并行两个子区间,但要注意函数评估缓存共享与栈深限制。