Gauss型积分公式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Gauss型积分公式
摘要
求函数在给定区间上的定积分,在微积分学中已给出了许多计算方法,但是,在实际问题计算中,往往仅给出函数在一些离散点的值,它的解析表达式没有明显的给出,或者,虽然给出解析表达式,但却很难求得其原函数。

这时我们可以通过数值方法求出函数积分的近似值。

当然再用近似值代替真实值时,误差精度是我们需要考虑因素,但是除了误差精度以外,还可以用代数精度来判断其精度的高低。

已知n+1点的Newton-Cotes型积分公式,当n为奇数时,其代数精度为n;当n 为偶数时,其代数精度达到n+1。

若对随机选取的n+1个节点作插值型积分公式也仅有n次代数精度。

如何选取适当的节点,能使代数精度提高?Gauss型积分公式可是实现这一点,但是Gauss型求积公式,需要被积函数满足的条件是正交,这一条件比较苛刻。

因此本实验将针对三种常用的Gauss型积分公式进行讨论并编程实现。

关键词:Newton-Cotes型积分公式正交多项式代数精度
1、实验目的
1)通过本次实验体会并学习Gauss型积分公式,在解决如何取节点能提
高代数精度这一问题中的思想方法。

2)通过对Gauss型积分公式的三种常见类型进行编程实现,提高自己的
编程能力。

3)用实验报告的形式展现,提高自己在写论文方面的能力。

2、算法流程
下面介绍三种常见的Gauss型积分公式
1)高斯-勒让德(Gauss-Legendre)积分公式
勒让德(Legendre)多项式
如下定义的多项式
称作勒让德多项式。

由于是次多项式,所以是n次多项式,其最高次幂的系数与多项式
的系数相同。

也就是说n次勒让德多项式具有正交性即勒让德多项式是在上带的n次正交多项式,而且
这时Gauss型积分公式的节点就取为上述多项式的零点,相应的Gauss型积分公式为
此积分公式即成为高斯-勒让德积分公式。

其中Gauss-Legendre求积公式的系数
1
其中k的取值范围为
Gauss点和系数不容易计算,但是在实际计算中精度要求不是很高,所以给出如下表所示的部分Gauss点和系数,在实际应用中只需查表
即可。

n x A n x A
1 0
2 6
1.2386191816 0.17132449
2
0.36076157
3
0.46791393
4
2 1
7
0 0.12948496
6
0.27970539
1
0.38183005
0.41795918
3
3
0 0.555555555
6
0.888888888
9
4 0.347854845
1
0.652145154
9
8
0.7966664774
0.5255324099
0.1834346425
0.10122853
6
0.22238103
4
0.31370664
5
0.36268378
3
5
0 0.236926885
1
0.478628670
5
0.568888888
9
2)高斯-拉盖尔(Gauss-Laguerre)积分公式
拉盖尔(Laguere)多项式
2
称为拉盖尔多项式。

其首项系数为,且具有性质:
正交性,在区间上关于权函数正交,而且
积分区间为,权函数为的Gauss型积分公式称为高斯-拉盖尔积分公式,其中Gauss点为拉盖尔多项式的零点,高斯-拉盖尔积分公式为
同样高斯-拉盖尔积分公式的Gauss点和求积系数如下表所示:
n x A n x A
2 0.5857864376
3.4142135624
0.853*******
0.1464466094
5
0.2635603197
1.4134030591
3.5964257710
7.0858100058
12.6408008442
0.5217556105
0.3986668110
0.0759424497
0.0036117587
0.0000233700
3 0.4157745567
2.2942803602
6.2899450829
0.7110930099
0.2785177335
4 0.3225476896
1.7457611011
4.5366202969
9.3950709123
0.6031541043
0.3574186924
0.0388879085
0.0005392947
6
0.2228466041
1.1889321016
2.9927363260
5.7751435691
9.8374674183
15.9828739806
0.4589646793
0.4170008307
0.1133733820
0.010*******
0.0002610172
0.0000008985
3)高斯-埃尔米特(Gauss-Hermite)积分公式
埃尔米特(Hermite)多项式
被称作埃尔米特多项式,其首项系数为,具有性质如下
正交性,在区间上关于权函数正交,而且
积分区间为,权函数为的Gauss型积分公式称为
3
Gauss-Hermite积分公式,其Gauss点就是Hermite正交多项式的零点。

Gauss-Hermite求积公式为
同样高斯-埃尔米特积分公式的Gauss点和求积系数如下表所示:
n x A n x A
2 0.886226925
5
7
0.724629595
2
0.157067320
3
0.004530009
9
3
0 0.295408975
1
1.816359000
6
4 0.804914090
0.081312835
4
8
1.6735516287
2.6519613563
0.425607252
6
0.054515582
8
0.000971781
2
0.810264617
5
5 0.393619323
1
0.019953242
1
0.945308720
4
0.568888888
9
3、算法实例
1)用3点Gauss型求积公式计算
4
解:根据积分限可以知道应该用Gauss-Legendre积分公式,具体程序如下所示
#include <iostream>
#include <math.h>
using namespace std;
const int M(10);
void main()
{
int i=0;
int n=0;
int m=0;
int sign=0;
double sum=0;
double x[M]={0};
double A[M]={0};
double x1[]={0};
double x2[]={-0.57735502692,0.57735502692};
double x3[]={-0.77459666920,0.77459666920,0};
double
x4[]={-0.8611363116,0.8611363116,-0.3399810436,0.3399810436 };
double
x5[]={-0.9061798459,0.9061798459,-0.53846931010,0.538469310 10,0};
double
x6[]={-0.9324695142,0.9324695142,-0.6612093865,0.6612093865 ,-1.2386191816,1.2386191816};
double
x7[]={-0.9491079123,0.9491079123,-0.7415311856,0.7415311856 ,-0.40584515140,0.40584515140,0};
double
x8[]={-0.9602898565,0.9602898565,-0.7966664774,0.7966664774 ,-0.5255324099,0.5255324099,-0.1834346425,0.1834346425};
double A1[]={2};
double A2[]={1};
double A3[]={0.5555555556,0.8888888889};
double A4[]={0.3478548451,0.6521451549};
5
double
A5[]={0.2369268851,0.4786286705,0.5688888889};
double
A6[]={0.1713244924,0.3607615730,0.4679139346};
double
A7[]={0.1294849662,0.2797053915,0.3818300505,0.4179591834};
double
A8[]={0.1012285363,0.2223810345,0.3137066459,0.3626837834};
cout<<"请输入节点个数"<<endl;
cin>>n;
switch(n)
{
case
1:for(i=0;i<n;i++){x[i]=x1[i];A[i]=A1[i];}break;
case
2:for(i=0;i<n;i++){x[i]=x2[i];}for(i=0;i<n;i++){A[i]=A2[i/2 ];}break;
case
3:for(i=0;i<n;i++){x[i]=x3[i];}for(i=0;i<n;i++){A[i]=A3[i/2 ];}break;
case
4:for(i=0;i<n;i++){x[i]=x4[i];}for(i=0;i<n;i++){A[i]=A4[i/2 ];}break;
case
5:for(i=0;i<n;i++){x[i]=x5[i];}for(i=0;i<n;i++){A[i]=A5[i/2 ];}break;
case
6:for(i=0;i<n;i++){x[i]=x6[i];}for(i=0;i<n;i++){A[i]=A6[i/2 ];}break;
case
7:for(i=0;i<n;i++){x[i]=x7[i];}for(i=0;i<n;i++){A[i]=A7[i/2 ];}break;
case
8:for(i=0;i<n;i++){x[i]=x8[i];}for(i=0;i<n;i++){A[i]=A8[i/2
6
];}break;
default:
cout<<"输入出错,请从新输入!!"<<endl;
break;
}
for(i=0;i<n;i++)
{
sum=sum+A[i]*cos(x[i]);
}
cout<<sum;
}
运行结果:
2)用两点Gauss型求积公式计算积分
解:根据积分限可以知道应该用Gauss-Laguerre积分公式,具体程序如下所示
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
const int M(10);
void main()
{
int i=0;
int n=0;
int m=0;
int sign=0;
double sum=0;
7
double x[M]={0};
double A[M]={0};
double x2[]={0.5857864376,3.4142135624};
double x3[]={0.4157745567,2.2942803602,6.2899450829};
double x4[]={0.3225476896,1.7457611011,4.5366202969,9.3950709123};
double
x5[]={0.2635603197,1.4134030591,3.5964257710,7.0858100058,12.6408008442};
double
x6[]={0.2228466041,1.1889321016,2.9927363260,5.7751435691,9.8374674183,15. 9828739806};
double A2[]={0.853*******,0.1464466094};
double A3[]={0.7110930099,0.2785177335,0.010*******};
double A4[]={0.6031541043,0.3574186924,0.0388879085,0.0005392947};
double
A5[]={0.5217556105,0.3986668110,0.0759424497,0.0036117587,0.0000233700};
double
A6[]={0.4589646793,0.4170008307,0.1133733820,0.010*******,0.0002610172,0.0 000008985};
cout<<"请输入节点个数"<<endl;
cin>>n;
switch(n)
{
case 2:for(i=0;i<n;i++){x[i]=x2[i];}for(i=0;i<n;i++){A[i]=A2[i];}break;
case 3:for(i=0;i<n;i++){x[i]=x3[i];}for(i=0;i<n;i++){A[i]=A3[i];}break;
case 4:for(i=0;i<n;i++){x[i]=x4[i];}for(i=0;i<n;i++){A[i]=A4[i];}break;
case 5:for(i=0;i<n;i++){x[i]=x5[i];}for(i=0;i<n;i++){A[i]=A5[i];}break;
case 6:for(i=0;i<n;i++){x[i]=x6[i];}for(i=0;i<n;i++){A[i]=A6[i];}break;
default:
cout<<"输入出错,请从新输入!!"<<endl;
break;
}
for(i=0;i<n;i++)
{
sum=sum+A[i]*sin(x[i])*exp(-9*x[i]);
}
cout<<sum;
}
8
运行结果:
3)用两点Gauss型求积公式计算积分
解:根据积分限可以知道应该用Gauss-Hermite积分公式,具体程序如下所示
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
const int M(10);
void main()
{
int i=0;
int n=0;
int m=0;
int sign=0;
double sum=0;
double x[M]={0};
double A[M]={0};
double x2[]={-0.7071067811,0.7071067811};
double x3[]={-1.2247448714,1.2247448714,0};
double
x4[]={-0.5246476232,0.5246476232,-1.6506801238,1.6506801238 };
double
x5[]={-0.9585724646,0.9585724646,-2.020*******,2.020******* };
double
x6[]={-0.4360774119,0.4360774119,-1.3358490704,1.3358490704 ,-2.3506049736,2.3506049736};
double
x7[]={-0.8162878828,0.8162878828,-1.6735516287,1.6735516287 ,-2.65196135630,2.65196135630,0};
double A2[]={0.8862269255};
double A3[]={0.2954089751,1.8163590006};
double A4[]={0.8049140900,0.0813128354};
double
A5[]={0.3936193231,0.0199532421,0.9453087204,0.5688888889};
double
A6[]={0.7246295952,0.1570673203,0.0045300099};
double
A7[]={0.4256072526,0.0545155828,0.0009717812,0.8102646175};
cout<<"请输入节点个数"<<endl;
cin>>n;
switch(n)
{
case
2:for(i=0;i<n;i++){x[i]=x2[i];}for(i=0;i<n;i++){A[i]=A2[i/2 ];}break;
case
3:for(i=0;i<n;i++){x[i]=x3[i];}for(i=0;i<n;i++){A[i]=A3[i/2 ];}break;
case
4:for(i=0;i<n;i++){x[i]=x4[i];}for(i=0;i<n;i++){A[i]=A4[i/2 ];}break;
case
5:for(i=0;i<n;i++){x[i]=x5[i];}for(i=0;i<n;i++){A[i]=A5[i]; }break;
case
6:for(i=0;i<n;i++){x[i]=x6[i];}for(i=0;i<n;i++){A[i]=A6[i/2 ];}break;
case
7:for(i=0;i<n;i++){x[i]=x7[i];A[i]=A7[i/2];}break;
default:
cout<<"输入出错,请从新输入!!"<<endl;
break;
}
for(i=0;i<n;i++)
{
sum=sum+A[i]*cos(x[i]);
}
cout<<sum;
}
运行结果:
4、对结果进行分析
实验结果较为理想,但是仅仅只能计算函数在特殊的区间上的值。

而且程序的通用性不是很好,还需进一步改进。

5、总结
通过对Gauss型积分公式的三种特殊情况的实验和学习,我明白了Gauss型积分公式的原理,并且体会到了它的优点和不足。

6、参考文献
[1] 秦新强.数值逼近.西安:西安理工大学出版社,2010。

相关文档
最新文档