计算方法-数值积分

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

数值积分小组成员:引言在数学分析中,当f(x)在区间[a,b]上连续且具有原函数F(x)时,我们往往采用Newton-Leibniz公式来求积分:然而,随着学习的深化,发现牛顿-莱布尼兹公式存在的很大的局限性)()()()(aFbFabxFdxxfabNewton-Leibniz公式的局限性对大多数f(x)而言,找原函数困难,即使存在原函数也不能用初等函数表示原函数表达式过于复杂被积函数由表格给出,没有解析形式,也无法使用Newton-Leibniz公式来求积分23sin,,1......xxexx32223xx数值积分为了避免上述积分过程中存在的问题,我们可以采用数值积分的方法来求解,这样就避免了原函数的求解过程,同时对于由测量或计算得到的数据表表示的f(x)也可以求解主要有五种方法,对应五种计算公式:梯形法中值法辛普森积分法高斯积分法高斯积分法-三点公式梯形公式3.532.521.510.5-0.5-1-1.5-2-2.5-0.50.511.522.533.5x0x0+x原理介绍:用一个梯形来近似代替每个子区间的面积,如下图所示,用图中阴影部分梯形面积替代曲边梯形的面积,积分过程如下图所示:)3())0()0((21)(00xOxxxfxfdxxfxxxI梯形公式而对于整个区间[x0,x1],可通过累加求和得到,其中区间[x0,x1]被分为n等份,每个区间长度为,因此区间[x0,x1]上的积分可通过下述式子得到xdxxfxixxixdxxfxx)()1(00)(10))1(0()0(2xixfxixfx)]1())1(0(2...)2)0((2)0(2)0([2xfxnxfxxfxxfxfx梯形公式算法for(inti=0;i20;i++){area1=0;x=PI/intervals[i];for(intj=0;jintervals[i];j++){area1=area1+0.5*(f(j*x)+f(j*x+x))*x;}doublee=(area1-2)/area2;area2=area1-2;coutsetiosflags(ios::left)setw(6)intervals[i]setw(7)intervals[i]+1setw(20)area1-2setw(6)eendl;}辛普森积分法x0x0+x0+xx23.532.521.510.5-0.5-1-1.5-2-2.5-0.50.511.522.533.5原理介绍:把区间[x0,x1]分为2n等分,n个区间,在长度为的区间上进行泰勒展开,可得区间[x0,x0+]上的积分形式如下所示:x2x2)5())20()0(4)0((3)(200xOxxfxxfxfxdxxfxxx辛普森积分法3.532.521.510.5-0.5-1-1.5-2-2.5-0.50.511.522.533.5辛普森求积公式的几何意义是用一条过三点的抛物线(如上图中三点)近似代替被积函数的曲线,从而用一个二次抛物线所围成的容易计算的曲边梯形面积(图中阴影部分)来近似代替原来的曲边梯形的面积.x0x0+x0+xx2辛普森积分法通过对n个区间按上述公式累加,可得区间[x0,x1]上的积分形式为))22(0())12(0(4)20(3)(10xixfxixfxixfxdxxfxx)]1())12(0(4...)20(2)0(4)0([3xfxnxfxxfxxfxfx注意:因为该公式是把区间[x0,x1]划分为2n等份,n个区间,因此在用循环求积分时,要注意其上下限辛普森算法代码for(inti=0;i20;i++){area1=0;x=PI/intervals[i];for(intj=0;jintervals[i];j++){area1=area1+x*(f(j*x)+4*f(j*x+0.5*x)+f(j*x+x))/6;}doublee=(area1-2)/area2;area2=area1-2;coutsetiosflags(ios::left)setprecision(12)setw(6)intervals[i]setw(7)intervals[i]*2+1setw(20)area1-2setw(6)eendl;}高斯积分通过待定系数法及泰勒展开找到两个相对精确的评估点高斯积分for(i=0;i10;i++){s=0;x=(x1-x2)/intervals[i];for(j=0;jintervals[i];j++)s+=function(x1+(0.5-sqrt(3.0)/6)*x+j*x)+function(x1+(0.5+sqrt(3.0)/6)*x+j*x);s=s*x/2;error1=s-2;Error_Ratio=error1/error2;error2=error1;coutsetiosflags(ios::left)setw(6)intervals[i]setw(7)intervals[i]*2setw(15)error1setw(10)Error_Ratioendl;}算法特色代码简洁,用一个双重循环,两个主要变量实现了计算过程,在空间和时间上做到了最优化。for(inti=0;i20;i++){area1=0;x=PI/intervals[i];for(intj=0;jintervals[i];j++){area1=area1+x*(f(j*x)+4*f(j*x+0.5*x)+f(j*x+x))/6;}doublee=(area1-2)/area2;area2=area1-2;}算法特色采用C++中类的思想用虚基类继承的方式实现五种不同的积分方法虚基类:classIntegration{public:virtualdoubleintegra()=0;Integration(){x1=0;x2=3.1415926;}Integration(doublet1,doublet2){x1=t1;x2=t2;}protected:doublex1,x2;doublef(doublex);//每个类只能对一个函数积分};继承的子类classTrapezium_Integration:publicIntegration{public:Trapezium_Integration(doublet1,doublet2){x1=t1;x2=t2;}doubleintegra();};doubleTrapezium_Integration::integra(){inti,j=0,intervals=1;doublexx,value_integ[20],x11;while(intervals=524288){x11=x1,value_integ[j]=0;xx=(x2-x1)/intervals;value_integ[j]=value_integ[j]+f(x11);//利用公式计算for(i=1;iintervals;i++){x11=x11+xx;value_integ[j]=value_integ[j]+f(x11)*2;}//x11=x11+xx;value_integ[j]=value_integ[j]+f(x2);value_integ[j]=value_integ[j]*xx/2;//最终积分值j++;intervals=intervals*2;}doublee[20];for(i=0;i20;i++)e[i]=value_integ[i]-2;cout.precision(15);for(j=0;j20;j++)coutvalue_integ[j]e[j]e[j+1]/e[j]endl;return0;}算法特色把所有积分方法放在一个.cpp文件中,以菜单形式进行选择算法特色结果输出清晰,且精度高,能保留到小数点后13位(中值法)算法特色将各方法的误差一次性输出,能直观的看出各积分方法的误差大小并进行比较总结通过本章的学习,我们更深刻的理解了数值积分的原理及实现方法,并且在小组讨论中,学习到了如何实现代码的简洁、减少变量的定义以及如何实现代码时间与空间的优化等,大家都有所收益

1 / 21
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功