如何找到多项式方程的系数?

时间:2017-04-23 02:04:29

标签: c++ c numerical-methods numerical numerical-computing

给出x, y平面中的两个点:

x, f(x)
1, 3
2, 5

我可以使用拉格朗日对其进行插值并找到f(1.5),结果为4。稍微思考一下,我设法找到了发现方程系数的方法:

void l1Coefficients(const vector<double> &x, const vector<double> &y) {

    double a0 = y[0]/(x[0]-x[1]);
    double a1 = y[1]/(x[1]-x[0]);

    double b0 = (-x[1]*y[0])/(x[0]-x[1]);
    double b1 = (-x[0]*y[1])/(x[1]-x[0]);

    double a = a0 + a1;
    double b = b0 + b1;

    cout << "P1(x) = " << a << "x +" << b << endl;
}

这给了我P1(x) = 2x +1

多思考一下,我能够将其扩展到2nd阶方程式。所以,鉴于要点:

1, 1
2, 4
3, 9

我找到了等式P2(x) = 1x^2 +0x +0,其中包含以下内容:

void l2Coefficients(const vector<double> &x, const vector<double> &y) {

    double a0 =              y[0] / ((x[0]-x[1])*(x[0]-x[2]));
    double a1 =              y[1] / ((x[1]-x[0])*(x[1]-x[2]));
    double a2 =              y[2] / ((x[2]-x[0])*(x[2]-x[1]));

    double b0 = -(x[1]+x[2])*y[0] / ((x[0]-x[1])*(x[0]-x[2]));
    double b1 = -(x[0]+x[2])*y[1] / ((x[1]-x[0])*(x[1]-x[2]));
    double b2 = -(x[0]+x[1])*y[2] / ((x[2]-x[0])*(x[2]-x[1]));

    double c0 =  (x[1]*x[2])*y[0] / ((x[0]-x[1])*(x[0]-x[2]));
    double c1 =  (x[0]*x[2])*y[1] / ((x[1]-x[0])*(x[1]-x[2]));
    double c2 =  (x[0]*x[1])*y[2] / ((x[2]-x[0])*(x[2]-x[1]));

    double a = a0 + a1 + a2;
    double b = b0 + b1 + b2;
    double c = c0 + c1 + c2;

    cout << "P2(x) = " << a << "x^2 +" << b << "x +" << c << endl;
}

努力工作我实际上能够找到最多4阶的方程式的系数。

如何找到订单n方程的系数?哪里

Pn(x) = c_2x^2 + c_1x^1 + c_0x^0 + ...

2 个答案:

答案 0 :(得分:1)

这是一个简单的线性代数问题。

我们有一组形式为x k 的N个样本 - &gt; f(x k )我们知道函数f(x)的一般形式,即:

f(x)= c 0 x 0 + c 1 x 1 + ... + ç<子> N-1 X N-1

我们想要找到系数c 0 ... c N-1 。为此,我们构建了一个N形式的方程组:

c 0 x k 0 + c 1 x k 1 + ... + c N-1 x k N-1 = f(x k < /子>)

其中 k 是样本编号。由于x k 和f(x k )是常数而不是变量,我们有一个线性方程组。

用线性代数表示,我们必须解决:

Ac = b

其中A是 x 的幂Vandermonde matrix b 是f(x k )值的向量。

要解决此类系统,您需要一个线性代数库,例如Eigen。有关示例代码,请参阅here

这种方法唯一可能出错的是线性方程组不确定,如果你的N个样本可以用小于N-1的多项式拟合,就会发生这种情况。在这种情况下,您仍然可以使用Moore-Penrose伪逆解决此系统:

c = pinv(A)* b

不幸的是,Eigen没有pinv()实现,但在奇异值分解(SVD)方面,您自己编写代码非常容易。

答案 1 :(得分:0)

我创建了矩阵解决方案的简单实现:

{{1}}