9 数值积分
9 数值积分
9.1 引言
在数学分析中,最基本的方法便是Newton-Leibniz公式
然而这种方法对于原函数难以求出的函数(或者根本没有初等函数形式的原函数)来说,计算其积分值过于困难。在实际应用中,我们并不需要精确求出定积分的值,而是要求计算误差小于事先给定的范围即可。
积分数值算法的基本思想是,找到被积函数\(f(x)\)的一个逼近函数\(p(x)\),即\(f(x)=p(x)+r(x)\),其中\(r(x)\)是误差函数。如果逼近函数的积分容易求解,那么就可以用逼近函数的积分值来近似原始被积函数的积分值。
回想黎曼积分的定义求\(\int_a^bf(x)dx\):
-
分割:\(a=x_0<x_1<\cdots<x_n=b\)。
-
近似:\(\Delta{s_i}=f(\xi_i)\Delta{x_i},\Delta{x_i}=x_i-x_{i-1}\)。
-
求和:\(S_n=\sum_{i=0}^n\Delta{s_i}\)。
-
求极限:\(||\Delta x||=\max\{\Delta{x_i}\}\)
\[\int_a^bf(x)dx=\lim_{||\Delta{x}||\rightarrow0}S_n=\lim_{||\Delta{x}||\rightarrow0} \sum_{i=1}^nf(\xi_i)\Delta{x_i} \]
类比上述求积分的过程,想到机械求积公式
其中\(A_i\)称为权系数,\(\sum_{i=0}^nA_if(x_i)\)是\(f(x_i)\)的加权和,也是积分的近似值。\(R(f)\)则称为求积余项。
我们最初的目的就是寻找\(f(x)\)的一个近似函数\(p(x)\),从而使得
如果我们将\(p(x)\)取为拉格朗日插值多项式,那么可以得到
对比机械求积公式,我们令
我们称\(x_0,x_1,\cdots,x_n\)为求积节点,\(A_i\)为求积系数,可以发现如果用拉格朗日插值多项式来近似替代\(f(x)\),那么此时求积系数\(A_i\)仅与求积节点相关,而与被积函数\(f(x)\)本身无关。
为了衡量求积公式(9-1-1)的精确程度,于是引入了代数精度,定义如下。
定义 如果求积公式(9-1-1)对于次数不超过\(m\)的多项式\(p_m(x)\)都能够准确成立,即\(R(p_m)=0\)。而至少对于一个\(m+1\)次多项式不能准确成立,则称求积公式(9-1-1)具有\(m\)次代数精度。
事实上,我们只要能够验证\(R(x^k)=0(k=0,1,\cdots,m)\)成立,而\(R(x^{m+1})\ne0\)就能够确定求积公式的代数精度为\(m\)。这是因为根据结合积分运算的性质可以得到
又因为如果我们已知\(R(x^k)=0(k=0,1,\cdots,m)\)均成立,于是\(\int_a^bx^kdx\)可以由求积公式精确表达,从而求积公式对于任意次数不超过\(m\)的多项式都可以精确成立。
9.2 牛顿-柯特斯(Newton-Cotes)公式
将积分区间\([a,b]\)分成\(n\)等分,步长为\(h=(b-a)/n\),那么求积节点为
做\(n\)次拉格朗日插值多项式作为\(f(x)\)的近似函数
于是等距求积公式(我们将求积公式记为\(Q(f)\))为
其中求积系数为
为了求得求积系数的具体表达式,引入变换\(x=a+th\),那么
其中
我们称\(C_n^{(k)}\)为牛顿-柯特斯系数,可以发现\(C_n^{(k)}\)只和等分区间的个数相关,而与具体的区间位置和函数值无关,因此,我们可以事先求出牛顿-柯特斯系数制成一张表,等需要的时候就可以直接查表。有了\(C_n^{(k)}\)可以将求积公式改写为
我们将式(9-2-1)称为牛顿-柯特斯公式。
牛顿-柯特斯系数的性质:
可以验证对于任意\(n\ge1\),当\(x\in[a,b]\)时,均有\(f(x)=1\)。那么\(Q(f)=\int_a^bf(x)dx\)是严格成立的,所以
于是
类似于牛顿二项式展开式的系数,牛顿-柯特斯系数也有:\(C_n^{(k)}=C_n^{(n-k)}\),证明如下
引入变换\(x=n-t\),可以得到
常用的牛顿-柯特斯系数表如下:
求积余项:
根据拉格朗日插值余项可知
需要注意的这里的\(\xi\)实际上是和\(x\)相关的一个变量。
一种粗略的误差估计方式便是
其中\(M=\max_{a\le x\le b}|f^{(n+1)}(x)|\)。
事实上,更准确的求积余项为
其中\(\xi\in[a,b]\)。
根据上述求积余项可知,具有\(n+1\)个求积节点的牛顿-柯特斯公式至少有\(n\)次代数精度。并且当\(n\)是偶数的时候,求积公式具有\(n+1\)次代数精度。
梯形公式:
当\(n=1\)的时候,称为梯形公式:
其几何意义就是用梯形面积代替曲边梯形的面积。
余项公式为
辛普森公式:
当\(n=2\)的时候,称为辛普森(Simpson)公式:
其几何意义就是用抛物线围成的曲边梯形面积代替\(f(x)\)围成的曲边梯形的面积。
其余项公式为
辛普森3/8公式:
当\(n=3\)的时候,称为辛普森3/8公式
其中\(h=(b-a)/3\)。
柯特斯公式:
当\(n=4\)的时候,称为柯特斯公式:
其中\(h=(b-a)/4\)。
牛顿-柯特斯公式的数值稳定性:
假设计算\(f(x_k)\)的舍入误差为\(\varepsilon_k\),且计算\(C_n^{(k)}\)时没有误差,那么计算\((b-a)\sum_kC_n^{(k)}f(x_k)\)产生的误差为
因此
其中\(\varepsilon=\max|\varepsilon_k|\)。
当牛顿-柯特斯系数都是正数时,可以得到\(|\eta_n|\le(b-a)\varepsilon\),此时误差增长是线性的。从而当牛顿-柯特斯系数恒为正数时,求积公式是数值稳定的。
当牛顿-柯特斯系数出现负数的时候,\(\sum_{k=0}^n|C_n^{(k)}|\)会随着\(n\)的增加而增加,从而舍入误差会随着\(n\)的增加而增加。从牛顿-柯特斯系数表可以看到当\(n\ge8\)的时候,出现了负的系数,因此当\(n\ge8\)的时候,牛顿-柯特斯公式是不使用的。
9.3 复化求积公式
根据梯形、辛普森、柯特斯求积余项可知,随着求积节点的点数增多,对应公式的精度也会提高。但当\(n\ge8\)的时候,牛顿-柯特斯系数出现负值。根据之前误差分析,当积分公式出现负系数时,可能导致舍入误差增大,并且难以估计。因此不能通过增加求积节点的个数来增加精度,在实际应用中常把积分区间分成若干个,然后在每个小区间上应用低阶求积公式,最后求和得到整个区间上的求积公式。这就是复化求积公式的基本思想。
复化求积公式克服了高次牛顿-柯特斯公式数值不稳定性,并且运算简单容易编程实现。常用的复化求积公式是复化梯形公式和复化抛物线公式。
复化梯形公式:
将区间\([a,b]\)划分成n等分,其中求积节点为\(x_k=a+kh,k=0,1,\cdots,n\),步长\(h=(b-a)/n\)。然后在每一个小区间上应用梯形公式,最后累加起来,即
在区间\([x_k,x_{k+1}]\)区间上的余项为
复化梯形公式的余项为
其中\(\xi\in[a,b]\)。上述式子之所以成立,是因为
其中\(m=\min_k f''(\xi_k),M=\max_kf''(\xi_k)\)。若\(f''(x)\)在\([a,b]\)上是连续的,那么肯定存在一个\(\xi\in[a,b]\)使得
复化辛普森公式:
将积分区间\([a,b]\)进行\(2n\)等分,每个小区间的长度为\(h=(b-a)/(2n)\),在\([x_{2k-2},x_{2k}]\)上应用辛普森公式,那么
复化辛普森公式的余项为
9.4 外推法
理查森(Richarson)外推法:
在数值计算中,常用一个序列\(f_1,f_2,\cdots\)去逼近一个\(f^*\),并在理论上估计余项(误差)。一个有趣的问题是能够在误差估计的基础之上,从已有的序列\(f_1,f_2,\cdots\)产生一个新的序列\(\{f_i^{(1)}\}\)能够比\(\{f_i\}\)更快收敛到\(f^*\)。这就是数值计算中的外推法,这时加速收敛的一个重要技巧。
假设有一个待求量\(F^*\),使用一个步长\(h\)的函数\(F_1(h)\)去逼近\(F^*\),并且\(F^*\)和\(h\)无关。当\(h\rightarrow0\)时,\(F_1(h)\rightarrow F^*\),并且\(F_1(h)\)逼近\(F^*\)的截断误差的估计式为:
其中\(0<P_1<P_2<\cdots<P_n<\cdots,a_i^{(1)}(i=1,2,\cdots)\)都是与\(h\)无关的常数。
上述式子说明\(F_1(h)\)逼近\(F^*\)的阶是\(h^{P_1}\),我们的目标就是通过\(F_1(h)\)构造出一个新的序列,这个新的序列逼近\(F^*\)的阶比\(h^{P_1}\)更高,比如\(h^{P_2}\)。
构造方法如下,其中\(q\ne0\),那么
用等式(9-4-1)两侧乘以\(q^{P_1}\),然后减去式(9-4-2),即
于是
其中
令
根据上述推导出来的余项可知,\(F_2(h)\)逼近\(F^*\)的误差为\(h^{P_2}\)。
依据上面的推导方法,我们最终可以构造出
可以知道\(F_m(h)\)逼近\(F^*\)的阶是\(h^{P_m}\)。这种方法称为理查森外推法。
龙贝格(Romberg)算法:
龙贝格算法是以复化梯形公式为基础,然后应用理查森外推法得到的算法。在数学上已经证明复化梯形公式\(T_1(h)\)和定积分\(I=\int_a^bf(x)dx\)之间的误差余项可以表示为
其中\(h\)是每个小区间的长度,\(a_k\)是与\(h\)无关的系数。
使用一次外推法,取\(q=1/2\),可以得到
于是
可以发现此时\(T_2(h)\)的误差的阶从\(O(h^2)\)变成了\(O(h^4)\)。事实上,如果利用复化梯形公式计算\(T_1(h)\)和\(T_1(h/2)\)之后,可以验证\(T_2(h)\)实际上就是复化辛普森公式。
重复上述过程就可以得到
并且\(I-T_m(h)=a_{2m}^{(m)}h^{2m}+O(h^{2m})\)。
可以发现上述龙贝格求积算法就是每次将区间缩小一半,因此上述算法也称为逐次分半加速收敛法。
在龙贝格求积算法中,我们将复化梯形公式表示为
其中\((b-a)/2^j\)是每一个区间的长度,相当于将\([a,b]\)区间划分成了\(2^j\)个小区间。
使用\(k\)表示外推指标,即
可以将整个计算过程列表示意:
求积过程可以被表述为:
- 初始化参数:\(k=2,\varepsilon,T_1^{(0)}\)。
- 计算\(T_1^{(k-1)}\)。
- 依次计算:\(T_{2}^{(k-2)},T_3^{(k-3)},\cdots,T_k^{(0)}\)。
- 如果\(|T_k^{(0)}-T_{k-1}^{(0)}|<\varepsilon\),则返回\(T_k^{(0)}\)。否则,执行下一步。
- \(k=k+1\),返回2继续执行。
上述算法只有在达到实现给定的精度算法才会停止,也可以通过定义最大外推指标控制外推的次数。