在数值积分推导辛普森公式时就是将函数插值成为多项式形式,原因在于多项式的简洁。任何初等函数都可以用泰勒公式展开成多项式的形式,然后在多项式的基础上作求导运算。也可以用别的插值方法,比如拉格朗日插值,样条插值,埃尔米特插值等等。
如果 作为一组离散数据点给出,则插值会非常有效。通常建议将多项式的阶数应该小于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{}; //多项式的系数
};
//分割线,以上定义多项式类Polynomials
int 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;
}
★★★★往期相关★★★★