我有一组(采样的)来自设备的未校准值(x)和一组它们应该是的值(y)。我正在寻找/估计y=ax^3 + bx^2 + cx + d
将任何映射x
到的三次多项式y
。
所以我认为我需要做的是首先进行多项式回归,然后找到它的逆,但我不太确定;我想知道是否有更好的解决方案,比如最小二乘法。
我将不胜感激朝着正确的方向轻推和/或任何指向有用的数学库的链接。
我有一组(采样的)来自设备的未校准值(x)和一组它们应该是的值(y)。我正在寻找/估计y=ax^3 + bx^2 + cx + d
将任何映射x
到的三次多项式y
。
所以我认为我需要做的是首先进行多项式回归,然后找到它的逆,但我不太确定;我想知道是否有更好的解决方案,比如最小二乘法。
我将不胜感激朝着正确的方向轻推和/或任何指向有用的数学库的链接。
你检查过朗朗日插值吗?它是关于给定函数的多项式逼近。
您可以在独立变量的适当范围内停止对多项式的给定次数(假设是 3 次)的逼近。
参考:
看起来它只是多项式回归;我只需要输入原始 (x) 值和预期值 (y)。
Rosetta Code中的代码,使用Math.Net Numerics
using MathNet.Numerics.LinearAlgebra.Double;
using MathNet.Numerics.LinearAlgebra.Double.Factorization;
public static class PolyRegression
{
public static double[] Polyfit(double[] x, double[] y, int degree)
{
// Vandermonde matrix
var v = new DenseMatrix(x.Length, degree + 1);
for (int i = 0; i < v.RowCount; i++)
for (int j = 0; j <= degree; j++) v[i, j] = Math.Pow(x[i], j);
var yv = new DenseVector(y).ToColumnMatrix();
QR qr = v.QR();
// Math.Net doesn't have an "economy" QR, so:
// cut R short to square upper triangle, then recompute Q
var r = qr.R.SubMatrix(0, degree + 1, 0, degree + 1);
var q = v.Multiply(r.Inverse());
var p = r.Inverse().Multiply(q.TransposeThisAndMultiply(yv));
return p.Column(0).ToArray();
}
}