2013-06-27 10 views
7

Ich versuche, einen kubischen Spline zu einer gegebenen Menge von Punkten anzupassen. Meine Punkte sind nicht bestellt. Ich kann die Punkte nicht sortieren oder neu anordnen, da ich diese Informationen brauche.Mit der Funktion scipy.interpolate.splrep

Da aber die Funktion scipy.interpolate.splrep nur auf nicht-duplizierten und monoton steigenden Punkten arbeitet, habe ich eine Funktion definiert, die die x-Koordinaten einem monoton zunehmenden Raum zuordnet.

Meine alte Punkte sind:

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] 

Plots:

Erroneous trace Der Code für die Abbildungsfunktion und Interpolation ist:

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) 

Der Code einen Fehler in der Funktion wirft interpolate.splrep() für einige Punkte wie oben.

Der Fehler ist: File "/home/neeraj/Desktop/koustav/res/BOS5/fit_spline3.py", Zeile 58, in save_spline_f TCK = interpolate.splrep (Xneu, Yneu, k = 3, task = -1, t = Knoten) Datei "/usr/lib/python2.7/dist-packages/scipy/interpolate/fitpack.py", Zeile 465, in splrep erhöhen _iermess ier (_iermess [ier] [0]) ValueError: Fehler bei den Eingabedaten

Aber für andere Punkte funktioniert es gut. Zum Beispiel für die folgende Menge von Punkten.

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] 

Plots: Trace for which there was no error Kann jemand vorschlagen, was passiert, ?? Vielen Dank im Voraus ......

+0

Mit dem Code, den Sie geschrieben haben, 'ynew' endet als ein leeres Array up: Sie nie etwas zu dieser Liste anhängen. Daher der Fehler. Was genau versuchen Sie, den Spline zu passen? Die Punkte wie bestellt? Oder die Punkte in monoton steigendem x? Warum können Sie keine * Kopie * Ihrer Daten bestellen, wenn Sie das brauchen? – Jaime

+0

Entschuldigung wegen der fehlenden Info. Ich habe ynew = ypoints gemacht. Ich passe den Spline an (xnew, ynew). Da ich die xpoints nicht ordern kann, habe ich sie auf monoton steigende Punkte xnew abgebildet. Nachdem ich den Spline an (xnew, ynew) angepasst habe, finde ich eine neue Menge von Punkten (y1, int_range). Hier int_range = np.linspace (min (Xneu), max (Xneu), len (Xneu)) ich den Code geändert haben ... Bitte lesen –

+0

Sie können 'splrep()': http://stackoverflow.com/questions/14244289/scipy-interpolating-trajectory – HYRY

Antwort

1

Ich glaube, dass der Zweck der Funktion, die Sie verwenden, splrep(), ist die y Koordinate als Funktion der x Koordinate passen: y = f (x).

Damit splrep() wie erwartet funktioniert, muss Ihre Funktion einwertig sein. Das heißt, Sie müssen in der Lage sein, an jeder Stelle eine vertikale Linie zu zeichnen und die Kurve genau einmal zu schneiden.

Stattdessen vielleicht mögen Sie x und y getrennt einen dritten Parameter t, die monoton zunimmt passen.

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

Es gibt zwei einfache Möglichkeiten für t. Der erste ist nur der Index des Punktes (0 für den ersten Punkt, 1 für den zweiten Punkt usw.). Die zweite Wahl ist etwas schwieriger, die akkumulierte geradlinige Distanz, die von Punkt zu Punkt zurückgelegt wird. Dann würden Sie slrep() getrennt für die Koordinaten x und y Koordinaten aufrufen.

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

Vielleicht möchten Sie stattdessen einen Bezier-Spline?

+0

Danke für die Antwort. Ich habe versucht, diese Funktion monoton mit np.log (i * pow (2, c3)) zu erhöhen. Ich habe versucht, die erste Option, die Sie zur Verfügung gestellt. Die Ergebnisse waren mehr oder weniger die gleichen mit den gleichen Fehlern. Können wir keine Duplikate für y-Werte haben? Ich habe sie. Ist das ein Problem. Ich bin nicht sicher. Aber danke (+1) für die Antwort. –

5

Eigentlich müssen Sie selbst keine neue Funktion definieren. Es ist wie diese Trajektorie Interpolation sehr viel: scipy: Interpolierende Trajektorie (scipy: Interpolating trajectory)

Und die Antwort ist gut für mich, hoffe, es kann Ihnen helfen.

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

Verwandte Themen