C#Math.Net - 多项式拟合3阶产生意想不到的等式?

时间:2017-03-01 15:33:43

标签: c# excel polynomial-math mathdotnet

我有一个包含4个点的图表:

{0.0,0.0}, {4687500.0,10647580.9}, {4687500.1,10647580.9}, {7500000.0,10213609.9},

使用这些点,在Excel中我绘制了一个三阶多项式拟合,它给出了等式:

y = -4E-14x3 + 2E-07x2 + 1.5x + 2E + 06

完美,正是我需要绘制的曲线(Excel绘制的曲线是现货)。

然而,当我使用C#Math.Net库来绘制使用完全相同的4个点的三阶多项式拟合时,我得到一组完全不同的系数(因此是一个非常不同的方程和图形)。

var coefficients = MathNet.Numerics.Fit.Polynomial(budgets, profits, 3);   

为什么会出现这种情况?当我使用二阶时,系数完全匹配,所以我想知道Math.Net三阶函数是否有特殊之处。

Excel曲线上升,后来逢低(我正在追求)。

Math.NET曲线上升,下降,然后再次上升。

编辑:我们使用的是3阶而不是2阶,因为我们需要在绘制曲线时将10647580.9保持为最高Y点。

1 个答案:

答案 0 :(得分:1)

对任何偶然发现此事的人发表评论。对于Excel或Numerics,此计算的精度极限约为15位。有点不精确的结果。当我在Math.Net中完全重现计算时,它运行正常,但是当我将所有数字除以1,000时,它与#34; Matrix必须是肯定的"错误。

另一个例子:

x = new double[] { 0.0, 1.0, 2.0, 3.0, 4.0 };
            y = new double[] { 10.0, 11.0, 12.0, 13.0, 14.0 };
            rslt = MathNet.Numerics.Fit.Polynomial(x, y, 3, DirectRegressionMethod.QR);
            Console.WriteLine("Test - QR");
            for (int i = 0; i < rslt.Length; i++) Console.WriteLine(i.ToString() + "  " + rslt[i].ToString());

返回

0  10
1  0.999999999999994
2  1.18687833744435E-15
3  0

我怀疑拟合多项式是OP的最佳解决方案。它们并不像人们希望的那样灵活。