2011-11-21 12 views
9

Sto convertendo un programma MatLab in Python e sto avendo problemi a capire perché scipy.interpolate.interp1d sta dando risultati diversi rispetto a MatLab interp1.I risultati dell'interp1d di SciPy sono diversi da MatLab interp1

in MATLAB l'utilizzo è leggermente diverso:

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

SciPy:

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

Per un esempio banale i risultati sono gli stessi: 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:

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

Ma per un esempio reale che non sono la stessa cosa:

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]]) 

Tutti i pensieri su come posso ottenere risultati coerenti con MatLab?

Edit: Comprendo che esiste una certa latitudine nell'implementazione degli algoritmi di interpolazione cubica che probabilmente spiega le differenze che sto vedendo. Sembra anche che il programma MatLab originale che sto convertendo avrebbe dovuto utilizzare l'interpolazione lineare, quindi la domanda è probabilmente discutibile.

risposta

11

Il metodo di interpolazione sottostante è scipy.interpolate.interp1d e interp1 diverso. Scipy usa le routine netlib fitpack, che producono spline cubiche standard, C2 continue. L'argomento "cubico" in interp1 utilizza polinomi a interpolazione cubica a tratti, che non sono C2 continui. Vedi here per una spiegazione di cosa fa Matlab.

Sospetto che questa sia la fonte della differenza che stai vedendo.

0

In uso scipy corrente Questo creerà l'interpolazione monotona cubica di y = f (x) passato e utilizza l'algoritmo pchip per determinare le pendenze nei punti.

Così, per ogni sezione, (x, y) viene passato da te, l'algoritmo pchip calcolerà (x, dy/dx), e in questi punti c'è solo un cubo che attraversa 2 punti con derivata nota. Per costruzione, sarà continuo con derivata prima continua.

Problemi correlati