数值分析高斯勒让德积分公式.docx

上传人:b****6 文档编号:3343519 上传时间:2022-11-21 格式:DOCX 页数:15 大小:105.32KB
下载 相关 举报
数值分析高斯勒让德积分公式.docx_第1页
第1页 / 共15页
数值分析高斯勒让德积分公式.docx_第2页
第2页 / 共15页
数值分析高斯勒让德积分公式.docx_第3页
第3页 / 共15页
数值分析高斯勒让德积分公式.docx_第4页
第4页 / 共15页
数值分析高斯勒让德积分公式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

数值分析高斯勒让德积分公式.docx

《数值分析高斯勒让德积分公式.docx》由会员分享,可在线阅读,更多相关《数值分析高斯勒让德积分公式.docx(15页珍藏版)》请在冰豆网上搜索。

数值分析高斯勒让德积分公式.docx

数值分析高斯勒让德积分公式

高斯—勒让德积分公式

摘要:

高斯—勒让德积分公式可以用较少节点数得到高精度的计算结果,是现在现实生活中经常运用到的数值积分法。

然而,当积分区间较大时,积分精度并不理想。

TheadvantageofGauss-Legendreintegralformulaistendtogethigh-precisioncalculationalresultbyusingfewerGauss—points,reallifeisnowoftenappliednumericalintegrationmethod。

Buttheprecisionisnotgoodwhenthelengthofintegralintervalislonger.

关键字:

积分计算,积分公式,高斯—勒让德积分公式,MATLAB

Keyword:

IntegralCalculation,Integralformula,Gauss-Legendreintegralformula,Matlab

 

引言:

众所周知,微积分的两大部分是微分与积分.微分实际上是求一函数的导数,而积分是已知一函数的导数,求这一函数.所以,微分与积分互为逆运算。

实际上,积分还可以分为两部分。

第一种,是单纯的积分,也就是已知导数求原函数,称为不定积分。

相对而言,另一种就是定积分了,之所以称其为定积分,是因为它积分后得出的值是确定的,是一个数,而不是一个函数.

计算定积分的方法很多,而高斯—勒让德公式就是其中之一.

高斯积分法是精度最高的插值型数值积分,具有2n+1阶精度,并且高斯积分总是稳定。

而高斯求积系数,可以由Lagrange多项式插值系数进行积分得到。

高斯—勒让德求积公式是构造高精度差值积分的最好方法之一。

他是通过让节点和积分系数待定让函数f(x)以此取i=0,1,2。

.。

n次多项式使其尽可能多的能够精确成立来求出积分节点和积分系数。

高斯积分的代数精度是2n-1,而且是最高的.通常运用的是(-1,1)的积分节点和积分系数,其他积分域是通过变换x=(b—a)t/2  +(a+b)/2变换到-1到1之间积分。

1.现有的方法和理论

1。

1高斯勒让德求积公式

在高斯求积公式(4.5。

1)中,若取权函数

,区间为

,则得公式

我们知道勒让德多项式是区间

上的正交多项式,因此,勒让德多项式

的零点就是求积公式(上式)的高斯点.形如(上式)的高斯公式特别地称为高斯-勒让德求积公式.

若取

的零点

做节点构造求积公式

令它对

准确成立,即可定出

.这样构造出的一点高斯-勒让德求积公式是中矩形公式.再取

的两个零点

构造求积公式

令它对

都准确成立,有

由此解出

,从而得到两点高斯-勒让德求积公式

三点高斯-勒让德求积公式的形式是

如表列出高斯-勒让德求积公式的节点和系数.

0

0。

0000000

2.0000000

1

0.5773503

1。

0000000

2

0。

7745967

0.0000000

0。

5555556

0。

8888889

3

0。

8611363

0。

3399810

0。

3478548

0。

6521452

4

0.9061798

0.5384693

0.0000000

0.2369269

0。

4786287

0。

5688889

公式(4.5。

9)的余项由(4.5。

8)得

这里

是最高项系数为1的勒让德多项式,由(3。

2。

6)及(3。

2。

7)得

.   

时,有

它比辛普森公式余项

还小,且比辛普森公式少算一个函数值.

当积分区间不是[-1,1],而是一般的区间

时,只要做变换

可将

化为[-1,1],这时

. 

对等式右端的积分即可使用高斯-勒让德求积公式.

1。

2复化Gauss-Legendre求积公式

将被积区间m等分,记

作变换

在每个小区间上应用Gauss—Legendre公式,累加即得复化Gauss-Legendre求积公式

不妨设

则有:

Gauss点个数

时,

Gauss点个数

时,

总结复化Gauss—Legendre求积过程如下:

1.分割区间,记录区间端点值;

2.通过查表或求解非线性方程组,在所有小区间上,将Gauss系数和Gauss点的值代入变量替换后的公式;

3。

将所有区间的结果累加,即得到整个区间上的积分近似值.

针对Gauss点个数

的复化Gauss—Legendre求积公式编写的一个简单的MATLAB函数compgauss()如下:

function[]=compgauss(a,b,n)

%CompositeGaussIntegration

%EquationType:

n=2,n=3

%CodedbyNan。

Xiao2010—05—25

%Step。

1DivideInterval

%Step。

2Calculate

%Step.3SumResults

formatlong

f=@(x)exp(x).*sin(x);

h=(b—a)/n;

xk=zeros(n+1,1);

xk(1,1)=a;

xk(n+1,1)=b;

fk1=zeros(n,1);

fk2=zeros(n,1);

fori=1:

n-1

xk(i+1,1)=a+h*i;

end

forj=1:

n

fk1(j)=f((xk(j)+xk(j+1))/2+(h/2)*(—1/sqrt(3)))+..。

f((xk(j)+xk(j+1))/2+(h/2)*(1/sqrt(3)));

end

forr=1:

n

fk2(r)=(5/9)*f((xk(r)+xk(r+1))/2+(h/2)*(—sqrt(15)/5))+。

.。

(8/9)*f((xk(r)+xk(r+1))/2+(h/2)*(0))+。

.。

(5/9)*f((xk(r)+xk(r+1))/2+(h/2)*(sqrt(15)/5));

end

mysum1=h*sum(fk1)/2;

mysum2=h*sum(fk2)/2;

disp('Resultof2Nodes:

')

disp(mysum1);

disp(’Resultof3Nodes:

')

disp(mysum2);

end

1。

3龙贝格,三点,五点以及变步长高斯勒让德求积法

以下是关于龙贝格,三点,五点以及变步长高斯勒让德之间精度的相互比较

#include 

h>

#include 

#include 〈iomanip。

h〉

#define Precision1 0.000000000001

# define e         2。

71828183

#define  MAXRepeat 10  

double function (double x)

{

  double s;

s=1/x;

return s;

double Romberg(double a,double b,double f(double x))

  int m,n,k;

 double y[MAXRepeat],h,ep,p,xk,s,q;

h=b-a;

 y[0]=h*(f(a)+f(b))/2.0;//计算T`1`(h)=1/2(b—a)(f(a)+f(b));

 m=1;

n=1;

ep=Precision1+1;

 while((ep>=Precision1)&&(m〈MAXRepeat))

 p=0。

0;

for(k=0;k

 xk=a+(k+0。

5)*h; 

p=p+f(xk);  

        }       

 p=(y[0]+h*p)/2。

0;  //T`m`(h/2),变步长梯形求积公式

 s=1。

0;

for(k=1;k<=m;k++)

{

s=4。

0*s;// pow(4,m)

q=(s*p—y[k-1])/(s-1.0);

y[k-1]=p;

p=q;

}

 ep=fabs(q-y[m-1]);

 m=m+1;            

y[m—1]=q;

n=n+n;   //  2 4 8 16 

  h=h/2.0;//二倍分割区间

return q;

}

double ThreePointGaussLegendre(double a,double b,double f(double x))

{

 double x,w;

 static double X[3]={—sqrt(15)/5.0,0,sqrt(15)/5.0};

  static double L[3]={5/9。

0,8/9。

0,5/9.0};

    w=0.0;

  for(int i=0;i<3;i++)

          {

             x=((b-a)*X[i]+(b+a))/2。

0;               

           w=w+f(x)*L[i];

          }

    return w;

}

double FivePointGaussLegendre(double a,double b,double f(double x))

  double x,w;

    static double X[5]={-0。

9061798459,—0。

5384693101,0,0.5384693101,0。

9061798459};

    static double L[5]={0.2369268851,0.4786286705,0。

5688888889,0.4786286705,0。

2369268851};

  w=0.0;

    for(int i=0;i〈5;i++)

          {

             x=((b-a)*X[i]+(b+a))/2.0;               

              w=w+f(x)*L[i];//每一次小区间利用勒让德公式计算的结果

        }

   return w;

}

double FivePointPrecisionGaussLegendre(double a,double b,double f(double x))

  int m,i,j;

    double s,p,ep,h,aa,bb,w,x,g;

    static double X[5]={-0。

9061798459,—0。

5384693101,0,0。

5384693101,0.9061798459};

  m=1;

  h=b-a;

    s=fabs(0。

001*h);

p=1。

0e+35;

    ep=Precision1+1;

   while((ep>=Precision1)&&(fabs(h)〉s))

    {

     g=0.0;

        for(i=0;i〈m;i++)

        {

           aa=a+i*h;

            bb=aa+h;

            w=0.0;

         for(j=0;j〈=4;j++)

           {

              x=((bb-aa)*X[j]+(bb+aa))/2.0;

                w=w+f(x)*L[j];

           }

          g=g+w;//各个区间计算结果之和相加

        }

           g=g*h/2.0;

            ep=fabs(g-p)/(1.0+fabs(g));//计算精度

            p=g;

            m=m+1;

           h=(b-a)/m;//分割区间

    }   

    return g;

}

main()

{

    double a,b,s;

    cout〈〈”请输入积分下限:

”;

    cin〉〉a;

    cout<〈”请输入积分上限:

”;

    cin>>b;

    cout〈〈”㏑的真值为:

”〈

    cout〈<”1.098612289"〈

    /*龙贝格求积*/

    s=Romberg( a, b, function);

    cout<<"龙贝格求积公式:

”〈

    cout〈〈setiosflags(ios:

fixed)<〈setprecision(14)<〈s<

    /*三点求积公式*/

    s=ThreePointGaussLegendre( a, b, function);

    cout〈<”三点求积公式:

"〈

    cout<

:

fixed)〈〈setprecision(14)<〈s〈〈endl;

    /*五点求积公式*/

    s=FivePointGaussLegendre( a, b, function);

    cout〈<”五点求积公式”〈

    cout<

:

fixed)<

     s=FivePointPrecisionGaussLegendre(a, b,function);

    cout〈〈”控制精度五点求积公式”〈

    cout<

:

fixed)〈〈setprecision(14)〈

    return 0;

2.高斯-勒让德求积的程序

2.1三点高斯勒让德公式的代码

functiongl=f(str,a,b)

x=zeros(3,1);

y=zeros(3,1);

x

(1)=—sqrt(15)/5;

x

(2)=0;

x(3)=sqrt(15)/5;

fori=1:

3

t=(b—a)/2*x(i)+(a+b)/2;

y(i)=eval(str);%exp(t)*sin(t);%此处为求积的函数,t为自变量

end

gl=5/9*y

(1)+8/9*y

(2)+5/9*y(3);

上面的代码保存为f.m文件,调用的时候如下

f(’t*2’,-1,1)

f(’exp(t)*sin(t)',1,3)

其中第一个参数为求积分的表达式,第二三个参数分别为

积分的上下限。

2。

2高斯—勒让德数值积分Matlab代码

function[ql,Ak,xk]=guasslegendre(fun,a,b,n,tol)

ifnargin==1

a=-1;b=1;n=7;tol=1e—8;

elseifnargin==3

n=7;tol=1e-8;

elseifnargin==4

tol=1e—8;

elseifnargin==2|nargin>5

error(’TheNumberofInputArgumentsIsWrong!

');

end

symsx

p=sym2poly(diff((x^2-1)^(n+1),n+1))/(2^n*factorial(n));

tk=roots(p);

Ak=zeros(n+1,1);

fori=1:

n+1

xkt=tk;

xkt(i)=[];

pn=poly(xkt);

fp=@(x)polyval(pn,x)/polyval(pn,tk(i));

Ak(i)=quadl(fp,—1,1,tol);%求积系数

end

xk=(b-a)/2*tk+(b+a)/2;

fun=fcnchk(fun,'vectorize');

fx=fun(xk)*(b—a)/2;

ql=sum(Ak.*fx);

3.数值实验

3。

1用4点(n=3)的高斯——勒让德求积公式计算

.

解:

先将区间

化为

,由

(1)

(1)

.

根据表4-7中n=3的节点及系数值可求得

.

(准确值

 

3。

2用

的高斯-勒让德公式计算积分

解:

的高斯—勒让德公式计算积分

的高斯—勒让德公式计算积分

 

3.2用四个节点的高斯―勒让德求积公式计算定积分

,计算过程保留4位小数.

解:

高斯-勒让德求积公式只求积分区间为[-1,1]上的积分问题.需作变换,令

,当x=1时,u=1;当x=0时,u=-1.于是,

 

3.总结

高斯―勒让德求积公式对定积分的计算拥有高精度的特点,但是这只存在于积分区间在[—1,1]上,区间的变大会导致精度的降低。

因此,寻找精度更高,加速更快的算法是必要的。

 

《参考文献》

[1]《数值计算》张军、林瑛、钟竞辉清华大学出版社2008617

[2]《数值分析》陈晓江、黄樟灿·科学出版社2010710

[3]《数值分析原理》吴勃英科学出版社2009723

[4]复化两点Gauss—Legendre求积公式的外推算法《桂林航天工业高等专科学校学报》2007年03期

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1