Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 估计将集合x映射到集合y的三次多项式_C#_Math_Polynomial Math - Fatal编程技术网

C# 估计将集合x映射到集合y的三次多项式

C# 估计将集合x映射到集合y的三次多项式,c#,math,polynomial-math,C#,Math,Polynomial Math,我有一组(采样的)未校准值(x)来自设备,还有一组它们应该是什么(y)。我正在寻找/估计将任何x映射到y的三次多项式y=ax^3+bx^2+cx+d 所以我想我需要做的是先进行多项式回归,然后再求逆,但我不太确定;我想知道是否有更好的解决方案,如最小二乘法 我希望能朝正确的方向轻推和/或链接到有用的数学库 您检查过Langrange插值吗? 它是关于给定函数的多项式逼近 你可以在一个独立变量的适当范围内,停止多项式的给定次数(比如第三次)的近似 参考文献: 看起来就像是多项式回归;我只需要

我有一组(采样的)未校准值(x)来自设备,还有一组它们应该是什么(y)。我正在寻找/估计将任何
x
映射到
y
的三次多项式
y=ax^3+bx^2+cx+d

所以我想我需要做的是先进行多项式回归,然后再求逆,但我不太确定;我想知道是否有更好的解决方案,如最小二乘法


我希望能朝正确的方向轻推和/或链接到有用的数学库

您检查过Langrange插值吗? 它是关于给定函数的多项式逼近

你可以在一个独立变量的适当范围内,停止多项式的给定次数(比如第三次)的近似

参考文献:


    • 看起来就像是多项式回归;我只需要输入原始(x)值和期望值(y)

      来自的代码,使用

      使用MathNet.Numerics.LinearAlgebra.Double;
      使用MathNet.Numerics.LinearAlgebra.Double.Factoriation;
      公共静态类多元回归
      {
      公共静态双[]多边形拟合(双[]x,双[]y,整数度)
      {
      //范德蒙矩阵
      var v=新密度矩阵(x.长度,度+1);
      for(int i=0;i对于(int j=0;j),我想我搞糊涂了,把它复杂化了;我想我只需要给定[x,y]集合的多项式回归。与许多参考文献类似。
      
      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();
          }
      }