Einbau einer geschlossenen Kurve zu einer Reihe von Punkten
Habe ich eine Reihe von Punkten pts
die form einer Schleife und es sieht wie folgt aus:
Dies ist etwas ähnlich wie Eins und dreißig Millionen zwei hundert drei und vierzig tausend zwei, aber anstatt Punkte in zwischen Paaren von Punkten, ich möchte fit eine glatte Kurve durch die Punkte (Koordinaten am Ende der Frage), so habe ich versucht, etwas ähnliches zu scipy
Dokumentation auf Interpolation:
values = pts
tck = interpolate.splrep(values[:,0], values[:,1], s=1)
xnew = np.arange(2,7,0.01)
ynew = interpolate.splev(xnew, tck, der=0)
aber ich bekomme diese Fehlermeldung:
ValueError: Error on input-Daten
Gibt es eine Möglichkeit zu finden, wie eine fit?
Koordinaten der Punkte:
pts = array([[ 6.55525 , 3.05472 ],
[ 6.17284 , 2.802609],
[ 5.53946 , 2.649209],
[ 4.93053 , 2.444444],
[ 4.32544 , 2.318749],
[ 3.90982 , 2.2875 ],
[ 3.51294 , 2.221875],
[ 3.09107 , 2.29375 ],
[ 2.64013 , 2.4375 ],
[ 2.275444, 2.653124],
[ 2.137945, 3.26562 ],
[ 2.15982 , 3.84375 ],
[ 2.20982 , 4.31562 ],
[ 2.334704, 4.87873 ],
[ 2.314264, 5.5047 ],
[ 2.311709, 5.9135 ],
[ 2.29638 , 6.42961 ],
[ 2.619374, 6.75021 ],
[ 3.32448 , 6.66353 ],
[ 3.31582 , 5.68866 ],
[ 3.35159 , 5.17255 ],
[ 3.48482 , 4.73125 ],
[ 3.70669 , 4.51875 ],
[ 4.23639 , 4.58968 ],
[ 4.39592 , 4.94615 ],
[ 4.33527 , 5.33862 ],
[ 3.95968 , 5.61967 ],
[ 3.56366 , 5.73976 ],
[ 3.78818 , 6.55292 ],
[ 4.27712 , 6.8283 ],
[ 4.89532 , 6.78615 ],
[ 5.35334 , 6.72433 ],
[ 5.71583 , 6.54449 ],
[ 6.13452 , 6.46019 ],
[ 6.54478 , 6.26068 ],
[ 6.7873 , 5.74615 ],
[ 6.64086 , 5.25269 ],
[ 6.45649 , 4.86206 ],
[ 6.41586 , 4.46519 ],
[ 5.44711 , 4.26519 ],
[ 5.04087 , 4.10581 ],
[ 4.70013 , 3.67405 ],
[ 4.83482 , 3.4375 ],
[ 5.34086 , 3.43394 ],
[ 5.76392 , 3.55156 ],
[ 6.37056 , 3.8778 ],
[ 6.53116 , 3.47228 ]])
Sind Sie bereit, ein neues Paket installieren/Rahmen? Wenn Sie sind die Art der Armatur, die Sie sprechen, ist durch die ROOT-Framework sowie eine Vielzahl weiterer Ausstattungsoptionen. Es sollte ziemlich einfach, sich die 2D Histogramm Beispiel passen Ihre Daten in PyROOT(die python-Schnittstelle zu ROOT, die benutzt python-syntax statt der C++ - interpreter). Ob das etwas ist, dass Sie nicht gegen ich kann nach einer richtigen Antwort und dem Beispiel.
Vielen Dank für Ihren Kommentar. Ich bin nicht dagegen, die Installation eines neuen Pakets, obwohl meine Sorge ist, dass die Ausgabe kann verwendet werden
Das hat anscheinend schon ein Problem für jemand anderen, wie es war ein post über die Verwendung von matplotlib w/ ROOT. ROOT ist ein sehr mächtiges Werkzeug und ich würde empfehlen, Sie versuchen es, es gibt eine Menge toller features zur Datenanalyse und-Visualisierung.
Eigentlich im ROOT nicht brauchen, um die Nutzung der fitting-Bibliotheken, die regelmäßige Zeichnung-Optionen sind ausreichend, um eine glatte Kurve. Ich lese die Daten aus und zog es mit der C++ - interpreter wenn Sie möchten, um zu sehen, die Ergebnisse, die ich posten kann, den code und die Bilder als Antwort.
Während ich bezweifle nicht, dass ROOT ist erstaunlich für Teilchen-Daten-Analyse, es ist völlig übertrieben für die Aufgabe zur hand, das kann einfach erreicht werden mit Scipy. Aber, ich nehme auch an, man kann immer Spaß haben mit build-Anweisungen (Schritt 1, Schritt 2) . Vor allem, wenn Sie möchten, kombinieren Sie dieses mit einige wissenschaftliche python-distribution (z.B. Anaconda, EPD) auf Windows, kann dies wahrscheinlich halten Sie beschäftigt für ein paar Tage (der Lektüre des 600-Seiten manual nicht im Lieferumfang enthalten) ...
Vielen Dank für Ihren Kommentar. Ich bin nicht dagegen, die Installation eines neuen Pakets, obwohl meine Sorge ist, dass die Ausgabe kann verwendet werden
matplotlib
(ich habe ein paar Bilder gemacht und würde gerne immer den gleichen Stil in diesem).Das hat anscheinend schon ein Problem für jemand anderen, wie es war ein post über die Verwendung von matplotlib w/ ROOT. ROOT ist ein sehr mächtiges Werkzeug und ich würde empfehlen, Sie versuchen es, es gibt eine Menge toller features zur Datenanalyse und-Visualisierung.
Eigentlich im ROOT nicht brauchen, um die Nutzung der fitting-Bibliotheken, die regelmäßige Zeichnung-Optionen sind ausreichend, um eine glatte Kurve. Ich lese die Daten aus und zog es mit der C++ - interpreter wenn Sie möchten, um zu sehen, die Ergebnisse, die ich posten kann, den code und die Bilder als Antwort.
Während ich bezweifle nicht, dass ROOT ist erstaunlich für Teilchen-Daten-Analyse, es ist völlig übertrieben für die Aufgabe zur hand, das kann einfach erreicht werden mit Scipy. Aber, ich nehme auch an, man kann immer Spaß haben mit build-Anweisungen (Schritt 1, Schritt 2) . Vor allem, wenn Sie möchten, kombinieren Sie dieses mit einige wissenschaftliche python-distribution (z.B. Anaconda, EPD) auf Windows, kann dies wahrscheinlich halten Sie beschäftigt für ein paar Tage (der Lektüre des 600-Seiten manual nicht im Lieferumfang enthalten) ...
InformationsquelleAutor Mahdi | 2015-07-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tatsächlich, Sie waren nicht weit von der Lösung Ihrer Frage.
Mit
scipy.interpolieren.splprep
für parametrische B-spline-interpolation wäre das der einfachste Ansatz. Es auch nativ unterstützt geschlossene Kurven, wenn du dieper=1
parameter,Grundsätzlich ist dieser Ansatz nicht sehr Verschieden ist von der in @Joe Kington Antwort. Obwohl, es wird wahrscheinlich ein wenig mehr robust, weil das äquivalent der
i
vector gewählt ist, wird standardmäßig auf der Grundlage der Entfernungen zwischen den Punkten und nicht nur an deren-index (siehesplprep
- Dokumentation für dieu
parameter).Es ist präzise und funktioniert Super, was ich will?
zu was ist diese Magische "Punkte.T" beziehen?
Können Sie bitte erklären, die Lösung?
InformationsquelleAutor rth
Ihr problem ist weil Sie versuchen zu arbeiten mit x-und y-direkt. Die interpolation der Funktion, die Sie aufrufen wird davon ausgegangen, dass die x-Werte in sortierter Reihenfolge, und dass jeder
x
Wert einen eindeutigen y-Wert.Statt, den Sie brauchen, um einen parametrisierten Koordinaten-system (z.B. den index Ihrer vertices) und interpolieren Sie x und y separat verwenden.
Mit zu beginnen, sollten Sie Folgendes beachten:
Ich nicht das Vieleck zu schließen. Wenn Sie möchten, können Sie den ersten Punkt an das Ende des Arrays (z.B.
pts = np.vstack([pts, pts[0]])
Wenn Sie das tun, werden Sie feststellen, dass es eine Diskontinuität, wo das polygon schließt.
Dies ist, da unsere Parametrisierung nicht berücksichtigt, die Schließung der polgyon. Eine schnelle Lösung ist zum Auffüllen der array mit den "reflektierten" Punkte:
Alternativ können Sie verwenden Sie ein spezielles curve-smoothing-Algorithmus, wie SPITZE oder Ecke-schneiden-Algorithmus.
Das ist viel besser als
splprep
weil es nicht beschränkt auf 10 Dimensionen. Das ist mein problem gelöst, danke sehr.InformationsquelleAutor Joe Kington
Mithilfe der ROOT-Framework und die pyroot Schnittstelle, die ich generieren konnte das folgende Bild
Mit dem folgenden code(ich konvertiert Ihre Daten in eine CSV-Daten aufgerufen.csv-so Lesen Sie es in ROOT, wäre es einfacher und gab den Spalten Titel von xp,yp)
InformationsquelleAutor Matt
Passen eine glatte geschlossene Kurve durch N Punkte, die Sie verwenden können Liniensegmente mit den folgenden Einschränkungen:
In der Lage sein, um genügend Freiheit für die insgesamt 4 Bedingungen pro Liniensegment-Gleichung jede Strecke sollte y = ax^3 + bx^2 + cx + d. (also die Ableitung ist y' = 3ax^2 + 2bx + c)
Einstellung der Bedingungen wie vorgeschlagen, würde Ihnen N * 4 lineare Gleichungen für die N * 4 unbekannten (a1..aN, b1..bN, c1..cN, d1..dN) lösbar durch matrix-inversion (numpy).
Wenn die Punkte auf der gleichen vertikalen Linie, die speziell (aber einfache) Handhabung ist erforderlich, da die Ableitung wird "unendlich".
InformationsquelleAutor Jacques de Hooge