版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

仓库源文站点原文


title: 笔记 - Simpson法与自适应Simpson法 categories:


自适应 Simpson 法是一种基于 Simpson 法的数值积分算法

{% note warning %} https://cplib.tifa-233.com/src/code/math/simpson.hpp 存放了笔者对该算法/数据结构的最新实现, 建议前往此处查看相关代码 {% endnote %}

<!-- more -->

Simpson 法

Simpson 法是一种常见的数值积分算法, 其思想是用几段抛物线去拟合原曲线, 从而近似求出其面积

放一张从维基拿的图

其中 $f(x)$ 为原函数, $P(x)$ 为拟合函数

本篇内容如无特殊说明, 均有如下假定:

流程

  1. 对一段区间 $[a,b]$, 取其中点 $m=\frac{a+b}{2}$
  2. 设 $P(x)=Ax^2+Bx+C$
  3. 令 $P(a)=f(a), P(m)=f(m), P(b)=f(b)$, 显然我们可以解出 $A,B,C$

    实际上, 我们有

    $$ P(x)=f(a)\frac{(x-m)(x-b)}{(a-m)(a-b)}+f(m)\frac{(x-a)(x-b)}{(m-a)(m-b)}+f(b)\frac{(x-a)(x-m)}{(b-a)(b-m)} $$

  4. 此时便可假定

    $$ \int_a^bf(x)\mathrm{d}x\approx\int_a^bP(x)\mathrm{d}x=\frac{b-a}{6}(f(a)+4f(m)+f(b)) $$

    令 $h=\frac{b-a}{2}$, 则有

    $$ \int_a^bf(x)\approx\frac{h}{3}(f(a)+4f(m)+f(b)) $$

Q&A

复化 Simpson 法

就是把 $[a,b]$ 拆成多个等长小区间, 每个区间应用 Simpson 法后拼合在一起

放一张从维基拿的动图

这张动图展示了多次细分应用复化 Simpson 法的拟合效果

流程

然后就有

$$ \inta^bf(x)\mathrm{d}x\approx\frac{h}{3}\sum{i=1}^\frac{n}{2}(f{2i-2}+4f{2i-1}+f_{2i}) $$

误差为 $-\frac{h^4}{180}(b-a)f^{(4)}(\xi)$, $\xi\in[a,b]$

自适应 Simpson 法

复化 Simpson 法是把 $[a,b]$ 拆成多个等长小区间, 然而在多数情况下, 有一些拆分是没有必要的. 比如如果 $f(x)$ 在 $[xi,x{i+2}]\in[a,b]$ 上已经能够得到较好的拟合效果了, 我们就没必要继续细分成 $[xi,x{i+1}]$ 和 $[x{i+1},x{i+2}]$ 了

自适应 Simpson 法就能根据函数性质来判断是否要继续细分, 所以其要比复化 Simpson 法快

流程

  1. 取中点 $m=\frac{a+b}{2}$
  2. 分别对区间 $[a,b]$, $[a,m]$, $[m,b]$ 应用 Simpson 法, 设得到的面积分别为 $S$, $S_l$, $S_r$
  3. 若 $S$ 与 $S_l+S_r$ 足够接近, 则认为区间 $[a,b]$ 面积的近似值已经求得, 否则分别对区间 $[a,m]$, $[m,b]$ 递归应用本操作

Q&A

代码

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb blog lang:cpp asr/asr.cpp %} </details>

例题


参考