收藏 分销(赏)

Gauss型积分公式.docx

上传人:天**** 文档编号:4584529 上传时间:2024-09-30 格式:DOCX 页数:14 大小:63.83KB 下载积分:8 金币
下载 相关 举报
Gauss型积分公式.docx_第1页
第1页 / 共14页
Gauss型积分公式.docx_第2页
第2页 / 共14页


点击查看更多>>
资源描述
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型求积公式计算-11cos⁡xdx 解:根据积分限可以知道应该用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
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服