变步长梯形积分算法求函数定积分ppt课件.ppt
纯虚函数和抽象类的应用,变步长梯形积分算法求定积分,在积分计算中,通常将积分区间分成若干个小区间,在每个小区间上采用低阶求积公式,然后把所有小区间上的计算结果加起来得到整个区间上的求积公式,这就是复化求积公式的基本思想。常用的复化求积公式有复化梯形公式和复化辛普森公式。复化求积方法对于提高计算精度是行之有效的方法,但复化公式的一个主要缺点在于要先估计出步长。若步长太大,则难以保证计算精度,若步长太小,则计算量太大,并且积累误差也会增大。在实际计算中通常采用变步长的方法,即把步长逐次分半,直至达到某种精度为止。,变步长梯形求积法,变步长复化求积法的基本思想是在求积过程中,通过对计算结果精度的不断估计,逐步改变步长(逐次分半),直至满足精度要求为止。即按照给定的精度实现步长的自动选取。,变步长的梯形公式,设将积分区间a,bn等分,即分成n个子区间,一共有n+1个节点,即x=a+kh, k=0,1,,n,步长 。对于某个子区间 ,利用梯形公式计算积分近似值有,对整个区间a,b有,将子区间 再二等份,取其中点作新节点,此时区间数增加了一倍为2n,对某个子区间 ,利用复化梯形公式计算其积分近似值 。,对整个区间a,b有,比较 和 有,当把积分区间分成n等份,用复化梯形公式计算积分I的近似值 时,截断误差为,若把区间再分半为2n等份,计算出定积分的近似值 ,则截断误差为,当 在区间a,b上变化不大时,有,所以,可见,当步长二分后误差将减至 ,将上式移项整理,可得验后误差估计式,上式说明,只要二等份前后两个积分值和 相当接近,就可以保证计算结果的误差很小,使 接近于积分值I。,(1)变步长的梯形求积法的计算步骤 变步长梯形求积法。它是以梯形求积公式为基础,逐步减少步长,按如下递推公式求二分后的梯形值,其中Tn和T2n分别代表二等分前后的积分值, 如果 , (为给定的误差限 ) 则T2n作为积分的近似值, 否则继续进行二等分, 即转 再计算,直到满足所要求的精度为止,最终取二分后的积分值T2n 作为所求的结果,变步长的梯形求积算法实现,变步长梯形公式的流程图,为了保证算法对任意函数f(x)都可以使用,则需要定义一个抽象类F,通过对他的派生,具体实现不同的函数通过对“()”运算符的重载完成函数的实现class F /*抽象类F的声明,这是一个被积分函数类,需要用不同的函数来覆盖实现不同函数的积分*/public:virtual double operator()(double x) const = 0; /用纯虚函数重载运算符();,类设计抽象类,为了保证算法对任意积分方法都可以使用,则需要定义一个抽象类Integ,通过对他的派生,具体实现不同的积分方法通过对“()”的重载,完成对不同积分方法的实现class Integ /总的积分类,是抽象类,需要不同的积分的方法来覆盖public:virtual double operator ()(double a, double b, double eps) const = 0;,类设计抽象类,函数f(x)的实现,需要继承F类,并且实现其中的虚函数,即对“()”的重载class Fun: public F /函数log(1+x)/(1+x2)public:double operator()(double x) const /虚函数的实现,而且是常成员函数(不能更新对象的数据成员) return log(1.0 + x)/(1.0 + x*x);,类设计派生类,积分函数的实现,需要继承Integ类,并且实现其中的虚函数,即对“()”的重载class Trapz : public Integ /这就是用变步长梯形求积公式来覆盖积分类的。public:Trapz (const F ,类设计派生类,类设计派生类,积分函数的实现double Trapz:operator ()(double a, double b, double eps) constint done(0); /就是一个整数int n;double h, Tn, T2n;n = 1;h = b - a;Tn = h*(f(a)+f(b)/2.0; /n=1时候的积分值cout n Tn endl;return T2n;,while (!done) double temp(0.0); for (int k = 0; k n; k+) /对n份进行求和 double x = a + (k+0.5)*h; temp += f(x); T2n = (Tn + h*temp)/2.0; cout 2*n T2n endl; if (fabs(T2n - Tn) eps) done = 1; else Tn = T2n; n *= 2; h /= 2; ,#include #include #include Trapzint.husing namespace std;int main ()Fun f;Trapz trapz1(f);Trapz trapz2(f2);cout TRAPZ Integral: setprecision(7) trapz1 (0, 2, 1e-7) endl;,主函数,用变步长梯形求积法计算定积分用变步长梯形求积法计算函数,作业,与函数 所围成图象的面积,题目1做在作业本上,题目二下周二上机完成后上传到FTP,按以上原理,每次积分将步长降为1/3h变步长梯形积分是龙贝格(Romberg)求积法的引理,查找相关资料完成龙贝格求积法,选做题,