张瑞
中国科学技术大学数学科学学院
rui@ustc.edu.cn
由于Runge现象,在节点很多的时候,我们也只能使用分段的方法来处理积分。
这种积分称为复化积分 (Composite Quadrature Formulas)。
复化梯形公式
把积分区间分为多个小区间,在每个区间$[x_i,x_{i+1}]$ 上使用梯形公式,再将所有小区间上的数值积分值累加起来。
这样得到的公式称为复化梯形公式 。
在等距节点 条件下,取$h=\frac{b-a}n$ ,
\[x_i=a+ih, \quad i=0,1,\cdots,n
\]
则在小区间$[x_i, x_{i+1}]$ 上,有梯形积分
\[\int_{x_i}^{x_{i+1}}f(x)dx=\frac{h}2(f(x_i)+f(x_{i+1}))-\frac{h^3}{12}f''(\xi_i)
\]
将所有区间的积分叠加
\[\begin{aligned}
I(f)&=\int_a^bf(x)dx=\sum_{i=0}^{n-1}\int_{x_i}^{x_{i+1}}f(x)dx \\
&=\sum_{i=0}^{n-1}\frac{h}2(f(x_i)+f(x_{i+1}))-\sum_{i=0}^{n-1}\frac{h^3}{12}f''(\xi_i) \\
&=h\left(\frac12f(a)+\sum_{i=1}^{n-1}f(x_i)+\frac12f(b)\right)-\sum_{i=0}^{n-1}\frac{h^3}{12}f''(\xi_i)
\end{aligned}
\]
这样,可以得到等距节点 下的复化梯形公式
\[T_n(f)=h\left(\frac12f(a)+\sum_{i=1}^{n-1}f(x_i)+\frac12f(b)\right)
\]
当$f\in C^2[a,b]$ ,公式的误差为
\[R=-\sum_{i=0}^{n-1}\frac{h^3}{12}f''(\xi_i)=-n\frac{h^3}{12}f''(\xi)
=-h^2\frac{(b-a)}{12}f''(\xi)
\]
注 .
可以看到,复化梯形公式是收敛 的。即$\displaystyle\lim_{h\to0}R=0$
例 1 . 函数$f(x)=\frac4{1+x^2}$ 在一些节点处的函数值如表
$x_i$ 0 0.1 0.2 0.4 0.6 0.8 1
$f(x_i)$ 4 3.96 3.846 3.448 2.94 2.439 2
解 . 注意到数据中,节点的距离是不同的。
在每个区间上使用梯形积分公式, 并且相加。
\[\begin{aligned}
I=&\frac{0.1}2(f(0)+f(0.1))+\frac{0.1}2(f(0.1)+f(0.2)) \\
&+\frac{0.2}2(f(0.2)+f(0.4))+\frac{0.2}2(f(0.4)+f(0.6)) \\
&+\frac{0.2}2(f(0.6)+f(0.8))+\frac{0.2}2(f(0.8)+f(1))
\end{aligned}
\]
3.1386580254636933
复化Simpson积分
类似地,每2个区间使用Simpson积分,可以得到复化Simpson积分 公式。
令$h=\frac{b-a}n$ ,其中$n=2m$ 为偶数,取等距节点。
在区间$[x_{2i},x_{2i+2}]$ 中使用Simpson积分公式
\[\begin{aligned}
\int_{x_{2i}}^{x_{2i+2}}f(x)dx=&\frac{2h}6(f(x_{2i})+4f(x_{2i+1})+f(x_{2i+2})) \\
&-\frac{(2h)^5}{2880}f^{(4)}(\xi_i)
\end{aligned}
\]
将所有区间的积分叠加
\[\begin{aligned}
\int_a^bf(x)dx=&\sum_{i=0}^m\int_{x_{2i}}^{x_{2i+2}}f(x)dx \\
=&\sum_{i=0}^m\frac{2h}6(f(x_{2i})+4f(x_{2i+1})+f(x_{2i+2}))\\
&-\sum_{i=0}^m\frac{(2h)^5}{2880}f^{(4)}(\xi_i)
\end{aligned}
\]
可以得到等距节点 下的复化Simpson公式
\[S_m(f)=\frac{h}3\left(f(a)+4\sum_{i=0}^{m-1}f(x_{2i+1})+2\sum_{i=1}^{m-1}f(x_{2i})+f(b)\right)
\]
当$f\in C^4[a,b]$ 时,误差为
\[\begin{aligned}
R&=-\sum_{i=0}^m\frac{(2h)^5}{2880}f^{(4)}(\xi_i)=-m\frac{(2h)^5}{2880}f^{(4)}(\xi) \\
&=-{\color{red}{h^4}}\frac{b-a}{180}f^{(4)}(\xi)
\end{aligned}
\]
定义 1 .
若一个积分公式的误差满足
\[\lim_{h\to0}\frac{R}{h^p}=C, C\neq 0
\]
则称该公式是p阶收敛 的。
例 2 . 函数$f(x)=\frac4{1+x^2}$ 在一些节点处的函数值如表
$x_i$ 0 0.1 0.2 0.4 0.6 0.8 1
$f(x_i)$ 4 3.96 3.846 3.448 2.94 2.439 2
解 . 注意到数据中,节点的距离是不同的。
在每2个区间上使用Simpson积分公式, 并且相加。
\[\begin{aligned}
I=&\frac{0.2}6(f(0)+4f(0.1)+f(0.2)) \\
&+\frac{0.4}6(f(0.2)+4f(0.4)+f(0.6)) \\
&+\frac{0.4}6(f(0.6)+4f(0.8)+f(1))
\end{aligned}
\]
3.1414384532577757
例 3 . 计算$\pi=\int_0^1\frac{4}{1+x^2}dx$
解 . 区间$[0,1]$ 等分为8个,有节点$x_k=\frac{k}8$ 。
复化梯形公式
\[T_8(f)=\frac18\left(\frac12f(0)+\sum_{k=1}^7f(x_k)+\frac12f(1)\right)=3.1{\color{red}{38988494}}
\]
复化Simpson公式
\[\begin{aligned}
S_4(f)&=\frac18\frac13\left(f(0)+4\sum_{odd}f(x_k)+2\sum_{even}f(x_k)+f(1)\right) \\
&=3.141592{\color{red}{502}}
\end{aligned}
\]
复化梯形公式计算结果如下
n Result Error Order
8 3.1389884944910893 0.0026041590987038177 3.999825896483118
16 3.140941612041389 0.0006510415484042298 3.9999891022114964
32 3.1414298931749745 0.00016276041481866343 3.9999993188121077
64 3.1415519634856555 4.069010413765284e-05 3.999999957435648
128 3.141582481063752 1.0172526041074548e-05 3.9999999973806553
256 3.141590110458283 2.543131510268637e-06 4.0
512 3.141592017806916 6.357828770120477e-07 4.00000000349246
复化Simpson公式计算结果如下
n Result Error Order
8 3.141592502458707 1.5113108631226169e-07 158.97549206717156
16 3.1415926512248222 2.3649708857931273e-09 63.903994429757084
32 3.1415926535528365 3.695665995451236e-11 63.993090520193704
64 3.141592653589216 5.773159728050814e-13 64.01461538461538
128 3.1415926535897842 8.881784197001252e-15 65.0
程序作业-复化积分
分别编写用复化Simpson积分公式和复化梯形积分公式计算积分的通用程序
用如上程序计算积分
\[I(f)=\int_1^5\sin(x)dx
\]
取等距节点$x_i=1+i\times\frac{4}{2^N}$ ,$N$ 取$1,2,\cdots,12$
计算误差,同时给出误差阶
输出结果:
复化梯形公式
N=1, 误差 0.0008560379230928561
N=2,误差 0.00021390241995433712 阶: 2.0020020
...
复化Simpson公式
N=1, 误差 -2.2921544006182515e-06
N=2,误差 -1.4274775839151488e-07 阶: 4.0572407
...
若公式的误差表达式为$E=O(h^p)$ ,则步长为$h$ 时,误差为
步长为$\frac{h}2$ 时,误差为
\[E_2=C_2\left(\frac{h}2\right)^p
\]
近似地认为$C_1\approx C_2$ ,则有$\frac{E_1}{E_2} \approx 2^p$
因此,误差阶
\[p\approx \frac{\ln(|\frac{E_1}{E_2}|)}{\ln2}
\]
问题 . 给定积分$\displaystyle\int_a^b f(x)dx$ 有误差控制$\epsilon$ ,
如何得到合适的步长$h$ ,使得计算量足够小且满足误差控制?
事后误差估计
对于复化梯形公式,有
\[I(f)-T_n(f)=-h^2\frac{(b-a)}{12}f''(\xi)
\]
加密一倍网络后
\[I(f)-T_{2n}(f)=-(\frac{h}2)^2\frac{(b-a)}{12}f''(\xi_2)
\]
假定$f''(\xi)\approx f''(\xi_2)$ ,则有
\[\frac{I(f)-T_{n}(f)}{I(f)-T_{2n}(f)}\approx 2^2
\]
由
\[{I(f)-T_{n}(f)}\approx 2^2({I(f)-T_{2n}(f)})
\]
\[-T_{n}(f)\approx (2^2-1)I(f)-2^2T_{2n}(f)
\]
\[\begin{aligned}
T_{2n}(f)-T_{n}(f)\approx& (2^2-1)I(f)-(2^2-1)T_{2n}(f) \\
=&(2^2-1)[I(f)-T_{2n}(f)]
\end{aligned}
\]
可得
\[I(f)-T_{2n}(f)\approx\frac1{2^2-1}(T_{2n}(f)-T_{n}(f))
\]
对于复化Simpson公式
\[I(f)-S_{n}(f)\approx 2^4(I(f)-S_{2n}(f))
\]
则有
\[\begin{aligned}
S_{2n}(f)-S_{n}(f)\approx& (2^4-1)I(f)-(2^4-1)S_{2n}(f) \\
=&(2^4-1)[I(f)-S_{2n}(f)]
\end{aligned}
\]
整理后,可以得到复化梯形公式 的事后误差估计 公式
\[I(f)-T_{2n}(f)\approx\frac1{2^2-1}(T_{2n}(f)-T_{n}(f))
\]
同样,可以得到复化Simpson公式 的事后误差估计 公式
\[I(f)-S_{2n}(f)\approx\frac1{2^4-1}(S_{2n}(f)-S_{n}(f))
\]
Romberg积分
利用Richardson外推 ,把事后误差公式加到近似计算公式上,则有
\[T_{2n}(f)+\frac13(T_{2n}(f)-T_n(f))=S_n(f)
\]
可以看到,复化梯形公式经过处理后,变成了复化Simpson公式,公式的精度也从原来的$O(h^2)$ 变为了$O(h^4)$ 。
类似地,对复化Simpson做同样的操作,有
\[S_{2n}(f)+\frac1{15}(S_{2n}(f)-S_n(f))=C_n(f)
\]
公式的精度由原来的$O(h^4)$ 变为了$O(h^6)$ 。
定理 1 . (Euler-MacLaurin定理 )
若积分公式$I^{(m)}$ 是$2m$ 阶公式$I(f)=I^{(m)}(h)+O(h^{2m})$ ,则公式
\[I^{(m+1)}(\frac{h}2)=I^{m}(\frac{h}2)+\frac{I^{(m)}(\frac{h}2)-I^{(m)}(h)}{2^{2m}-1}
\]
为$2m+2$ 阶公式,即有$I(f)=I^{(m+1)}(h)+O(h^{2m+2})$
注 .
复化公式,经过Richardson外推操作,精度每次递增2阶
用$R^{(k)}$ 来表示数值积分公式。$k=1,2,3,\cdots$ 分别表示得化梯形公式,复化Simpson公式,复化Cotes公式等。
下标$R^{(k)}_j$ 表示积分点的密度。如$R^{(1)}_0$ 表示在最初积分点上的复化梯形公式的计算结果,$R^{(0)}_1$ 表示加密一倍积分点后,复化梯形公式得到的结果,$R^{(0)}_2$ 表示再加密一倍积分点得到的结果。
定义 2 .
不断地组合低阶公式为高阶公式的Romberg积分公式 为
\[\displaystyle R^{(k)}_j=R^{(k-1)}_j+\frac{R^{(k-1)}_j-R^{(k-1)}_{j-1}}{2^{2k-2}-1}
\]
例 4 . 用Romberg积分计算$I=\int_0^1\frac{4}{1+x^2}dx$
解 . 解:
$T_1=\frac12(f(0)+f(1))=3$
$T_2=\frac12T_1+\frac12f(\frac12)=3.1$ , $S_1=\frac{4T_2-T_1}{2^2-1}=3.133333$
$T_4=\frac12T_2+\frac14(f(\frac14)+f(\frac34))=3.131176$ , $S_2=\frac{4T_4-T_2}{2^2-1}=3.14156863$ ,
$C_1=\frac{16S_2-S_1}{2^4-1}=3.14211765$
$T_8=\frac12T_4+\frac18(f(\frac18)+f(\frac38)+f(\frac58)+f(\frac78))=3.138988$ ,
$S_4=\frac{4T_8-T_4}{2^2-1}=3.1415925$ ,
$C_2=\frac{16S_4-S_2}{2^4-1}=3.141594$ ,
$R_1=\frac{64C_2-C_2}{2^6-1}=3.141586$
$T_{16}=3.140942$ , $S_8=3.14159265$ , $C_4=3.14159266$ , $R_2=3.14159264$ , $3.14159267$
$T_{32}=3.141430$ , $S_{16}=3.14159265$ , $C_8=3.141593$ , $R_4=3.141593$ , $3.14159265$ , $3.14159265$
梯形积分 Simpson积分 Cote 积分
$n=1$ 3
$n=2$ 3.1 3.133333
$n=4$ 3.131176 3.141569 3.142118
$n=8$ 3.138988 3.141593 3.141594 3.141586
$n={16}$ 3.140942 3.141593 3.141593 3.141593 3.141593
$n={32}$ 3.141430 3.141593 3.141593 3.141593 3.141593 3.141593
积分的自适应计算
函数变化有急有缓,为了照顾变化剧烈部分的误差,我们需要加密格点。对于变化缓慢的部分,加密格点会造成计算的浪费。
问题 . 可不可以自动在变化剧烈的地方加密格点计算,而变化缓慢的地方,则取稀疏的格点计算?
基本思路: 对于需要计算的误差阀值eps
计算当前网格上的Simpson积分,得到结果v1。
加密一倍网格后,计算得到结果v2。
利用事后误差估计公式,由v1和v2得到误差的估计e。
如果e < eps,则返回结果。
否则,将区间对分为2部分,要求每一部分的误差不超过eps/2
算法
def recursive_asr(f,a,b,eps,simpson_quad):
"Recursive implementation of adaptive Simpson's rule."
c = (a+b) / 2.0
left = simpsons_rule(f,a,c)
right = simpsons_rule(f,c,b)
if abs(left + right - simpson_quad) <= 15*eps:
return left + right + (left + right - simpson_quad)/15.0
return recursive_asr(f,a,c,eps/2.0,left) + recursive_asr(f,c,b,eps/2.0,right)
例 5 . 用自适应Simpson积分,求
\[\int_0^4 13x(1-x)e^{-\frac32x}dx
\]