scipy 中二次样条插值和二阶样条插值之间的差异

Difference between quadratic and 2nd order spline interpolation in scipy

我正在编写将使用 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 说:

‘zero’, ‘slinear’, ‘quadratic’ and ‘cubic’ refer to a spline interpolation of zeroth, first, second or third order

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

它们都 return 相同的样条,尽管在内部,实现是不一样的(interp1d 更新并且具有更大的 Python 代码百分比,与 splrep 这几乎是所有 Fortran 代码)。 "Quadratic"和2度一样,"cubic"是3度。一些区别:

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

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

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

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