2017-10-09 6 views
2

J'écris des fonctions qui vont calculer des interpolations 1d en python en utilisant la fonction scipy.interpolate. en utilisant l'aide de la documentation, j'ai écrit 2 fonctions différentes pour l'interpolation spline cubique et cubiqueDifférence entre interpolation spline quadratique et de second ordre dans 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) 

Je suis un peu confus au sujet des méthodes ici. Si j'utilise interpolate.interp1d(support_x, support_y, 'cubic'), est-ce différent de la méthode cubic spline? Quelle est la différence entre kind = 'quadratic' et second order spline?

la documentation dit, ('linéaire', 'proche', 'zéro', 'slinear', 'quadratique', 'cubique' où 'slinear', 'quadratique' et 'cubique' se réfèrent à une interpolation spline de , deuxième ou troisième ordre), alors pourquoi dois-je écrire fonction différente pour la spline cubique au lieu de simplement le changer à kind=cubic

Répondre

2

Ils retournent tous les deux les mêmes splines, bien qu'en interne, la mise en œuvre ne soit pas la même (interp1d est plus récent et a un plus grand pourcentage de code Python, comparé à splrep qui est presque tout le code Fortran). "Quadratique" signifie la même chose que le deuxième degré, et "cubique" est le troisième degré. Une distinction:

  • splrep et son proche parent UnivariateSpline sont plus routines de construction cannelée riche en fonctionnalités; ils permettent un paramètre de lissage qui crée une spline non interpolante.
  • interp1d peut être plus simple à utiliser si vous n'avez pas besoin de lissage.

En tout état de cause, ce qui est loin d'être la seule instance de fonctionnalité redondante dans SciPy. De nouvelles méthodes et de nouveaux paramètres sont ajoutés, mais les anciens sont conservés pour des raisons de compatibilité ascendante.

Note historique: dans les anciennes versions de SciPy (par exemple, 0.15.1), interp1d retourné splines assez différentes, de qualité inférieure par rapport à splrep (la première révision de cette réponse a été basée sur la version 0.15.1). Dans la version actuelle 0.19.1 ce problème n'est plus présent: les deux retournent la même spline. Voici une démonstration:

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

La sortie montre que les deux routines sont en accord avec les erreurs numériques typiques.

2.6645352591e-15 
1.7763568394e-15