【问题标题】:C# Math.Net - Polynomial Fit 3rd order produces unexpected equation?C# Math.Net - 多项式拟合三阶产生意想不到的方程?
【发布时间】:2017-03-01 15:33:42
【问题描述】:

我有一个包含 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 个点绘制一个 3 阶多项式拟合时,我得到了一组完全不同的系数(因此方程和图表也大不相同)。

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

任何想法为什么会这样?当我使用二阶时,系数完全匹配,所以我想知道 Math.Net 三阶函数是否有什么特别之处。

Excel 曲线上升,然后下降(我所追求的)。

Math.NET 曲线上升、下降,然后在接近尾声时再次上升。

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

【问题讨论】:

  • “这是完美的,正是我需要绘制我所追求的曲线(Excel 绘制的曲线是正确的)。”。你在X = 0.0 有 200 万个错误,所以我不太确定 spot on 对你意味着什么。
  • 你为什么还要使用三阶拟合?您的示例是二阶曲线。
  • Excel 曲线适合这种情况。 2 阶的问题是这将绘制高于最高点 ({4687500.0, 10647580.9}) 的点,在 Excel 中使用 3 阶会强制将此输入值保持为最高点,这是在这种情况下所需要的。
  • 这完全取决于数据。三阶拟合完全不能保证这一点。只是在 this 特定的一组点中恰好是这样。
  • 你能在 Excel 中生成一个不适合这种方法的 4 点案例吗? (请记住,我们在第三点强制使用 .1 来创建必要的形状)

标签: c# excel polynomial-math math.net


【解决方案1】:

对于后来偶然发现此问题的任何人的评论。此计算处于 Excel 或 Numerics 的精度极限,约为 15 位。结果有点不准确。当我在 Math.Net 中准确重现计算时,它运行良好,但是当我将所有数字除以 1,000 时,它因“矩阵必须是正定的”错误而崩溃。

另一个例子:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2016-06-20
    • 2016-02-01
    • 1970-01-01
    • 2012-01-05
    相关资源
    最近更新 更多