数值积分方法的总结(从简单梯形积分到龙贝格积分、自适应积分、高斯积分等)
各种数值积分方法总结(龙贝格积分、自适应积分、高斯积分等)
本文整理了各种类型的数值积分,从简单的梯形积分、辛普森积分到高精度的自适应积分、龙贝格积分和高斯积分;对于多重积分(高维积分),本文先简单介绍一下蒙特卡洛方法(适用于积分维数大于4的积分),后续会发帖专门针对多重积分方法做介绍。
(如有疏漏,欢迎指正,谢谢~)
1 (一重积分)常用的数值积分方法
常用积分方法包括梯形积分、辛普森积分、自适应积分、龙贝格积分和高斯积分等;其中自适应积分、龙贝格积分和高斯积分属于高精度积分。
1.1 牛顿-科茨(Newton-Cotes)积分公式
牛顿-科茨(Newton-Cotes)积分公式:
包含了梯形法则、辛普森法则、布尔法则等。
1.1.1 梯形法则(2点积分)
梯形法则积分计算公式:
其中,
于是得:
梯形公式要计算两个点的函数值f(a)和f(b)。所以说是两点积分
梯形法则的误差为:
1.1.2-3 辛普森法则(3点积分和4点积分)
辛普森法则分为辛普森1/3法则和辛普森3/8法则,就是用二次/三次插值曲线来代替直线进行积分。
1.1.2 辛普森1/3法则(3点积分)
辛普森1/3法则法则积分计算公式:
1.1.3 辛普森3/8法则(4点积分)
辛普森3/8法则法则积分计算公式:
1.1.4 布尔法则(5点积分)
布尔法则与辛普森法则类似,只是更高阶的多项式积分,其公式为:
1.1.5牛顿-科茨积分公式总结
注意:1.对于3点积分与4点积分具有相同的误差阶;5点积分与6点积分具有相同的误差阶。对于点数更多的积分也一样。因此优先使用奇数个点的积分。
2.对于点数大于等于9的牛顿-科茨积分,求积公式的稳定性得不到保证(具体原因可以找数值积分的数看看,本文源自《现代数值积分》第5章 数值积分与数值微分),积分不能保证收敛,因此实际计算中一般不采用高阶牛顿-科茨积分公式。(处于效率考虑,一般也很少用超过5个点的牛顿-科茨积分公式)。
(穿插)积分改进思路1
牛顿-科茨积分公式思想:根据积分点构造近似的插值多项式,进而利用多项式积分表示原积分。
对于高次的多项式插值,会出现龙格现象(对于高次的多项式插值,插值多项式会出现不收敛的现象,成为龙格现象,想深入了解可以去查询相关资料。并且次数越高,越容易出现不收敛现象)。
针对龙格现象,更好的选择切比雪夫节点来进行插值(想深入了解可以去查询相关资料,本文部分源自《现代数值积分》第3章 多项式插值与样条插值)。
由于切比雪夫节点的特殊性,对于高阶插值的可以收到较好的效果,因此,对于“牛顿-科茨积分公式总结”中提到的点数大于等于9的牛顿-科茨积分,可以采用切比雪夫计算节点,然后构造插值多项式,再计算积分(此方法实现和推广比较麻烦,此处不做扩展,感兴趣的可以自己下去推导实现)。
1.2 复合积分(复合梯形积分、复合辛普森积分等)
上述主要介绍的是单个区间的积分。为了计算更准确,我们可以将区间划分为若干个小的区间,然后对每个小区间进行积分,然后对各个小区间的积分求和。由于对于单个小区间的积分可分为梯形法则,辛普森法则,和布尔法则,因此复合积分的每个小区间的积分可以是这些方法中的任意一种。
下面主要讲一下 复合梯形积分和复合辛普森积分。
1.2.1 复合梯形积分
小区间的划分又分为等长区间和不等长区间两种划分方法。
不等长区间,复合梯形积分计算公式:
区间不等长情况应用场景很有限。
等长区间,复合梯形积分计算公式:
等长区间,复合梯形积分计算误差:
1.2.2 复合辛普森积分
同样的,复合辛普森积分区间的划分也可以分为等长区间和不等长区间两种划分方法。
由于不等长区间应用很少,因此直接介绍等长区间,复合辛普森1/3积分计算公式:
等长区间,复合辛普森1/3积分计算误差:
由于3点积分(辛普森1/3积分)与4点积分(辛普森3/8积分)具有相同的误差阶,因此一般优先使用复合辛普森1/3积分,复合辛普森3/8积分应用极少,因此本文不做介绍。感兴趣的同学可以下去自己推一下复合辛普森3/8积分计算公式,应该也很简单。
(穿插)积分改进思路2
可以看出,将区间划分为更小的区间可以有效的提高积分计算的精度。那么我们是不是可以将积分区间不断地细分,从而来得到更精确的积分结果?理论上是可以的!!
方法1:(区间折半法)
a.计算2个区间的积分,用复合辛普森1/3法则(当然,也可以用梯形法则或者布尔法则等都可以,但是推荐复合辛普森1/3法则);
b.将两个区间等分为4个区间,用复合辛普森1/3法则计算四个子区间的积分和;
c.比较a和b两步计算的结果相对误差是否接近一个很小的数:(Ia - Ib)/Ib<e。如果相对误差满足要求,则结束,否则继续细分区间,用复合辛普森1/3法则计算积分,直到满足要求为止。
方法2:改进方法1
a.对每个子区间一分为二后,比较两个区间的积分值与一个区间的积分值是否相近;
b.如果相近则返回该值;否则对每个子区间执行a。(递归实现)
上面说,理论上是可以的!!理论上是可以的!!但是实际不行!!!
因为计算机浮点数运算是存在误差的。当区间数量很大的时候,浮点数计算的舍入误差(不理解的可以自行去学习了解一下)变得很大,会限制积分的提高。下面就是一个很好的例子。
1.3常用的高精度积分
上述区间二分的思想是很有用的。在龙贝格积分和自适应积分中都会找到它的影子。
1.3.1 龙贝格积分
龙贝格积分的思想,及推导过程:
类推:联合两个误差为O(h^4)的积分,改进后可以得到一个误差为O(h ^ 6)的积分:
由此产生龙贝格积分:
(穿插)积分改进思路3
龙贝格积分是用梯形公式推导得到的,那么我们是不是可以用辛普森公式做类似的推导,也能到达一套新的公式呢?答案是:理论上是可以的!!
由辛普森1/3公式推导出来的加入误差修正的积分计算式:
那么问题就来了。
我们的计算机表达的double值是有范围的,而对于辛普森外,采用递归,递归8次就是16^8 = 2 ^ 32。计算机递归计算的结果很容易就产生溢出了。除非采用多精度浮点数计算才行,而采用多精度浮点数可能存在一些计算效率的问题。。。更深入的问题我就不继续深入探讨了(有兴趣的可以试试)。。。好了,总之来说,用辛普森推导出来的方法不是很实用。还是梯形龙贝格积分经典好使。
1.3.2 自适应积分
龙贝格积分中有两点:
a。每次都会将所有的步长折半;(那么我们能不能只对计算误差较大的那个区间进行折半成两个子区间再积分呢?)
b。辛普森公式推导的方法,由于计算机double表示范围有限没用上。
下面都会在自适应积分中派上用场。自适应积分思想:(递归方法)
step1.辛普森1/3法则计算区间[a,b]的积分;
step2.区间步长折半,复合辛普森1/3法则计算区间[a,b]的积分;
如果两次误差小于给定的误差限,停止执行,返回计算结果
;
如果两次误差大于给定的误差限,对两个子区间分别执行step1和step2。
伪代码:
1.3.3 高斯积分
高斯积分应用比较广泛的是高斯-勒让德公式,此外还有高斯-切比雪夫公式;以及区间【0,正无穷】的广义积分 高斯-拉盖尔公式;以及区间【负无穷,正无穷】的广义积分 高斯-埃尔米特公式。
高斯-勒让德公式
介绍高斯积分的文档就很多了,本文不细讲推导的过程,给出计算方法:
多点高斯-勒让德公式:
高斯勒让德公式的区间为【-1,1】.对于任意区间为【a,b】;需要做一下简单的变量代换,
高斯积分误差:
高斯勒让德公式的区间为【-1,1】,误差:
对于任意区间为【a,b】,误差:
由上式继续往下推导,可以得出,当区间长度【b-a】> 2(n+1)时,误差会发散。因此对于高斯点为n的高斯积分,积分区间长度不要大于2(n+1),否则积分结果很可能会不准确。
此外,高斯积分的误差还与被积函数的光顺性有关,被积函数光顺性越差,误差越大。详细可参考《现代数值计算》第5章 数值积分与数值微分,P139页)。
高斯积分的优点:高斯积分时给定节点数下代数精度最高的求积公式。
高斯积分的不足:高斯积分每次改变积分点的个数,所以的积分点的函数值都需要重新计算。
高斯-切比雪夫公式
高斯点为切比雪夫节点。
(未完待续。。。)
广义积分:高斯-拉盖尔公式
广义积分:高斯-埃尔米特公式
2 多重积分方法
二重积分的辛普森公式
二重积分的蒙特卡洛方法
多重(高维)积分的蒙特卡洛方法
更多推荐
所有评论(0)