【问题标题】:Difference between quadratic and 2nd order spline interpolation in scipyscipy中二次和二阶样条插值的区别
【发布时间】:2023-03-27 02:07:01
【问题描述】:

我正在编写函数,这些函数将使用scipy.interpolate 函数在 python 中计算一维插值。使用文档的帮助,我为三次和三次样条插值编写了 2 个不同的函数

# calculate cubic interpolation 
def linear_interpolation(x):
    linear = interpolate.interp1d(support_x, support_y, 'cubic')
    return linear(x)

# calculate cubic spline interpolation
def cubic_spline_interpolation(x):
    tck = interpolate.splrep(support_x, support_y)
        return interpolate.splev(x, tck)

我对这里的方法有点困惑。如果我使用 interpolate.interp1d(support_x, support_y, 'cubic') ,这与 cubic spline 方法不同吗?还有kind = 'quadratic'second order spline有什么区别?

documentation 说:

“零”、“线性”、“二次”和“三次”指的是样条曲线 零阶、一阶、二阶或三阶插值

那么为什么我必须为三次样条编写不同的函数而不是将其更改为kind='cubic'

【问题讨论】:

    标签: python scipy interpolation spline


    【解决方案1】:

    它们都返回相同的样条线,尽管在内部,实现并不相同(interp1d 是更新的并且具有更大的 Python 代码百分比,而 splrep 几乎是所有 Fortran 代码)。 “二次”与 2 度相同,“三次”为 3 度。一些区别:

    • splrep 及其近亲UnivariateSpline 是功能更丰富的样条构造例程;它们允许创建非插值样条曲线的平滑参数。
    • 如果您不需要平滑,interp1d 可能更易于使用。

    无论如何,这远非 SciPy 中唯一的冗余功能实例。添加了新方法和参数,但保留旧方法和参数以实现向后兼容性。

    历史记录:在旧版本的 SciPy(例如 0.15.1)中,interp1d 返回的样条曲线与splrep 相比质量较低(此答案的第一个修订版基于版本 0.15.1) .在当前版本 0.19.1 中不再存在此问题:两者都返回相同的样条。这是一个演示:

    import numpy as np
    from scipy.interpolate import interp1d, splrep, splev
    
    x = np.linspace(0, 6, 7)
    y = np.array([3, 1, 4, 1, 5, 5, 2])    # some data
    xx = np.linspace(0, 6, 100)            # evaluation points   
    
    y1 = interp1d(x, y, kind='cubic')(xx)
    y2 = splev(xx, splrep(x, y, k=3))
    print(np.abs(y1-y2).max())
    
    y1 = interp1d(x, y, kind='quadratic')(xx)
    y2 = splev(xx, splrep(x, y, k=2))
    print(np.abs(y1-y2).max())
    

    输出显示两个例程在典型的数值错误范围内一致。

    2.6645352591e-15
    1.7763568394e-15
    

    【讨论】:

      猜你喜欢
      • 2021-10-18
      • 2013-04-02
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 2017-03-06
      • 2019-08-05
      • 2011-09-08
      相关资源
      最近更新 更多