首页/文章/ 详情

数值微分|多项式的导数计算C++版

1月前浏览270

在数值积分推导辛普森公式时就是将函数插值成为多项式形式,原因在于多项式的简洁。任何初等函数都可以用泰勒公式展开成多项式的形式,然后在多项式的基础上作求导运算。也可以用别的插值方法,比如拉格朗日插值,样条插值,埃尔米特插值等等。

如果    作为一组离散数据点给出,则插值会非常有效。通常建议将多项式的阶数应该小于6,以避免振荡。

    /*C++定义多项式就是将多项式系数保存在一个容器vector中,比如将 1 + x + 2xˆ2 + 3xˆ3 + 4xˆ4 定义为vector<double> p{1,1,2,3,4}*/

    四阶多项式

     

    可写成

     

     

    这里,     一样。对于    次多项式

     

    有以下递推式

     

    两边对    求一阶导,得

     

    对    求二阶导,得

     

    以上过程就体现了多项式的简洁。

    CPP代码:

      /*p = a[0] + a[1]*x + a[2]*xˆ2 +...+ a[n]*xˆn计算多项式p的一阶导数dp以及二阶导数ddp*/#include <iostream> #include <vector>class Polynomials{public:  Polynomials() = default;  Polynomials(std::vector< double > a_) : a{a_}  {  }  void evalPolynomials(double x){    double p = a.back();    double dp{ };    double ddp{ };    for(size_t i{1}; i<a.size(); ++i )    {      ddp = ddp * x + 2.0 * dp;      dp = dp * x + p;      p = p * x + a[a.size()-1 - i];    }        std::cout << "多项式在x=" << x << "处的函数值为:   " << p << std::endl;        std::cout << "多项式在x=" << x << "处的一阶导数为:" << dp << std::endl;        std::cout << "多项式在x=" << x << "处的二阶导数为:" << ddp << std::endl;   }private:  std::vector< double > a{};    //多项式的系数  };//分割线,以上定义多项式类Polynomialsint main(){  std::vectordouble > a{ 1,1,2,3,4 };Polynomials pol(a)//创建多项式对象pol = 1 + x + 2xˆ2 +3xˆ3 + 4xˆ4  pol.evalPolynomials(2.2); return 0;}

      ★★★★往期相关★★★★

      数值微分|多项式的导数计算

      通过案例学Python之定义函数类

      数值积分|第二类反常积分

      数值积分|第一类反常积分

      数值积分|中点法则(Midpoint Rule)

      数值积分|龙贝格公式

      数值积分|自适应辛普森积分公式

      数值积分|自适应梯形积分

      数值积分|牛顿-柯特斯公式

      数值积分|高斯积分

      数值积分|泰勒(Taylor)公式求积分

      数值积分| 辛普森公式

      Python实现辛普森公式

      来源:数值分析与有限元编程
      python
      著作权归作者所有,欢迎分享,未经许可,不得转载
      首次发布时间:2024-04-02
      最近编辑:1月前
      太白金星
      本科 慢慢来
      获赞 2粉丝 4文章 288课程 0
      点赞
      收藏

      作者推荐

      未登录
      还没有评论

      课程
      培训
      服务
      行家

      VIP会员 学习 福利任务 兑换礼品
      下载APP
      联系我们
      帮助与反馈