2017-10-09 160 views
2

我正在编写函数,它将使用scipy.interpolate函数计算python中的1d插值。使用文档帮助我写了2个不同的函数,用于立方和三次样条插值scipy中二次样条插值和二次样条插值之间的区别

# 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之间的区别是什么? ('linear','nearest','zero','slinear','quadratic','cubic','slinear','quadratic'和'cubic'指的是第一个样条插值,二阶或三阶),那么为什么我必须为三次样条函数编写不同的函数,而不是仅仅改变它为kind=cubic

回答

2

它们都返回相同的样条线,尽管在内部,实现是不一样的(interp1d更多最近并且拥有更高的Python代码百分比,与几乎所有Fortran代码的splrep相比)。 “二次”表示与二次相同,“立方”表示三次。一些区别:

  • 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