2010-02-02 6 views
7

Mit scipys interpolate.splprep Funktion erhalten Sie einen parametrischen Spline auf Parameter u, aber die Domäne u ist nicht das Linienintegral des Splines, es ist eine stückweise lineare Verbindung der Eingabekoordinaten. Ich habe versucht integrate.splint, aber das gibt nur die einzelnen Integrale über u. Natürlich kann ich eine Menge kartesischer Differentialabstände numerisch integrieren, aber ich fragte mich, ob es eine Methode in geschlossener Form gab, um die Länge eines Spline- oder Spline-Segments zu erhalten (mit scipy oder numpy), die ich übersehen hatte.Ermitteln der Länge eines kubischen B-Splines

Edit: Ich bin auf der Suche nach einer geschlossenen Lösung oder einem sehr schnellen Weg, um zu einer Maschine Präzision Antwort zu konvergieren. Ich habe die numerischen Wurzelfindungsmethoden fast aufgegeben und bin jetzt hauptsächlich nach einer geschlossenen Antwort. Wenn irgendjemand Erfahrung darin hat, elliptische Funktionen zu integrieren oder kann er mich auf eine gute Ressource (außer Wolfram) hinweisen, wäre das großartig.

Ich werde Maxima versuchen, zu versuchen, das unbestimmte Integral von dem, was ich glaube, dass die Funktion für ein Segment des Keils ist: ich dieses Cross posted on MathOverflow

Antwort

6

Da beide x & y kubische parametrischen Funktionen gibt es keine geschlossene Lösung in Bezug auf einfache Funktionen. Numerische Integration ist der Weg zu gehen. Die Integration des Bogenlängenausdrucks oder das einfache Hinzufügen von Liniensegmentlängen hängt von der Genauigkeit ab, die Sie anstreben, und davon, wie viel Aufwand Sie aufwenden möchten.

Eine genaue und schnelle Methode „von Liniensegmenten Hinzufügen Länge“:

Mit recurvise Unterteilung (eine Form von de Casteljeau-Algorithmus) Punkte zu generieren, können Ihnen eine sehr genaue Darstellung mit minimaler Anzahl von Punkten geben . Unterteilungen nur unterteilen, wenn sie ein Kriterium nicht erfüllen. Normalerweise basiert das Kriterium auf der Länge, die die Kontrollpunkte (der Rumpf oder der Käfig) verbindet. Für kubisch, in der Regel Vergleich der Nähe von P0P1 + P1P2 + P2P3 zu P0P3, wobei P0, P1, P2 & P3 sind die Kontrollpunkte, die Ihre Bezier definieren.

Sie können einige Delphi-Code finden Sie hier: link text

Es sollte relativ einfach zu Python zu konvertieren. Es wird die Punkte generieren. Der Code berechnet bereits die Länge der Segmente, um die Kriterien zu testen. Sie können diese Längenwerte einfach auf dem Weg sammeln.

+0

Diese Lösung ist schön für Annäherungen, aber ich hätte in meiner Frage angegeben, dass ich nach einer genauen oder einer maschinenpräzisen Antwort bin. Es ist vergleichbar mit der Romberg-Lösung von EOL, aber ich müsste in reinem Python iterieren. – Paul

+0

Da die allgemeine analytische Lösung elliptische Integrale beinhaltet, werden Sie numerisch integriert, egal welchen Ansatz Sie wählen. Die Methode, die ich skizziert habe, integriert nicht direkt den Bogenlängenausdruck, aber es ist auch eine numerische Integration. Alles, was zählt, ist, dass die Methode zu einer gewünschten Genauigkeit in einer gewünschten Zeit konvergiert. – symmetry

+0

Um etwas genauer über diese Längen ich beziehen, dass Sie auf dem Weg ansammeln würden ... einen Blick hier: http://steve.hollasch.net/cgindex/curves/cbezarclen.html Verwenden Sie den Durchschnitt der Rumpflänge (L1) und der Sehnenlänge (L0), um die Bogenlänge der einzelnen Untersegmente zu approximieren. – symmetry

4

Sie können die Funktion sqrt(x'(u)**2+y'(u)**2) über u integrieren, wo man die Derivate x' und y' Ihre Koordinaten mit scipy.interpolate.splev berechnen. Die Integration kann mit einer der Routinen von scipy.integrate durchgeführt werden (quad ist präzise [Clenshaw-Curtis], romberg ist in der Regel schneller). Dies sollte präziser und wahrscheinlich schneller als das Addieren vieler kleiner Abstände sein (was dem Integrieren mit der Rechteckregel entspricht).

+0

Ich mag diese Lösung, da Sie in der Lage sind, Ihre gewünschte Genauigkeit einzustellen, aber leider bin ich auf Genauigkeit der Maschinengenauigkeit angewiesen. Ich habe Ihren Vorschlag umgesetzt, aber QUADPACK (so großartig wie es ist) erfüllt meine Leistungsanforderungen nicht. Ich suche derzeit nach einer geschlossenen Lösung und habe auf MathOverflow gepostet. BTW: Clenshaw-Curtis ist nur für Polynome genau/genau. Die Länge dieses Splines ist eine elliptische Funktion. – Paul

Verwandte Themen