给出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 + ...
答案 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}}