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

如果 作为一组离散数据点给出,则插值会非常有效。通常建议将多项式的阶数应该小于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*/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ˆ4pol.evalPolynomials(2.2);return 0;}
★★★★往期相关★★★★