2013-06-27 12 views
7

Sto cercando di adattare una spline cubica a un determinato insieme di punti. I miei punti non sono ordinati. NON POSSO ordinare o riordinare i punti, poiché ho bisogno di quelle informazioni.Utilizzo della funzione scipy.interpolate.splrep

Ma poiché la funzione scipy.interpolate.splrep funziona solo su punti non duplicati e monotonicamente crescenti, ho definito una funzione che associa le coordinate x a uno spazio che aumenta monotonicamente.

I miei vecchi punti sono:

xpoints=[4913.0, 4912.0, 4914.0, 4913.0, 4913.0, 4913.0, 4914.0, 4915.0, 4918.0, 4921.0, 4925.0, 4932.0, 4938.0, 4945.0, 4950.0, 4954.0, 4955.0, 4957.0, 4956.0, 4953.0, 4949.0, 4943.0, 4933.0, 4921.0, 4911.0, 4898.0, 4886.0, 4874.0, 4865.0, 4858.0, 4853.0, 4849.0, 4848.0, 4849.0, 4851.0, 4858.0, 4864.0, 4869.0, 4877.0, 4884.0, 4893.0, 4903.0, 4913.0, 4923.0, 4935.0, 4947.0, 4959.0, 4970.0, 4981.0, 4991.0, 5000.0, 5005.0, 5010.0, 5015.0, 5019.0, 5020.0, 5021.0, 5023.0, 5025.0, 5027.0, 5027.0, 5028.0, 5028.0, 5030.0, 5031.0, 5033.0, 5035.0, 5037.0, 5040.0, 5043.0] 

ypoints=[10557.0, 10563.0, 10567.0, 10571.0, 10575.0, 10577.0, 10578.0, 10581.0, 10582.0, 10582.0, 10582.0, 10581.0, 10578.0, 10576.0, 10572.0, 10567.0, 10560.0, 10550.0, 10541.0, 10531.0, 10520.0, 10511.0, 10503.0, 10496.0, 10490.0, 10487.0, 10488.0, 10488.0, 10490.0, 10495.0, 10504.0, 10513.0, 10523.0, 10533.0, 10542.0, 10550.0, 10556.0, 10559.0, 10560.0, 10559.0, 10555.0, 10550.0, 10543.0, 10533.0, 10522.0, 10514.0, 10505.0, 10496.0, 10490.0, 10486.0, 10482.0, 10481.0, 10482.0, 10486.0, 10491.0, 10497.0, 10506.0, 10516.0, 10524.0, 10534.0, 10544.0, 10552.0, 10558.0, 10564.0, 10569.0, 10573.0, 10576.0, 10578.0, 10581.0, 10582.0] 

Parcelle:

Erroneous trace Il codice per la funzione di mappatura e l'interpolazione è:

xnew=[] 
ynew=ypoints 

for c3,i in enumerate(xpoints): 
     if np.isfinite(np.log(i*pow(2,c3))): 
        xnew.append(np.log(i*pow(2,c3))) 
     else: 
        if c==0: 
         xnew.append(np.random.random_sample()) 
        else: 
         xnew.append(xnew[c3-1]+np.random.random_sample()) 
xnew=np.asarray(xnew) 
ynew=np.asarray(ynew) 
constant1=10.0 
nknots=len(xnew)/constant1 
idx_knots = (np.arange(1,len(xnew)-1,(len(xnew)-2)/np.double(nknots))).astype('int') 
knots = [xnew[i] for i in idx_knots] 
knots = np.asarray(knots) 
int_range=np.linspace(min(xnew),max(xnew),len(xnew)) 
tck = interpolate.splrep(xnew,ynew,k=3,task=-1,t=knots) 
y1= interpolate.splev(int_range,tck,der=0) 

Il codice sta gettando un errore alla funzione interpolate.splrep() per alcuni set di punti come sopra.

L'errore è: File "/home/neeraj/Desktop/koustav/res/BOS5/fit_spline3.py", linea 58, in save_spline_f TCK = interpolate.splrep (xnew, ynew, k = 3, compito = -1, t = nodi) File "/usr/lib/python2.7/dist-packages/scipy/interpolate/fitpack.py", riga 465, in splrep raise _iermess ier (_iermess [ier] [0] Valore Errore: Errore nei dati di input

Ma per altri set di punti funziona correttamente. Ad esempio per la seguente serie di punti.

xpoints=[1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1630.0, 1630.0, 1630.0, 1631.0, 1631.0, 1631.0, 1631.0, 1630.0, 1629.0, 1629.0, 1629.0, 1628.0, 1627.0, 1627.0, 1625.0, 1624.0, 1624.0, 1623.0, 1620.0, 1618.0, 1617.0, 1616.0, 1615.0, 1614.0, 1614.0, 1612.0, 1612.0, 1612.0, 1611.0, 1610.0, 1609.0, 1608.0, 1607.0, 1607.0, 1603.0, 1602.0, 1602.0, 1601.0, 1601.0, 1600.0, 1599.0, 1598.0] 

ypoints=[10570.0, 10572.0, 10572.0, 10573.0, 10572.0, 10572.0, 10571.0, 10570.0, 10569.0, 10565.0, 10564.0, 10563.0, 10562.0, 10560.0, 10558.0, 10556.0, 10554.0, 10551.0, 10548.0, 10547.0, 10544.0, 10542.0, 10541.0, 10538.0, 10534.0, 10532.0, 10531.0, 10528.0, 10525.0, 10522.0, 10519.0, 10517.0, 10516.0, 10512.0, 10509.0, 10509.0, 10507.0, 10504.0, 10502.0, 10500.0, 10501.0, 10499.0, 10498.0, 10496.0, 10491.0, 10492.0, 10488.0, 10488.0, 10488.0, 10486.0, 10486.0, 10485.0, 10485.0, 10486.0, 10483.0, 10483.0, 10482.0, 10480.0] 

Parcelle: Trace for which there was no error Qualcuno può suggerire quello che sta succedendo ?? Grazie in anticipo ......

+0

Con il codice che hai postato, 'ynew' finisce per essere un array vuoto: non hai mai nulla accodare a quella lista. Quindi l'errore. A cosa stai cercando esattamente di adattare la spline? I punti come odered? O i punti ordinati in x monotonicamente crescente? Perché non puoi fare una * copia * ordinata dei tuoi dati se è ciò di cui hai bisogno? – Jaime

+0

Mi dispiace per le informazioni mancanti. Ho fatto ynew = ypoints. Sto adattando la spline a (xnew, ynew). Dal momento che non posso ordinare i xpoints, li ho mappati a punti che aumentano monotonicamente, xnew. Dopo aver adattato la spline a (xnew, ynew), sto scoprendo una nuova serie di punti (y1, int_range). Qui, int_range = np.linspace (min (xnew), max (xnew), len (xnew)) ho cambiato il codice ... Si prega di dare un'occhiata –

+0

È possibile utilizzare 'splrep()': http://stackoverflow.com/questions/14244289/scipy-interpolating-trajectory – HYRY

risposta

1

credo che lo scopo della funzione che si sta utilizzando, splrep(), è quello di adattare il y coordinata in funzione del x coordinate: y = f (x).

Per splrep() funzionare come previsto, la funzione deve essere a valore singolo. Cioè, devi essere in grado di tracciare una linea verticale sul grafico ovunque e farla intersecare esattamente una volta la curva.

Invece, forse si vuole adattare x e y separatamente ad un terzo parametro t che aumenta in modo monotono.

x = f (t)
y = g (t)

Ci sono due semplici scelte per t. Il primo è solo l'indice del punto (0 per il primo punto, 1 per il secondo punto, ecc.). La seconda scelta è un po 'più difficile, la distanza rettilinea accumulata percorsa da un punto all'altro. Quindi chiamare slrep() separatamente per le coordinate x e y.

t = [0] 
for i in range(1, len(x)): 
    t[i] = t[i-1]+np.hypot(x[i]-x[i-1], y[i]-y[i-1]) 

Forse si preferisce una spline di Bézier?

+0

Grazie per la risposta. Ho provato a far sì che questa funzione aumentasse in modo monotono usando np.log (i * pow (2, c3)). Ho provato ad usare la prima opzione che hai fornito. I risultati erano più o meno gli stessi con gli stessi errori. Non possiamo avere duplicati per valori y? Li ho È un problema. Non sono sicuro. Ma grazie (+1) per rispondere. –

5

In realtà non è necessario definire una nuova funzione da soli. È come questa interpolazione traiettoria molto: scipy: traiettoria di interpolazione (scipy: Interpolating trajectory)

E la risposta è buona per me, spero che possa aiutarti.

from scipy import interpolate as itp 
mytck,myu=itp.splprep([xpoints,ypoints]) 
xnew,ynew= itp.splev(np.linspace(0,1,1000),mytck) 
plot(xnew,ynew) 

Result after Spline

Problemi correlati