纯虚函数和抽象类的应用在积分计算中,通常将积分区间分成若干个小区间,在每个小区间上采用低阶求积公式,然后把所有小区间上的计算结果加起来得到整个区间上的求积公式,这就是复化求积公式的基本思想。常用的复化求积公式有复化梯形公式和复化辛普森公式。复化求积方法对于提高计算精度是行之有效的方法,但复化公式的一个主要缺点在于要先估计出步长。若步长太大,则难以保证计算精度,若步长太小,则计算量太大,并且积累误差也会增大。在实际计算中通常采用变步长的方法,即把步长逐次分半,直至达到某种精度为止。变步长复化求积法的基本思想是在求积过程中,通过对计算结果精度的不断估计,逐步改变步长(逐次分半),直至满足精度要求为止。即按照给定的精度实现步长的自动选取。设将积分区间[a,b]n等分,即分成n个子区间,一共有n+1个节点,即x=a+kh,k=0,1,…,n,步长。对于某个子区间,利用梯形公式计算积分近似值有)()(21kkxfxfh101)()(2nkkknxfxfhT对整个区间[a,b]有nabh1,kkxx将子区间再二等份,取其中点作新节点,此时区间数增加了一倍为2n,对某个子区间,利用复化梯形公式计算其积分近似值。1,kkxx)(21121kkkxxx1,kkxx)()(2)(4121kkkxfxfxfh对整个区间[a,b]有1012)()(2)(421nkkkknxfxfxfhT10101)(2)()(421nkknkkkxfhxfxfh比较和有102)(2221nkknnxfhTTnTnT2当把积分区间分成n等份,用复化梯形公式计算积分I的近似值时,截断误差为nT)(122nnnfnababTIR若把区间再分半为2n等份,计算出定积分的近似值,则截断误差为nT2)(2122222nnnfnababTIR当在区间[a,b]上变化不大时,有)(xf)()(2nnff412nnTITI所以可见,当步长二分后误差将减至,将上式移项整理,可得验后误差估计式41)(3122nnnTTTI上式说明,只要二等份前后两个积分值和相当接近,就可以保证计算结果的误差很小,使接近于积分值I。nTnT2nT2nT2(1)变步长的梯形求积法的计算步骤①变步长梯形求积法。它是以梯形求积公式为基础,逐步减少步长,按如下递推公式求二分后的梯形值102)(2221nkknnxfhTT其中Tn和T2n分别代表二等分前后的积分值②如果,(ε为给定的误差限)则T2n作为积分的近似值,否则继续进行二等分,即转①再计算,直到满足所要求的精度为止,最终取二分后的积分值T2n作为所求的结果nnTT2nnTThh2,2变步长的梯形求积算法实现变步长梯形公式的流程图开始输入a,b,εb-ah,2hf(a)+f(b)T10S,a+h/2xS+f(x)S,x+hxxb?n(T1+h*S)/2T2T2-T1≥ε?T2T1yh/2h输出T2结束ny为了保证算法对任意函数f(x)都可以使用,则需要定义一个抽象类F,通过对他的派生,具体实现不同的函数通过对“()”运算符的重载完成函数的实现classF/*抽象类F的声明,这是一个被积分函数类,需要用不同的函数来覆盖实现不同函数的积分*/{public:virtualdoubleoperator()(doublex)const=0;//用纯虚函数重载运算符()};为了保证算法对任意积分方法都可以使用,则需要定义一个抽象类Integ,通过对他的派生,具体实现不同的积分方法通过对“()”的重载,完成对不同积分方法的实现classInteg//总的积分类,是抽象类,需要不同的积分的方法来覆盖{public:virtualdoubleoperator()(doublea,doubleb,doubleeps)const=0;};函数f(x)的实现,需要继承F类,并且实现其中的虚函数,即对“()”的重载classFun:publicF//函数log(1+x)/(1+x^2){public:doubleoperator()(doublex)const//虚函数的实现,而且是常成员函数(不能更新对象的数据成员){returnlog(1.0+x)/(1.0+x*x);}};积分函数的实现,需要继承Integ类,并且实现其中的虚函数,即对“()”的重载classTrapz:publicInteg//这就是用变步长梯形求积公式来覆盖积分类的。{public:Trapz(constF&pf):f(pf){};//构造函数,由于有常类型数据,所以要以参数列表的形式对其赋值doubleoperator()(doublea,doubleb,doubleeps)const;//对函数f的积分公式private:constF&f;//F类对象的指针};积分函数的实现doubleTrapz::operator()(doublea,doubleb,doubleeps)const{intdone(0);//就是一个整数intn;doubleh,Tn,T2n;n=1;h=b-a;Tn=h*(f(a)+f(b))/2.0;//n=1时候的积分值coutnTnendl;returnT2n;}while(!done){doubletemp(0.0);for(intk=0;kn;k++)//对n份进行求和{doublex=a+(k+0.5)*h;temp+=f(x);}T2n=(Tn+h*temp)/2.0;cout2*nT2nendl;if(fabs(T2n-Tn)eps)done=1;else{Tn=T2n;n*=2;h/=2;}}#includeiomanip#includeiostream#includeTrapzint.husingnamespacestd;intmain(){Funf;Trapztrapz1(f);Trapztrapz2(f2);coutTRAPZIntegral:setprecision(7)trapz1(0,2,1e-7)endl;}1.用变步长梯形求积法计算定积分2.用变步长梯形求积法计算函数10dsinxxxI322xyx与函数所围成图象的面积3y题目1做在作业本上,题目二下周二上机完成后上传到FTP按以上原理,每次积分将步长降为1/3h变步长梯形积分是龙贝格(Romberg)求积法的引理,查找相关资料完成龙贝格求积法