数值微分|多项式的导数计算C++版
在数值积分推导辛普森公式时就是将函数插值成为多项式形式,原因在于多项式的简洁。任何初等函数都可以用泰勒公式展开成多项式的形式,然后在多项式的基础上作求导运算。也可以用别的插值方法,比如拉格朗日插值,样条插值,埃尔米特插值等等。如果 作为一组离散数据点给出,则插值会非常有效。通常建议将多项式的阶数应该小于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::vector< double > 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实现辛普森公式来源:数值分析与有限元编程