变步长梯形积分算法求函数定积分.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
纯虚函数和抽象类的应用 在积分计算中,通常将积分区间分成若干个小区间,在每个小区间上采用低阶求积公式,然后把所有小区间上的计算结果加起来得到整个区间上的求积公式,这就是复化求积公式的基本思想。常用的复化求积公式有复化梯形公式和复化辛普森公式。 复化求积方法对于提高计算精度是行之有效的方法,但复化公式的一个主要缺点在于要先估计出步长。若步长太大,则难以保证计算精度,若步长太小,则计算量太大,并且积累误差也会增大。在实际计算中通常采用变步长的方法,即把步长逐次分半,直至达到某种精度为止。 变步长复化求积法的基本思想是在求积过程中,通过对计算结果精度的不断估计,逐步改变步长(逐次分半),直至满足精度要求为止。即按照给定的精度实现步长的自动选取。 设将积分区间[a,b]n等分,即分成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+x^2) { public: double operator()(double x) const?? //虚函数的实现,而且是常成员函数(不能更新对象的数据成员) { ?? return log(1.0 + x)/(1.0 + x*x); } }; 积分函数的实现,需要继承Integ类,并且实现其中的虚函数,即对“()”的重载 class Trapz : public Integ //这就是用变步长梯形求积公式来覆盖积分类的。 { public: Trapz (const F pf):f(pf) {}; //构造函数,由于有常类型数据,所以要以参数列表的形式对其赋值 double operator ()(double a, double b, double eps) const; //对函数f的积分公式 private: const F f;??? //F类对象的指针 }; 积分函数的实现 double Trapz::operator ()(double a, double b, double eps) const { int done(0); //就是一个整数 int n; double h, Tn, T2n;

文档评论(0)

幽兰书苑 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档