微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 MathNet 库沿三次样条插值

如何解决使用 MathNet 库沿三次样条插值

我正在尝试使用 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.5 };
        ydata = new double[] { 3.07525894277935,6.67525894277935 };
        p = Fit.polynomial(xdata,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 这是正确的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。