各种数值积分_第1页
各种数值积分_第2页
各种数值积分_第3页
各种数值积分_第4页
各种数值积分_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第5章章 各种数值积分讲解和程序各种数值积分讲解和程序 5.1 引言引言 利用牛顿利用牛顿莱布尼兹(莱布尼兹(NewtonLeibniz)公式公式 (5.1) 解决函数解决函数 在在 上的积分问题在理论和应用上都有重大的意上的积分问题在理论和应用上都有重大的意义。然而,在实际问题中,往往会遇到一些困难。有些形式上较简单的义。然而,在实际问题中,往往会遇到一些困难。有些形式上较简单的函数,其原函数函数,其原函数 不易求出或不能用初等函数表示成有限形式;有些不易求出或不能用初等函数表示成有限形式;有些被积函数的原函数过于复杂;而有些函数的函数值是由实验、观测等方被积函数的原函数过于复杂;而有些函

2、数的函数值是由实验、观测等方法得出,并没有给出具体的解析表达式。这些情形说明公式法得出,并没有给出具体的解析表达式。这些情形说明公式(5.1)在应用在应用上是有局限性的,因此研究定积分的数值计算问题就显得十分必要。上是有局限性的,因此研究定积分的数值计算问题就显得十分必要。 本章主要介绍一些常用的数值积分方法,包本章主要介绍一些常用的数值积分方法,包括梯形积分法、辛卜生括梯形积分法、辛卜生积分法、变步长积分法、牛顿积分法、变步长积分法、牛顿柯特斯积分法、高斯积分法、龙贝格积柯特斯积分法、高斯积分法、龙贝格积分法以及分法以及高振荡函数的积分法高振荡函数的积分法。)()()d(aFbFxxfba)

3、(xf,ba)(xF5.2 5.2 梯形积分法梯形积分法 5.2.1 5.2.1 梯形积分法的基本思想梯形积分法的基本思想 梯形积分法的基本思想:在积分区间梯形积分法的基本思想:在积分区间 上,根上,根据给定的插值条件据给定的插值条件 和和 ,构造,构造一个一次二项式一个一次二项式 ,并以,并以 的积分值近似地的积分值近似地代替代替 。从几何角度而言,是以梯形面积近。从几何角度而言,是以梯形面积近似地代替曲边梯形的面积。似地代替曲边梯形的面积。,1kkxx )(,kkxfx )(,11kkxfx)(1xP1d)(1kkxxxxP1d)(kkxxxxf5.2.2 5.2.2 梯形求积公式梯形求积

4、公式 依据梯形积分法的基本思想,将区间 分成 个 相 等 的 小 区 间 ,则 每 个 小 区 间 的 长 度为 ,对每个小区间均实施如下的梯形求积: 将这些小梯形的求积值加起来,可以得到如下梯形求积公式: 其中,,bannabh/ )( )()(2)()d(111kkkkxxxfxfxxxxfkk11110)(2)()()(2)()(d)(niniinbahiafbfafhxfxfxfhxxfnabh/ )( 5.2.3 5.2.3 实现梯形积分法的基本步骤实现梯形积分法的基本步骤 (1) (1) 输入区间输入区间 的端点的端点 值以及分割数值以及分割数 ; (2) (2) 将区间将区间 等

5、分成等分成 个小区间,每一个小区间的个小区间,每一个小区间的 长度长度 ; (3) (3) 计算每一个等分点的函数值计算每一个等分点的函数值 (4) (4) 计算计算 (5) (5) 输出输出 的值;的值; (6) (6) 结束。结束。 ba,ba,Nba,NN/abh)( ),2, 1 ,0()(Nihiafyi1102NiiNyyyhss图图 5.2 5.2 梯形积分法的梯形积分法的N-SN-S图描述图描述 例例5.1 5.1 使用梯形求积公式求下列定积分的值。使用梯形求积公式求下列定积分的值。102d14xx#define N 16 /#define N 16 /* * 等分数等分数 *

6、 */ /float func(float x)float func(float x) float y; float y; y=4.0/(1+x y=4.0/(1+x* *x);x); return(y); return(y); void gedianzhi(float y,float a,float h)void gedianzhi(float y,float a,float h) int i; int i; for(i=0;i=N;i+) for(i=0;i=N;i+) yi=func(a+i yi=func(a+i* *h);h); float trapeze(float y,float

7、 h)float trapeze(float y,float h) float s; float s; int i; int i; s=(y0+yN)/2.0; s=(y0+yN)/2.0; for(i=1;iN;i+) for(i=1;iN;i+) s+=yi; s+=yi; return(s return(s* *h);h); main()main() float a,b,h,s,fN+1; float a,b,h,s,fN+1; clrscr(); clrscr(); printf(input a,b=); printf(input a,b=); scanf(%f,%f,&a,&

8、amp;b); scanf(%f,%f,&a,&b); h=(b-a)/(float)N; h=(b-a)/(float)N; gedianzhi(f,a,h); gedianzhi(f,a,h); s=trapeze(f,h); s=trapeze(f,h); printf(s=%fn,s); printf(s=%fn,s); 程序运行结果:程序运行结果:input a,b=0,1input a,b=0,1s=s=3.1409423.140942 辛卜生积分法的基本思想:在积分区间辛卜生积分法的基本思想:在积分区间 上,根据上,根据给定的插值条件给定的插值条件 、 和和 ,构

9、造构造个二次插值求积多项式个二次插值求积多项式 ,并以,并以 的积的积分值近似地代替分值近似地代替 。从几何角度而言,是用过三点。从几何角度而言,是用过三点的抛物线面积近似地代替积分的曲边面积。的抛物线面积近似地代替积分的曲边面积。 2kkx,x )(kkxf,x)(11kkxf ,x)(22kkxf ,x)(2xP2d)(2kkxxxxP2d)(kkxxxxf 5.3 5.3 辛卜生(辛卜生(Simpson)积分法积分法 5.3.1 5.3.1 辛卜生积分法的基本思想辛卜生积分法的基本思想5.3.2 5.3.2 辛卜生求积公式辛卜生求积公式 依据辛卜生积分法的基本思想,将区间依据辛卜生积分法

10、的基本思想,将区间 分成分成 ( ( 必须必须是 偶 数 ) 个 相 等 的 小 区 间 , 则 每 个 小 区 间 的 长 度是 偶 数 ) 个 相 等 的 小 区 间 , 则 每 个 小 区 间 的 长 度为为 ,在小区间在小区间 均实施如下的辛卜生均实施如下的辛卜生求积:求积: 将这些求积值加起来,可以得到如下辛卜生求积公式:将这些求积值加起来,可以得到如下辛卜生求积公式: 其中其中: : ,ban nnabh/ )( ,2kkxx)(2)(4)(3)d(212kkkkkxxxfxfxfhxxfshxxfkkxx3d)(22s*21s*4xfxfsba)()(ks :1ks:2为寄数项的

11、函数为寄数项的函数 值之和。值之和。为偶数项的函数为偶数项的函数 值之和。值之和。)(kxf)(kxf5.3.3 5.3.3 实现辛卜生积分法的基本步骤实现辛卜生积分法的基本步骤(1) (1) 输入区间输入区间 的端点的的端点的 值以及分割数值以及分割数 ;(2)(2)将区间将区间 等分成等分成 个小区间,每一个小区间的长度个小区间,每一个小区间的长度 ;(3) (3) 计算每一个等分点的函数值计算每一个等分点的函数值 ;(4) (4) 计算计算: : (计算奇数项的函数值之和)(计算奇数项的函数值之和) (计算偶数项的函数值之和)(计算偶数项的函数值之和)(5) (5) 计算计算 ;(6)

12、(6) 输出输出 的值;的值;(7) (7) 结束。结束。ba,ba,Nba,NN/abh)( ),2, 1 ,0()(Nihiafyi/2)2N(1i1i21yy1s2/ )2N(1ii2y2s2s2140*s*yysn3/s*h图图 5.4 5.4 辛卜生积分法的辛卜生积分法的N-SN-S图描述图描述例例5.25.2 使用辛卜生求积公式求下列定积分的值。使用辛卜生求积公式求下列定积分的值。102d14xx# #include include #define N 16 /#define N 16 /* * 等分数等分数 * */ /float func(float x)float func(

13、float x) float y; float y; y=4.0/(1+x y=4.0/(1+x* *x);x); return(y); return(y); void gedianzhi(float y,float a,float h)void gedianzhi(float y,float a,float h) int i; int i; for(i=0;i=N;i+) for(i=0;i=N;i+) yi=func(a+i yi=func(a+i* *h);h); float simpson(float y,float h)float simpson(float y,float h) f

14、loat s,s1,s2; float s,s1,s2; int i; int i; s1=y1; s1=y1; s2=0.0; s2=0.0; for(i=2;i=N-2;i=i+2) for(i=2;i=eps) / while(p=eps) /* * 判断是否达到精度要求判断是否达到精度要求, ,若没有达到若没有达到, ,继续循环继续循环 * */ / s=0.0;s=0.0; for(i=0;i=n-1;i+) for(i=0;i=n-1;i+) x=a+(i+0.5) x=a+(i+0.5)* *h;h; s=s+func(x); s=s+func(x); t2=(t1+h t2=(

15、t1+h* *s)/2.0; /s)/2.0; /* * 计算计算 * */ / p=fabs(t1-t2); /p=fabs(t1-t2); /* * 计算精度计算精度 * */ / t1=t2;t1=t2; n=n+n; n=n+n; h=h/2.0; h=h/2.0; return(t2); return(t2); void main()void main() float a,b,t; float a,b,t; clrscr(); clrscr(); printf(input a,b=); printf(input a,b=); scanf(%f,%f,&a,&b); s

16、canf(%f,%f,&a,&b); t=btrapeze(a,b); t=btrapeze(a,b); printf(t=%fn,t); printf(t=%fn,t); 程序运行结果:程序运行结果:input a,b=0,1input a,b=0,1t=0.746824t=0.746824 5.4.4 5.4.4 变步长辛卜生求积分法变步长辛卜生求积分法变步长辛卜生求积分法的基本过程变步长辛卜生求积分法的基本过程: :(1 1)利用梯形公式,将积分区间)利用梯形公式,将积分区间 一等分,一等分,(2 2)将其中的每一个求积小区间再二等分一次)将其中的每一个求积小区间再二等分

17、一次(3 3)根据上面两式)根据上面两式 和和 的余项的余项 、 ,可以,可以 推导出如下的变步长辛卜生求积公式。推导出如下的变步长辛卜生求积公式。 进一步得到再二次等分一次后的变步长辛卜生求积公式为进一步得到再二次等分一次后的变步长辛卜生求积公式为(4 4)若)若 ,二等分后的积分值,二等分后的积分值 就是最后的结果;否则保存当就是最后的结果;否则保存当前的变步长梯形积分值、等分数、积分值与步长,转到第(前的变步长梯形积分值、等分数、积分值与步长,转到第(2 2)步继续)步继续做二等分处理。做二等分处理。b ,a101)()(2niiinxfxfhT1n0i5 . 0inn2xf2hT21T

18、)(nTnT2)(1212fhab )(21222fhab 342nnnTTS34242nnnTTSnnSS2nS25.4.5 5.4.5 实现变步长辛卜生积分法的基本步骤实现变步长辛卜生积分法的基本步骤变步长梯形积分法的变步长梯形积分法的N-SN-S图描述图描述例例5.4 5.4 使用变步长辛卜生求积分法求下列定积分的值。使用变步长辛卜生求积分法求下列定积分的值。# #include include #include #include #define eps 0.000001 /#define eps 0.000001 /* * 容许误差容许误差 * */ /float func(float

19、 x)float func(float x) float y; float y; y=sqrt(1-x y=sqrt(1-x* *x);x); return(y); return(y); 102d1xx float bsimpson(float a,float b) float bsimpson(float a,float b) int i,n; int i,n; float h,p,e,s; float h,p,e,s; float t1,t2,s1,s2,x; float t1,t2,s1,s2,x; n=1; n=1; h=b-a; h=b-a; t1=h t1=h* *(func(a)

20、+func(b)/2.0;(func(a)+func(b)/2.0; s1=t1; / s1=t1; /* * 用代替用代替 * */ / e=eps+1.0;e=eps+1.0; while(e=eps) while(e=eps) s=0.0; s=0.0; for(i=0;i=n-1;i+) for(i=0;i=n-1;i+) x=a+(i+0.5) x=a+(i+0.5)* *h;h; s=s+func(x); s=s+func(x); t2=(t1+h t2=(t1+h* *s)/2.0; /s)/2.0; /* * 计算计算 * */ / s2=(4s2=(4* *t2-t1)/3.

21、0; /t2-t1)/3.0; /* * 计算计算 * */ / e=fabs(s2-s1); /e=fabs(s2-s1); /* * 计算精度计算精度 * */ / t1=t2;t1=t2; s1=s2; s1=s2; n=n+n; n=n+n; h=h/2.0; h=h/2.0; return(s2); return(s2); void main()void main() float a,b,s; float a,b,s; clrscr(); clrscr(); printf(input a,b=); printf(input a,b=); scanf(%f,%f,&a,&

22、;b); scanf(%f,%f,&a,&b); s=bsimpson(a,b); s=bsimpson(a,b); printf(s=%fn,s); printf(s=%fn,s); 程序运行结果:程序运行结果:input a,b=0,1input a,b=0,1s=0.785398s=0.7853985.5 5.5 牛顿牛顿柯特斯柯特斯( (NewtonCotes) )积分法积分法 5.5.1 5.5.1 牛顿牛顿柯特斯积分法的基本思想柯特斯积分法的基本思想 牛顿牛顿柯特斯积分法的基本思想:用高次柯特斯积分法的基本思想:用高次的插值求积多项式的插值求积多项式 去逼近被积函数

23、去逼近被积函数 ,以获得高精度的积分值。以获得高精度的积分值。 事实上,梯形积分是当事实上,梯形积分是当 时的牛顿时的牛顿柯柯特斯积分,辛卜生积分是当特斯积分,辛卜生积分是当 时的牛顿时的牛顿柯柯特斯积分,它们都是牛顿特斯积分,它们都是牛顿柯特斯积分的特例。柯特斯积分的特例。)(xPn)(xf1n2n5.5.2 5.5.2 牛顿牛顿柯特斯求积公式柯特斯求积公式 下面给出三到五阶牛顿下面给出三到五阶牛顿柯特斯求积公式。柯特斯求积公式。实现三阶牛顿实现三阶牛顿柯特斯求积公式的基本步骤如下:柯特斯求积公式的基本步骤如下:三阶牛顿三阶牛顿柯特斯求积公式的柯特斯求积公式的N-SN-S图描述图描述例例5.

24、5 5.5 使用牛顿使用牛顿柯特斯求积公式求下列定积分的值。柯特斯求积公式求下列定积分的值。102d14xx# #include include #define N 5#define N 5float func(float x)float func(float x) float y; float y; y=4.0/(1+x y=4.0/(1+x* *x);x); return(y); return(y); void gedianzhi(float y,float a,float b,int n)void gedianzhi(float y,float a,float b,int n) floa

25、t h,s; float h,s; int i; int i; h=(b-a)/(float)n; h=(b-a)/(float)n; for(i=0;i=n;i+) for(i=0;i=n;i+) yi=func(a+i yi=func(a+i* *h);h); float nc3(float y,float a,float b,int n)float nc3(float y,float a,float b,int n) float h,s,s0,s1; float h,s,s0,s1; int i; int i; h=(b-a)/(float)n; h=(b-a)/(float)n; s0

26、=s1=0.0; s0=s1=0.0; for(i=0;i=n-3;i=i+3) for(i=0;i=n-3;i=i+3) s0+=yi+yi+3; s0+=yi+yi+3; s1+=yi+1+yi+2; s1+=yi+1+yi+2; s=s0+3.0 s=s0+3.0* *s1;s1; return(s return(s* *h h* *3.0/8.0);3.0/8.0); main()main() float a,b,h,s,fN+1; float a,b,h,s,fN+1; float n3,n4,n5; float n3,n4,n5; printf(input a,b=); print

27、f(input a,b=); scanf(%f,%f,&a,&b); scanf(%f,%f,&a,&b); gedianzhi(f,a,b,3); gedianzhi(f,a,b,3); n3=nc3(f,a,b,3); n3=nc3(f,a,b,3); printf(n 3-nc 4-nc 5-ncn); printf(n 3-nc 4-nc 5-ncn); printf(%f %f %fn,n3,n4,n5); printf(%f %f %fn,n3,n4,n5); 程序运行结果:程序运行结果:input a,b=0,1input a,b=0,1 3-nc

28、 4-nc 5-nc 3-nc 4-nc 5-nc 3.138461 3.142118 3.141878 3.138461 3.142118 3.1418785.6 5.6 高斯积分法高斯积分法 5.6.1 5.6.1 高斯积分法的基本思想高斯积分法的基本思想 前面介绍的几种数值积分方法,都是先寻找一个插值求积多项前面介绍的几种数值积分方法,都是先寻找一个插值求积多项式式 ,并以,并以 近似代替函数近似代替函数 进行积分而获得积分的近似值,进行积分而获得积分的近似值,即即 (5.2) (5.2) 表明,函数表明,函数 在区间在区间 上的积分可以用函数上的积分可以用函数 在该区间上在该区间上 的

29、的 个点的函数值的线性组合来近似代替。但是,由于插值求积公个点的函数值的线性组合来近似代替。但是,由于插值求积公式是利用插值多项式的积分得到的,因此,如果被积函数式是利用插值多项式的积分得到的,因此,如果被积函数 为次数不为次数不超过超过 的多项式,则利用插值求积公式计算得到的积分值是准确的。的多项式,则利用插值求积公式计算得到的积分值是准确的。 在实际应用中,为了提高数值求积公式的精度,一般要求数值求积在实际应用中,为了提高数值求积公式的精度,一般要求数值求积公式对于次数尽可能高的多项式能准确成立。由此提出了高斯积分法。公式对于次数尽可能高的多项式能准确成立。由此提出了高斯积分法。即:如果插

30、值求积公式即:如果插值求积公式(5.2)(5.2)具有具有 次代数精度,那么称该插值求次代数精度,那么称该插值求积公式为高斯求积公式。其节点积公式为高斯求积公式。其节点 称为高斯点,称为高斯点, 称为高斯求积系数。称为高斯求积系数。 下面具体介绍几个常用的高斯求积公式。下面具体介绍几个常用的高斯求积公式。 )(xPn)(xfbaniiinbaxfxxPxxf0)(d)(d)()(xf,ba)(xf1nn)(xPn)(xf12nixi5.6.2 5.6.2 勒让德勒让德高斯高斯( (Legendre-GaussLegendre-Gauss) )求积公式求积公式 勒让德勒让德高斯求积公式,特别适合

31、于计算区间高斯求积公式,特别适合于计算区间-1,1-1,1的积分,其求积公式可以表示为以下形式:的积分,其求积公式可以表示为以下形式: 而对于一般区间而对于一般区间 ,通过变换可以得到以下形式的,通过变换可以得到以下形式的求积公式:求积公式: 高斯点高斯点 及高斯求积系数及高斯求积系数 ,参见表,参见表5.15.1( 表示阶表示阶数)。数)。)()()(d)(11110011nnxfxfxfxxf,ba1, 1 , 0,)2/ )(2/ )( (niabbafyii1n1n1100bayxyxyxxdxf)(ixin例例5.6 5.6 使用勒让德使用勒让德高斯求积公式求下列定高斯求积公式求下列

32、定积分的值。积分的值。#include #include double func(double x)double func(double x) double y; double y; y=x y=x* *x+sin(x);x+sin(x); return(y); return(y); double legendre_gauss(double a,double b,int m,int n)double legendre_gauss(double a,double b,int m,int n) double h,hx,y,s,dx,x0; double h,hx,y,s,dx,x0; int i,

33、k; int i,k; static double x=-0.9061798459,-0.5384693101,0.0000000000, static double x=-0.9061798459,-0.5384693101,0.0000000000, 0.5384693101,0.9061798459; 0.5384693101,0.9061798459; static double w=0.2369268851,0.4786286705,0.5688888889, static double w=0.2369268851,0.4786286705,0.5688888889, 0.4786

34、286705,0.2369268851; 0.4786286705,0.2369268851; dx=(b-a)/(double)m; dx=(b-a)/(double)m; hx=dx/2; hx=dx/2; s=0.0; s=0.0; for(k=0;km;k+) for(k=0;km;k+) x0=a+(double)k x0=a+(double)k* *dx+hx;dx+hx; for(i=0;in;i+) for(i=0;in;i+) y=x0+xi y=x0+xi* *hx;hx; s=s+wi s=s+wi* *func(y); func(y); return(s return(

35、s* *hx);hx); main()main() double a,b,s; double a,b,s; int m,n; int m,n; clrscr(); clrscr(); printf(input duandian a,b=); printf(input duandian a,b=); scanf(%f,%f,&a,&b); scanf(%f,%f,&a,&b); printf(input jieshu m=); printf(input jieshu m=); scanf(%d,&m); scanf(%d,&m); printf(i

36、nput fengeshu n=); printf(input fengeshu n=); scanf(%d,&n); scanf(%d,&n); s=legendre_gauss(a,b,m,n); s=legendre_gauss(a,b,m,n); printf(s=%lfn,s); printf(s=%lfn,s); 程序运行结果:程序运行结果:input duandian a,b=2.5,8.4input duandian a,b=2.5,8.4input jieshu m=10input jieshu m=10input fengeshu n=5input feng

37、eshu n=5s=192.077774s=192.0777745.6.3 5.6.3 埃尔米特埃尔米特高斯高斯( (Hermite-GaussHermite-Gauss) )求积公式求积公式 埃尔米特埃尔米特高斯求积公式,特别适合于计算高斯求积公式,特别适合于计算如下形式的积分:如下形式的积分: 其求积公式可以表示为以下形式:其求积公式可以表示为以下形式: 高斯点高斯点 及高斯求积系数及高斯求积系数 ,参见表,参见表5.25.2( 表示阶数)。表示阶数)。xxgexd)(2)()()(d)(1111002nnxxgxgxgxxgeixin埃尔米特埃尔米特高斯求积公式的高斯求积公式的N-SN-

38、S图描述图描述 例例5.7 5.7 使用埃尔米特使用埃尔米特高斯求积公式求下列定积分的值。高斯求积公式求下列定积分的值。xexsxd22#include #include double func(double x)double func(double x) double y; double y; y=x y=x* *x;x; return(y); return(y); double hermite_gauss(int n)double hermite_gauss(int n) double s; double s; int i,k; int i,k; static double x=-2.02

39、018287046,-0.95857246461,0.00000000000, static double x=-2.02018287046,-0.95857246461,0.00000000000, 0.95857246461,2.02018287046; 0.95857246461,2.02018287046; static double w=0.01995324206,0.39361932315,0.94530872048, static double w=0.01995324206,0.39361932315,0.94530872048, 0.39361932315,0.0199532

40、4206; 0.39361932315,0.01995324206; s=0.0; s=0.0; for(i=0;in;i+) for(i=0;in;i+) s=s+wi s=s+wi* *func(xi);func(xi); return(s); return(s); main()main() double s; double s; int n; int n; clrscr(); clrscr(); printf(input n=); printf(input n=); scanf(%d,&n); scanf(%d,&n); s=hermite_gauss(n); s=her

41、mite_gauss(n); printf(s=%lfn,s); printf(s=%lfn,s); 程序运行结果:程序运行结果:input n=5input n=5s= 0.886227s= 0.8862275.6.4 5.6.4 拉盖尔拉盖尔高斯高斯( (Laguerre-GaussLaguerre-Gauss) )求积公式求积公式 拉盖尔拉盖尔高斯求积公式,特别适合于计算高斯求积公式,特别适合于计算如下形式的积分:如下形式的积分: 其求积公式可以表示为以下形式:其求积公式可以表示为以下形式: 高斯点高斯点 及高斯求积系数及高斯求积系数 ,参见表,参见表5.35.3( 表示阶数)。表示阶数

42、)。0d)(xxgex)()()(d)(1111000nnxxgxgxgxxgeixin拉盖尔拉盖尔高斯求积公式的高斯求积公式的N-SN-S图描述图描述例例5.8 5.8 使用拉盖尔使用拉盖尔- -高斯求积公式求下列定积分的值。高斯求积公式求下列定积分的值。0dxexsx# #include include double func(double x)double func(double x) double y; double y; y=x; y=x; return(y); return(y); double hermite_gauss(int n)double hermite_gauss(in

43、t n) double s; double s; int i,k; int i,k; static double x=0.26356031972,1.41340305911,3.59642577104, static double x=0.26356031972,1.41340305911,3.59642577104, 7.08581000586,12.64080084428; 7.08581000586,12.64080084428; static double w=0.52175561058,0.39866681108,0.07594244968, static double w=0.52

44、175561058,0.39866681108,0.07594244968, 0.00361175868,0.00002336997; 0.00361175868,0.00002336997; s=0.0; s=0.0; for(i=0;in;i+) for(i=0;in;i+) s=s+wi s=s+wi* *func(xi);func(xi); return(s); return(s); main()main() double s; double s; int n; int n; clrscr(); clrscr(); printf(input n=); printf(input n=);

45、 scanf(%d,&n); scanf(%d,&n); s=hermite_gauss(5); s=hermite_gauss(5); printf(s=%lfn,s); printf(s=%lfn,s); 程序运行结果:程序运行结果:input n=5input n=5s= 1.000000s= 1.0000005.7 5.7 龙贝格(龙贝格(Romberg)积分法积分法 5.7.1 5.7.1 龙贝格积分法的基本思想龙贝格积分法的基本思想 前面讲述的各种求积方法是插值求积的思想,前面讲述的各种求积方法是插值求积的思想,而龙贝格积分法的基本思想是,使用一个诸如而龙贝格积分法

46、的基本思想是,使用一个诸如梯形求积法等代数精度较低的求积公式,相继梯形求积法等代数精度较低的求积公式,相继以步长以步长 和和 求得定积分的两个近似结果,求得定积分的两个近似结果,然后再做它们适当的线性组合,就可以得到一然后再做它们适当的线性组合,就可以得到一个代数精度更高的公式。个代数精度更高的公式。 h2/h5.7.2 5.7.2 实现龙贝格积分法的基本步骤实现龙贝格积分法的基本步骤(1 1)输入区间)输入区间 的端点的端点 的值的值, ,最大迭代次数最大迭代次数 以及容许误差以及容许误差;(2 2)计算区间计算区间 的长度的长度 ;(3 3)用梯形积分法计算积分近似值)用梯形积分法计算积分

47、近似值 ;(4 4)对)对 计算计算 对对 计算计算 , 如果如果 ,则退出循环。,则退出循环。(5 5)如果)如果 ,则继续;否则输出无解信息,转(,则继续;否则输出无解信息,转(7 7););(6 6)输出)输出 的值;的值;(7 7)结束。)结束。b ,ab ,aMb ,aabh-=2/)()(11bfafhRM,k4322)12(2211111/hiafhRRkik,kk,k12kkhhk ,j4321)-(4/ )(1 -1111jj ,kjk,jk,jk,RRRR|RR|k ,kkk,11kk,RMk 表表5.15.1龙贝格求积算法元素进行运算的顺序龙贝格求积算法元素进行运算的顺序

48、 mmmmmRRRRRRRRRR321332313221211实现龙贝格积分法的实现龙贝格积分法的N NS S图,如图图,如图5.115.11所示。所示。 例例5.9 5.9 使用龙贝格求积公式求下列定积分的值。使用龙贝格求积公式求下列定积分的值。102d14xx# #include include #include #include #define DFS_N 20 /#define DFS_N 20 /* * 等分数等分数 * */ /# #define MAX_N 10 /define MAX_N 10 /* * 最大循环次数最大循环次数 * */ /# #define eps 0.00

49、001 /define eps 0.00001 /* * 容许误差容许误差 * */ /double func(double x)double func(double x) double y; double y; y=4.0/(1+x y=4.0/(1+x* *x);x); return(y); return(y); double sum(double aa,double bb,long int n)double sum(double aa,double bb,long int n) double h,s; double h,s; int i; int i; h=(bb-aa)/n; h=(b

50、b-aa)/n; s=0.0; s=0.0; for(i=1;in;i+) for(i=1;in;i+) s+=func(aa+i s+=func(aa+i* *h);h); s=s+(func(aa)+func(bb)/2.0; s=s+(func(aa)+func(bb)/2.0; return(h return(h* *s);s); void romberg(double a,double b)void romberg(double a,double b) double s,tMAX_N+12; double s,tMAX_N+12; int i,flag=0; int i,flag=0

51、; long int n=DFS_N,m; long int n=DFS_N,m; t01=sum(a,b,n); t01=sum(a,b,n); n n* *=2;=2; for(m=1;mMAX_N;m+) for(m=1;mMAX_N;m+) for(i=0;im;i+) for(i=0;im;i+) ti0=ti1; ti0=ti1; t01=sum(a,b,n); t01=sum(a,b,n); n n* *=2;=2; for(i=1;i=m;i+) for(i=1;i=m;i+) ti1=ti-11+(ti-11-ti-10)/(pow(2,2 ti1=ti-11+(ti-11-

52、ti-10)/(pow(2,2* *m)-1);m)-1); if(fabs(tm1-tm-11)eps) if(fabs(tm1-tm-11)eps) printf(t%ld0=%lfn,m,tm1); printf(t%ld0=%lfn,m,tm1); flag=1; flag=1; break; break; if(flag=0) if(flag=0) printf(Return no solovedn); printf(Return no solovedn); main()main() double a,b; double a,b; clrscr(); clrscr(); printf

53、(input a,b=); printf(input a,b=); scanf(%lf,%lf,&a,&b); scanf(%lf,%lf,&a,&b); romberg(a,b); romberg(a,b); 程序运行结果:程序运行结果:input a,b=0,1input a,b=0,1t20=3.141570t20=3.1415705.8 5.8 高振荡函数的积分法高振荡函数的积分法 5.8.1 5.8.1 高振荡函数的积分法的基本思想高振荡函数的积分法的基本思想 在工程实际问题中,经常会遇到如下形如在工程实际问题中,经常会遇到如下形如 的积分,当的积分,

54、当m m充分大时为高振荡函数的积分。对于高振荡函数的积分,如果采充分大时为高振荡函数的积分。对于高振荡函数的积分,如果采用插值求积法进行积分,则在建立被积函数用插值求积法进行积分,则在建立被积函数 或或 的插值的插值多项式多项式 时,为了使时,为了使 能够很好地逼近它们,就要求能够很好地逼近它们,就要求 也要振荡也要振荡得厉害,即要求插值多项式得厉害,即要求插值多项式 的次数足够高。但是,高次插值实际的逼近的次数足够高。但是,高次插值实际的逼近性质很不好,实用价值不大。即使采用分段低次插值,效果也不会很理想。性质很不好,实用价值不大。即使采用分段低次插值,效果也不会很理想。 因此,引进计算高振

55、荡函数的积分的重要方法分部积分法。因此,引进计算高振荡函数的积分的重要方法分部积分法。 baxmxxfmSd)sin()(1baxmxxfmSd)cos()(2mxxf)sin(mxxf)cos()( xPn)( xPn)( xPn)( xPn分部积分法的基本思想是, 令: 其中: 则有: 反复利用分部积分法可以得到 分离出实部和虚部后就得到以下分部积分公式。baxmxexfmSd)()(jmxmxexmjsincosj)(j)()(21mSmSmS10)()()()(1j)sin()sin(j()cos()cos()j(d)()(nkkkkkkbaxmmaafmbbfmaafmbbfmxex

56、fmS5.8.2 5.8.2 分部积分公式分部积分公式当积分区间为当积分区间为 时,则变为时,则变为 10)()()sin()sin(dcos)()(nkkk1kba1ma2kafmb2kbfm1xmxxfmS10)()(12)2)cos()2)cos(1dsin)()(nkkkkbamakafmbkbfmxmxxfmS20,212)12()12(1201)0()2() 1(dcos)()(nkkkkkmffxmxxfmS21n1kk2k2k21k202m0f2f1xmxxfmS)()()(dsin)()()()(实现高振荡函数积分的实现高振荡函数积分的N NS S图图例例5.10 5.10

57、用分部积分法计算下列高振荡积分的值。用分部积分法计算下列高振荡积分的值。 其中其中 , , 。取取 , , , 则有则有 201d30coscos)(xxxxmS202d30sincos)(xxxxmS00.a 28318526.b 30m4nxxxfcos)(xxxxfsincos)(xxxxfcossin2)( xxxxfsincos3)( 00)0()0(.faf01)0() 1 (.ffa00)0()2(.ffa 03)0() 3(.ffa 2831852. 62f0fb)()(01)2() 1 (.ffb28318526)2()2(.ffb 03)2()3(.ffb #include

58、 #include void part(double a,double b,int m,int n,double fa,double fb,void part(double a,double b,int m,int n,double fa,double fb,double s)double s) int mm,i,j; int mm,i,j; double sma,smb,cma,cmb; double sma,smb,cma,cmb; double sa4,sb4,ca4,cb4; double sa4,sb4,ca4,cb4; sma=sin(m sma=sin(m* *a); smb=sin(ma); smb=sin(m* *b);b); cma=cos(m cma=cos(m* *a); cmb=cos(ma); cmb=cos(m* *b);b); sa0=sma; sa1=cma; sa2=-sma; sa3=-cma; sa0=sma; sa1=cma; sa2=-sma; sa3=-cma; sb0=smb; sb1=cmb; sb2=-smb; sb3=-cmb; sb0=smb; sb1=cmb; sb2=-smb; sb3=-cmb; ca0=cma; ca1=-sma; ca2=-cma; ca3=sma; ca0=cma; ca1=-sma;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论