2017-10-09 174 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