梯形法则积分公式 | 您所在的位置:网站首页 › 梯形法计算定积分程序 › 梯形法则积分公式 |
数值积分--梯形公式和Simpson公式_梯形积分公式_Amiyai的博客-CSDN博客 数值积分——梯形公式和Simpson公式 梯形公式: I ( f ) = ∫ a b f ( x ) d x ≈ b − a 2 [ f ( a ) + f ( b ) ] I(f) = \displaystyle\int^b_a f(x)dx \approx\frac{b-a}{2}[f(a)+f(b)] I ( f ) = ∫ a b f ( x ) d x ≈ 2 b − a [ f ( a ) + f ( b ) ] def Trapezoid ( a, b) : y= ( a- b) * ( ( 1 / 2 ) * f( a) + ( 1 / 2 ) * f( b) ) return ySimpson 公式: I ( f ) = ∫ a b f ( x ) d x ≈ ( b − a ) [ 1 6 f ( a ) + 4 6 f ( a + b 2 ) + 1 6 f ( b ) ] I(f) = \displaystyle\int^b_a f(x)dx \approx(b-a)[\frac{1}{6}f(a)+\frac{4}{6}f(\frac{a+b}{2}) +\frac{1}{6}f(b)] I ( f ) = ∫ a b f ( x ) d x ≈ ( b − a ) [ 6 1 f ( a ) + 6 4 f ( 2 a + b ) + 6 1 f ( b ) ] def Simpson ( a, b) : y= ( a- b) * ( ( 1 / 6 ) * f( a) + ( 4 / 6 ) * f( ( a+ b) / 2 ) + ( 1 / 6 ) * f( b) ) return y测试一下: def f ( x) : f= np. exp( - x) return f( Trapezoid( 0.5 , 0.1 ) ) ( Simpson( 0.5 , 0.1 ) ) 结果为: 0.30227361554971860.298309397365031 复化梯形公式: T n = ∫ a b f ( x ) d x ≈ h 2 [ f ( a ) + f ( b ) + 2 ∑ k = 1 n − 1 f ( x k ) ] h = b − a n , x k = a + k h , ( k = 0 , 1 , … , n ) T_n =\displaystyle\int^b_a f(x)dx\approx\frac{h}{2}[f(a)+f(b)+2\sum\limits_{k=1}^{n-1}f(x_k)] \\ h=\frac{b-a}{n},x_k = a + kh,(k =0,1,\dots,n) T n = ∫ a b f ( x ) d x ≈ 2 h [ f ( a ) + f ( b ) + 2 k = 1 ∑ n − 1 f ( x k ) ] h = n b − a , x k = a + k h , ( k = 0 , 1 , … , n ) def complex_Trapezoid ( n, a, b) : h= ( b- a) / n temp_s= 0 for kin range ( 1 , n) : x_k= a+ k* h temp_s+= f( x_k) I= h/ 2 * ( f( a) + f( b) + 2 * temp_s) return I复化Simpson公式: ∫ a b f ( x ) d x ≈ h 3 [ f ( a ) + f ( b ) + 2 ∑ k = 1 m − 1 f ( x 2 k ) + 4 ∑ k = 1 m f ( x 2 k − 1 ) ] n = 2 m , h = b − a n , x k = a + k h , ( k = 0 , 1 , … , n ) \displaystyle\int^b_a f(x)dx\approx\frac{h}{3}[f(a)+f(b)+2\sum\limits_{k=1}^{m-1}f(x_{2k})+4\sum\limits_{k=1}^{m}f(x_{2k-1})] \\ n=2m,h=\frac{b-a}{n},x_k = a + kh,(k =0,1,\dots,n) ∫ a b f ( x ) d x ≈ 3 h [ f ( a ) + f ( b ) + 2 k = 1 ∑ m − 1 f ( x 2 k ) + 4 k = 1 ∑ m f ( x 2 k − 1 ) ] n = 2 m , h = n b − a , x k = a + k h , ( k = 0 , 1 , … , n ) def complex_simpson ( n, a, b) : ''' n:划分[a,b]区间成n等分 a: 积分下限 b: 积分上限 ''' h= ( b- a) / n temps_odd= 0 temps_even= 0 for kin range ( 1 , n) : if k% 2 == 0 : x_k= a+ k* h temps_even+= 2 * f( x_k) else : x_k= a+ k* h temps_odd+= 4 * f( x_k) I= ( h/ 3 ) * ( f( a) + f( b) + temps_even+ temps_odd) return I测试一下: def f ( x) : if x== 0 : return 1 else : f= np. sin( x) / xreturn f( complex_Trapezoid( 8 , 0 , 1 ) ) ( complex_simpson( 8 , 0 , 1 ) ) 结果为: 0.94569086358270140.9460833108884719 数值积分方法的总结(从简单梯形积分到龙贝格积分、自适应积分、高斯积分等)_数值积分法_三石の四夕的博客-CSDN博客各种数值积分方法总结(龙贝格积分、自适应积分、高斯积分等) 本文整理了各种类型的数值积分,从简单的梯形积分、辛普森积分到高精度的自适应积分、龙贝格积分和高斯积分;对于多重积分(高维积分),本文先简单介绍一下蒙特卡洛方法(适用于积分维数大于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 2(n+1)时,误差会发散。因此对于高斯点为n的高斯积分,积分区间长度不要大于2(n+1),否则积分结果很可能会不准确。 此外,高斯积分的误差还与被积函数的光顺性有关,被积函数光顺性越差,误差越大。详细可参考《现代数值计算》第5章 数值积分与数值微分,P139页)。 高斯积分的优点:高斯积分时给定节点数下代数精度最高的求积公式。 高斯积分的不足:高斯积分每次改变积分点的个数,所以的积分点的函数值都需要重新计算。 高斯-切比雪夫公式 高斯点为切比雪夫节点。 (未完待续。。。) 广义积分:高斯-拉盖尔公式 广义积分:高斯-埃尔米特公式 2 多重积分方法 二重积分的辛普森公式 二重积分的蒙特卡洛方法 多重(高维)积分的蒙特卡洛方法 使用 Trapezoidal Rule(梯形法则)求积分_努力的老周的博客-CSDN博客Trapezoidal Rule 思想原理 为了求解积分值,人们想到一种近似方法。假设要求 f ( x ) f(x) f ( x ) 在[ a , b ] [a,b] [ a , b ] 上的积分,将积分区间等长分成n n n 段,则每两个分段点之间的距离h = b − a n h=\frac{b−a}{n} h = n b − a ,然后如下图进行近似则该区间上的积分值就近似等同于每个小梯形的面积之和。 推导过程 如上图所示, ∫ a b f ( x ) \int_{a}^{b}f(x) ∫ a b f ( x ) 的结果,就是上图中所有梯形面积总和。梯形面积 第一个梯形(最左边)的上底 f ( x 0 ) f(x_0) f ( x 0 ) ,下底f ( x 1 ) f(x_1) f ( x 1 ) ,高为h = b − a n h=\frac{b-a}{n} h = n b − a ,因此对应的面积为S 1 = ( f ( x 0 ) + f ( x 1 ) ) ∗ h / 2 = ( f ( x 0 ) + f ( x 1 ) ) ∗ h 2 S_1=(f(x_0)+f(x_1))*h/2=\frac{(f(x_0)+f(x_1))*h}{2} S 1 = ( f ( x 0 ) + f ( x 1 ) ) ∗ h / 2 = 2 ( f ( x 0 ) + f ( x 1 ) ) ∗ h 。以此类推,最后一个(最右边)的上上底 f ( x n − 1 ) f(x_{n-1}) f ( x n − 1 ) ,下底f ( x n ) f(x_n) f ( x n ) ,高为h = b − a n h=\frac{b-a}{n} h = n b − a ,因此对应的面积为S n = ( f ( x n − 1 ) + f ( x n ) ) ∗ h / 2 = ( f ( x n − 1 ) + f ( x n ) ) ∗ h 2 S_n=(f(x_{n-1})+f(x_n))*h/2=\frac{(f(x_{n-1})+f(x_n))*h}{2} S n = ( f ( x n − 1 ) + f ( x n ) ) ∗ h / 2 = 2 ( f ( x n − 1 ) + f ( x n ) ) ∗ h 。因此,所有梯形的总面积为 ∫ a b f ( x ) ≈ ∑ i = 1 n ( S i ) = S 0 + . . . + S n = h 2 [ f ( x 0 ) + f ( x 1 ) + f ( x 1 ) + f ( x 2 ) + ⋯ + f ( x n − 2 ) + f ( x n − 1 ) + f ( x n − 1 ) + f ( x n ) ] = ( b − a ) 2 ∗ n [ f ( x 0 ) + 2 ∑ i = 1 n f ( x i ) + f ( x n ) ] \int_{a}^{b}f(x) \approx \sum_{i=1}^{n}(S_i)=S_0+...+S_n\\ =\frac{h}{2}[f(x_0)+f(x_1)+f(x_1)+f(x_2)+\cdots + f(x_{n-2})+ f(x_{n-1})+ f(x_{n-1})+ f(x_{n})]\\ =\frac{(b-a)}{2*n}[f(x_0)+2\sum_{i=1}^{n}f(x_i)+f(x_n)] ∫ a b f ( x ) ≈ i = 1 ∑ n ( S i ) = S 0 + . . . + S n = 2 h [ f ( x 0 ) + f ( x 1 ) + f ( x 1 ) + f ( x 2 ) + ⋯ + f ( x n − 2 ) + f ( x n − 1 ) + f ( x n − 1 ) + f ( x n ) ] = 2 ∗ n ( b − a ) [ f ( x 0 ) + 2 i = 1 ∑ n f ( x i ) + f ( x n ) ] C++ implement 输入 根据上面的公式,我们可以总结出,输入包括以下几个: 1、 f ( x ) f(x) f ( x ) 。即需要积分的函数。2、 x 0 x_0 x 0 。即积分开始点。3、 x n x_n x n 。即积分结束点。4、 n n n 。即毕竟的次数。f ( x ) f(x) f ( x ) 函数和前面的设计一样,使用外部函数实现。对应的函数原型如下: double f ( double x) ; 主框架 类似前面的计算,主要用于输入数据。 # include using namespace std; double f ( double x) ; int main ( ) { double lower; double upper; int step; coutlower; coutupper; coutstep; double h= ( upper- lower) / step; double ans= f ( lower) + f ( upper) ; double x= lower; for ( int i= 1 ; i |
CopyRight 2018-2019 实验室设备网 版权所有 |