2011-11-21 17 views
9

MatLab programını Python'a dönüştürüyorum ve scipy.interpolate.interp1d'nin neden MatLab interp1'den farklı sonuçlar verdiğini anlamakta sorun yaşıyorum1. SciPy interp1d sonuçları, MatLab interp1'den farklıdır

MATLAB ile kullanımı biraz farklıdır:

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

scipy: 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 

Python

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

önemsiz Örneğin sonuçlar aynıdır:

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

Ama bir gerçek dünya örneğin aynı değildir:

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: Nasıl yardımcı olarak

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

Herhangi bir düşünce MatLab ile tutarlı sonuçlar aldınız mı?

Düzenleme: Gördüğüm farklılıkları açıklayan kübik enterpolasyon algoritmaları için uygulamada bazı enlemlerin olduğunu anlıyorum. Ayrıca, dönüştürdüğüm orijinal MatLab programının doğrusal enterpolasyon kullanması gerektiği, dolayısıyla sorunun büyük olasılıkla tartışıldığı görülmektedir.

cevap

11

scipy.interpolate.interp1d ve interp1'un temelindeki enterpolasyon yöntemi farklıdır. Scipy, standart, C2 sürekli kübik spline veren netlib fitpack rutinlerini kullanır. interp1'daki "kübik" argümanı, C2 sürekli olmayan parçalı kübik hermit enterpolasyon polinomlarını kullanır. Matlab'ın yaptığı şeyin açıklaması için here'a bakın.

Gördüğünüz farklılığın kaynağı olduğundan şüpheleniyorum.

0

Geçerli scipy'de http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.PchipInterpolator.html kullanın. Bu, geçen y = f (x) 'nin monoton kübik enterpolasyonunu oluşturacak ve noktalardaki eğimleri belirlemek için pchip algoritmasını kullanacaktır.

Her bölüm için, (x, y) sizin tarafınızdan geçirilir, pchip algoritması (x, dy/dx) değerini hesaplar ve bu noktalarda bilinen türevi olan 2 noktadan yalnızca kübik olur. Yapım başına, sürekli birinci türev ile sürekli olacaktır.