【问题标题】:Using MathNet Library to Interpolate along a cubic spline使用 MathNet 库沿三次样条插值
【发布时间】:2021-06-30 16:00:40
【问题描述】:

我正在尝试使用 MathNet 库沿三次样条线插值以获取各种大小的数据。

如果我运行以下代码:

static void Main(string[] args)
    {
        double[] xdata = new double[] { 0.083, 0.25, 0.5, 0.75, 1, 2, 4, 6, 12, 18, 24, 48, 96, 192, 240 };
        double[] ydata = new double[] { 3.07525894277935, 5.17525894277935, 6.67525894277935, 7.57525894277935, 8.17525894277935, 11.8, 16.1289117118988, 19.0289117118988, 24.4536527691195, 27.8383211840501, 30.2383211840501, 36.4383211840501, 44.6247410572207, 58.3094094721513, 64.6975808035617 };
        double[] p = Fit.Polynomial(xdata, ydata, xdata.Count() - 1);

        Debug.WriteLine(Polynomial.Evaluate(0.25, p));

        xdata = new double[] { 0.083, 0.25, 0.5 };
        ydata = new double[] { 3.07525894277935, 5.17525894277935, 6.67525894277935 };
        p = Fit.Polynomial(xdata, ydata, xdata.Count() - 1);

        Debug.WriteLine(Polynomial.Evaluate(0.25, p));
    }

第一个结果是:5.5957876536350915。 这对我来说没有意义,因为它应该接近 5.17525894277935(我的 ydata 中的第二个值)。

上面代码的第二个简化结果给出了5.175258942779351,这是完美的。

当我有大量数据时(如第一个示例),评估样条以插入不同的 `X 值的正确方法是什么?

我应该将数据分成三个批次并依次计算,还是有更简单的方法?

【问题讨论】:

    标签: c# interpolation spline


    【解决方案1】:

    经过大量不同功能的实验,以下似乎是正确的方法。

    xdata = new double[] { 0.083, 0.25, 0.5, 0.75, 1, 2, 4, 6, 12, 18, 24, 48, 96, 192, 240 };
    ydata = new double[] { 3.07525894277935, 5.17525894277935, 6.67525894277935, 7.57525894277935, 8.17525894277935, 11.8, 16.1289117118988, 19.0289117118988, 24.4536527691195, 27.8383211840501, 30.2383211840501, 36.4383211840501, 44.6247410572207, 58.3094094721513, 64.6975808035617 };
    var q = CubicSpline.InterpolateAkimaSorted(xdata, ydata);
            
    Debug.WriteLine(q.Interpolate(0.25));
    

    这给出了一个答案:5.17525894277935 这是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-07
      • 2021-03-09
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多