2011-11-21 32 views
9

私はMatLabプログラムをPythonに変換していますが、なぜscipy.interpolate.interp1dがMatLab interp1と異なる結果をもたらすのか理解できていません。SciPy interp1dの結果がMatLab interp1と異なる

MATLABでの使用量がわずかに異なっている:

yi = interp1(x,Y,xi,'cubic') 

scipyのダウンロード:

f = interp1d(x,Y,kind='cubic') 
yi = f(xi) 

簡単な例の結果は同じである: MatLabの:

interp1([0 1 2 3 4], [0 1 2 3 4],[1.5 2.5 3.5],'cubic') 
    1.5000 2.5000 3.5000 

パイソン。

interp1d([1,2,3,4],[1,2,3,4],kind='cubic')([1.5,2.5,3.5]) 
    array([ 1.5, 2.5, 3.5]) 

しかし、実際の例のために、彼らは同じではありません。

x = 0.0000e+000 2.1333e+001 3.2000e+001 1.6000e+004 2.1333e+004 2.3994e+004 
Y = -6 -6 20 20 -6 -6 
xi = 0.00000 11.72161 23.44322 35.16484... (2048 data points) 

Matlabの:

-6.0000e+000 
-1.2330e+001 
-3.7384e+000 
    ... 
7.0235e+000 
7.0028e+000 
6.9821e+000 

scipyのダウンロード:どのように私ができるによう

array([[ -6.00000000e+00], 
     [ -1.56304101e+01], 
     [ -2.04908267e+00], 
     ..., 
     [ 1.64475576e+05], 
     [ 8.28360759e+04], 
     [ -5.99999999e+00]]) 

任意の考えMatLabと一致する結果を得る?

編集:キュービック補間アルゴリズムの実装には多少の寛容さがあると私は理解していますが、これはおそらく私が見ている違いを説明しています。また、私が変換しようとしている元のMatLabプログラムは線形補間を使用していたはずなので、おそらく問題はないでしょう。

答えて

11

scipy.interpolate.interp1dinterp1が異なる基本補間方法です。 Scipyはnetlib fitpackルーチンを使用しており、これは標準のC2連続3次スプラインを生成します。 interp1の "3次"引数は、C2連続ではない区分的立方晶ヘマタイト補間多項式を使用します。 Matlabの機能については、hereを参照してください。

私はそれがあなたが見ている違いの原因だと思う。

0

http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.PchipInterpolator.html これは、渡されたy = f(x)の単調3次補間を作成し、pchipアルゴリズムを使用して点の傾きを決定します。

したがって、(x、y)が渡され、pchipアルゴリズムは(x、dy/dx)を計算し、これらの点では既知の導関数を持つ2つの点を通過する立方体のみが存在します。建設ごとに、それは連続一次導関数と連続する。