资源描述
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)多项式
如下定义的多项式
Lnx=12nn!dndxn(x2-1)n,x∈-1,1,n=0,1,2⋯
称作勒让德多项式。由于(x2-1)n是2n次多项式,所以Lnx是n次多项式,其最高次幂的系数An与多项式
12nn!dndxnx2n=12nn!2n(2n-1)(2n-2)⋯(n+1)xn
的系数相同。也就是说n次勒让德多项式具有正交性即勒让德多项式Lnx是在-1,1上带ρx=1的n次正交多项式,而且
Lm,Ln=-11Lm(x)Ln(x)dx=0, m≠n22n+1, m=n
这时Gauss型积分公式的节点就取为上述多项式Lnx的零点,相应的Gauss型积分公式为
-11f(x)dx≈k=1nAkf(xk)
此积分公式即成为高斯-勒让德积分公式。
其中Gauss-Legendre求积公式的系数
Ak=-11ρxωnxx-xkω'nxdx=-11ρxLnxx-xkL'nxdx
其中k的取值范围为k=1,2,⋯,n
Gauss点和系数不容易计算,但是在实际计算中精度要求不是很高,所以给出如下表所示的部分Gauss点xk和系数Ak,在实际应用中只需查表即可。
n
x
A
n
x
A
1
0
2
6
±0.9324695142
±0.6612093865
±1.2386191816
0.171324492
0.360761573
0.467913934
2
±0.5773502692
1
7
±0.9491079123
±0.7415311856
±0.4058451514
0
0.129484966
0.279705391
0.381830050
0.417959183
3
±0.77459666920
0
0.5555555556
0.8888888889
4
±0.8611363116
±0.3399810436
0.3478548451
0.6521451549
8
±0.9602898565
±0.7966664774
±0.5255324099
±0.1834346425
0.101228536
0.222381034
0.313706645
0.362683783
5
±0.9061798459
±0.5384693101
0
0.2369268851
0.4786286705
0.5688888889
2) 高斯-拉盖尔(Gauss-Laguerre)积分公式
拉盖尔(Laguere)多项式
Lnx=exdndxn(xne-x),0≤x<+∞,n=0,1,2⋯
称为拉盖尔多项式。其首项系数为(-1)n,且具有性质:
正交性,在区间0,+∞上关于权函数ρx=e-x正交,而且
Lm,Ln=0∞e-xLm(x)Ln(x)dx=0, m≠n(n!)2, m=n
积分区间为0,+∞,权函数为ρx=e-x的Gauss型积分公式称为高斯-拉盖尔积分公式,其中Gauss点为拉盖尔多项式Lnx的零点,高斯-拉盖尔积分公式为
0∞e-xf(x)dx≈k=1nAkf(xk)
同样高斯-拉盖尔积分公式的Gauss点和求积系数如下表所示:
n
x
A
n
x
A
2
0.5857864376
3.4142135624
0.8535533905
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.0103991975
0.0002610172
0.0000008985
3) 高斯-埃尔米特(Gauss-Hermite)积分公式
埃尔米特(Hermite)多项式
Hnx=(-1)nex2dne-x2dxn,-∞<x<+∞,n=0,1,2⋯
被称作埃尔米特多项式,其首项系数为2n,具有性质如下
正交性,在区间-∞,+∞上关于权函数e-x2正交,而且
Hm,Hn=-∞+∞e-x2Hm(x)Hn(x)dx=0, m≠n2nn!π, m=n
积分区间为-∞,+∞,权函数为ρx=e-x2的Gauss型积分公式称为Gauss-Hermite积分公式,其Gauss点就是Hermite正交多项式Hnx的零点。Gauss-Hermite求积公式为
-∞∞e-x2f(x)dx≈k=1nAkf(xk)
同样高斯-埃尔米特积分公式的Gauss点和求积系数如下表所示:
n
x
A
n
x
A
2
±0.7071067811
0.8862269255
7
±0.4360774119
±1.3358490704
±2.3503049736
0.7246295952
0.1570673203
0.0045300099
3
±1.2247448714
0
0.2954089751
1.8163590006
4
±0.5246476232
±1.6506801238
0.8049140900
0.0813128354
8
±0.8162878828
±1.6735516287
±2.6519613563
0
0.4256072526
0.0545155828
0.0009717812
0.8102646175
5
±0.9585724646
±2.0201828704
0.3936193231
0.0199532421
0.9453087204
0.5688888889
3、算法实例
1) 用3点Gauss型求积公式计算-11cosxdx
解:根据积分限可以知道应该用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.53846931010,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};
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];}break;
default:
cout<<"输入出错,请从新输入!!"<<endl;
break;
}
for(i=0;i<n;i++)
{
sum=sum+A[i]*cos(x[i]);
}
cout<<sum;
}
运行结果:
2) 用两点Gauss型求积公式计算积分0∞e-10xsinxdx
解:根据积分限可以知道应该用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;
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.8535533905,0.1464466094};
double A3[]={0.7110930099,0.2785177335,0.0103892565};
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.0103991975,0.0002610172,0.0000008985};
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;
}
运行结果:
3) 用两点Gauss型求积公式计算积分-∞∞e-x2cosxdx
解:根据积分限可以知道应该用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.0201828704,2.0201828704};
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
12
展开阅读全文