繁体   English   中英

C#Math.Net-多项式拟合三阶生成意外方程式?

[英]C# Math.Net - Polynomial Fit 3rd order produces unexpected equation?

我有一个带有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);   

任何想法为什么会这样? 当我使用2阶时,系数完全匹配,因此我想知道Math.Net 3阶函数是否有特殊之处。

Excel曲线上升,然后下降(我追随的趋势)。

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

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

对于任何在此之后迷迷糊糊的人的评论。 对于Excel或数字,此计算处于精度极限(大约15位数字)。 结果有些不精确。 当我精确地在Math.Net中重新生成计算时,它运行良好,但是当我将所有数字除以1000时,它崩溃并出现“矩阵必须为正定”错误。

另一个例子:

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的最佳解决方案。 它们并不像人们希望的那样灵活。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM