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

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

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

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

数值分析高斯勒让德积分公式.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 

#include 

#include 

#define Precision1 0.1

# 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

{

 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

        {

           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<

:

fixed)<

    /*三点求积公式*/

    s=ThreePointGaussLegendre( a, b, function);

    cout<<"三点求积公式:

"<

    cout<

:

fixed)<

    /*五点求积公式*/

    s=FivePointGaussLegendre( a, b, function);

    cout<<"五点求积公式"<

    cout<

:

fixed)<

     s=FivePointPrecisionGaussLegendre(a, b,function);

    cout<<"控制精度五点求积公式"<

    cout<

:

fixed)<

    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