使用 MathNet 库沿三次样条插值

Using MathNet Library to Interpolate along a cubic spline

我正在尝试使用 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 值进行插值的正确方法是什么?

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

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

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 准确无误。