2012-11-08 5 views
1

J'écrit le code IDL:Différence d'interpolation spline en IDL et Python

zz= [ 0, 5, 10, 15, 30, 50, 90, 100, 500] 
uz= [ 20, 20, 20, 30, 60, 90, 30, -200, -200]*(-1.) 
zp= findgen(120)*500+500 
up= spline((zz-10.),uz,(zp/1000.0)) 
print, up 

et IDL m'a donné les valeurs de en tableau d'environ -20 à 500

.La même I a fait en Python

import numpy as npy 
zz = npy.array([ 0, 5, 10, 15, 30, 50, 90, 100, 500]) 
uz = npy.array([ 20, 20, 20, 30, 60, 90, 30, -200, -200])*(-1.) 
zp = npy.arange(0,120)*500+500 
from scipy.interpolate import interp1d 
cubic_interp_u = interp1d(zz-10., uz, kind='cubic') 
up = cubic_interp_u(zp/1000) 
print up 

et il m'a donné en avec des valeurs d'environ -20 à -160. Une idée? Merci d'avance!

+0

Pour commencer, vous pouvez tracer le résultat de l'interpolation sur les points de données, et voir si cela a du sens ou si vous n'avez absolument aucun sens. Vous pouvez également vérifier si IDL et scipy/numpy traitent les tableaux d'entiers de la même façon dans leurs routines (c.-à-d., Sont-ils tous les deux automatiquement convertis en entrée?) – Evert

+0

@Evert: Oui, merci. C'est une bonne idée de tracer les résultats. Je l'ai fait et les images sont montrées ici. Jetez un coup d'oeil s'il vous plait. Je suppose que la fonction interpolée de Python ne peut pas attraper mon profil. Cependant, je n'ai toujours aucune idée de le modifier! votre aide, s'il vous plaît! –

+0

Les photos sont montrées, où? Que voulez-vous dire par profil? –

Répondre

2

En fait, je ne vois pas de problème. J'utilise UnivariateSpline ici au lieu de interp1d et cubic_interp_u, mais les routines sous-jacentes sont essentiellement les mêmes, pour autant que je peux dire:

import numpy as npy 
import pyplot as pl 
from scipy.interpolate import UnivariateSpline 
zz = npy.array([ 0, 5, 10, 15, 30, 50, 90, 100, 500]) 
uz = npy.array([ 20, 20, 20, 30, 60, 90, 30, -200, -200])*(-1.) 
zp = npy.arange(0,120)*500+500 
pl.plot(zz, uz, 'ro') 
pl.plot(zp/100, UnivariateSpline(zz, uz, s=1, k=3)(zp/100), 'k-.') 
pl.plot(zp/1000, UnivariateSpline(zz, uz, s=1, k=3)(zp/1000), 'b-') 

Le seul problème que je vois est que vous limité l'interpolation, en utilisant zp/1000 . En utilisant zp/100, je reçois tous les lots de valeurs en dehors de cette plage -160, -20, que vous pouvez également voir sur le graphique de la ligne de points pointillés, par rapport à la ligne bleue (zp/1000):

enter image description here

Il ressemble Scipy fait du bon travail. Par ailleurs, si vous souhaitez (spline-) adapter de telles valeurs éloignées, vous pouvez envisager de travailler dans l'espace de journalisation à la place, ou de normaliser vos données (ce qui est le cas pour l'espace de journal). . La plupart des problèmes d'adaptation fonctionnent mieux si les valeurs sont du même ordre de grandeur.

+0

merci beaucoup! Maintenant, je pense que ce dont j'ai besoin n'est pas une fonction spline cubique, mais une courbe parfaitement ajustée. Je veux que la courbe d'ajustement passe tous les points donnés. Avez-vous une expérience avec cela? merci encore beaucoup! –

+0

@hoangtran: J'ai peu ou pas d'expérience ici, mais une spline est essentiellement une courbe lisse; il a juste une formulation mathématique peu pratique. Jetez aussi un coup d'oeil à la documentation de UnivariateSpline, en particulier sur le paramètre 's'. – Evert

+0

Merci beaucoup pour votre aide! –