首页/文章/ 详情

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

8月前浏览3539

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

如果    作为一组离散数据点给出,则插值会非常有效。通常建议将多项式的阶数应该小于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{};    //多项式的系数  };
//分割线,以上定义多项式类Polynomials
int 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
最近编辑:8月前
太白金星
本科 慢慢来
获赞 6粉丝 17文章 327课程 0
点赞
收藏
作者推荐

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

在数值积分推导辛普森公式时就是将函数插值成为多项式形式,原因在于多项式的简洁。任何初等函数都可以用泰勒公式展开成多项式的形式,然后在多项式的基础上作求导运算。也可以用别的插值方法,比如拉格朗日插值,样条插值,埃尔米特插值等等。如果 作为一组离散数据点给出,则插值会非常有效。通常建议将多项式的阶数应该小于6,以避免振荡。##python定义多项式就是将多项式系数保存在一个列表中p = a[n]for i in range(1,n+1): p = a[n-i] + p*x 四阶多项式 可写成 令 这里, 一样。对于 次多项式 有以下递推式 两边对 求一阶导,得 对 求二阶导,得 以上过程就体现了多项式的简洁。Python代码:&quot;&quot;&quot;p = a[0] + a[1]*x + a[2]*xˆ2 +...+ a[n]*xˆn计算多项式p的一阶导数dp以及二阶导数ddp&quot;&quot;&quot;class Polynomials: def __init__(self, a): self.a = a # 计算多项式的一阶导数dp以及二阶导数ddp def evalPolynomials(self,x): n = len(self.a) - 1 p = self.a[n] dp = 0.0 ddp = 0.0 for i in range(1,n+1): ddp = ddp*x + 2.0*dp dp = dp*x + p p = p*x + self.a[n-i] return p,dp,ddp### 创建多项式对象px = 1 + x + 2xˆ2 + 3xˆ3 + 4xˆ4px = Polynomials([1,1,2,3,4])## px在x=1处的一阶导数与二阶导数[p0,p1,p2] = px.evalPolynomials(1)print(p0,p1,p2) ★★★★往期相关★★★★通过案例学Python之定义函数类数值积分|第二类反常积分数值积分|第一类反常积分数值积分|中点法则(Midpoint Rule)数值积分|龙贝格公式数值积分|自适应辛普森积分公式数值积分|自适应梯形积分数值积分|牛顿-柯特斯公式数值积分|高斯积分数值积分|泰勒(Taylor)公式求积分数值积分| 辛普森公式Python实现辛普森公式来源:数值分析与有限元编程

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈