Wie kann ich eine schnelle Schätzung für den Abstand zwischen einem Punkt und einer bikubischen Spline-Oberfläche in Python erhalten?

9

Wie kann ich eine schnelle Schätzung für den Abstand zwischen einem Punkt und einer bikubischen Spline-Oberfläche in Python erhalten? Gibt es eine bestehende Lösung, die ich in SciPy, NumPy oder einem anderen Paket nutzen könnte?

Ich habe die Oberfläche durch eine bikubische Interpolation definiert:

%Vor%

und ich habe einige gemessene Punkte dieser Oberfläche:

%Vor%

Ich möchte den nächsten Punkt auf der Oberfläche s_ideal für jeden Punkt in p finden. Ein allgemeiner Fall könnte mehrere Lösungen für stark variierende Splines haben, also beschränke ich das Problem auf Oberflächen, von denen bekannt ist, dass sie nur eine Lösung in der Nähe der Projektion des Punktes entlang von z haben. Dies ist keine winzige Anzahl von Punkten zur Messung oder Oberflächenbestimmung, daher möchte ich die Geschwindigkeit sogar auf Kosten der Genauigkeit auf vielleicht 1E-5 optimieren.

Die Methode, die mir in den Sinn kommt, besteht darin, einen Gradientenabstiegsansatz zu verwenden und so etwas wie für jeden Messpunkt p :

zu tun
  1. Verwenden Sie pt = [p_x, p_y, p_z] als anfänglichen Testpunkt, wobei p_z = s_ideal(pt)
  2. Berechnen Sie die Steigung (Tangente) vector m = [ m_x, m_y ] at pt
  3. Berechne den Vektor r von pt bis p : r = p - pt
  4. Wenn der Winkel theta zwischen r und m innerhalb eines Grenzwerts von 90 Grad liegt, dann ist pt der letzte Punkt.
  5. Andernfalls aktualisieren Sie pt als:

%Vor%

Ich fand dies , was darauf hindeutet, dass eine Methode schnelle Ergebnisse mit sehr hoher Genauigkeit erzeugen könnte der 1D-Fall, aber es ist für eine einzige Dimension und könnte für mich zu schwer zu zwei konvertieren.

    
Brian 06.03.2017, 20:13
quelle

2 Antworten

1

Die Frage zielt darauf ab, den euklidischen Abstand zwischen einer dreidimensionalen Fläche S(x,y,z) und einem anderen Punkt x0,y0,z0 zu minimieren. Die Oberfläche ist auf einem rechteckigen (x,y) mesh definiert, wobei z(x,y) = f(x,y) + random_noise(x,y) . Die Einführung von Rauschen in die "ideale" Oberfläche fügt dem Problem eine beträchtliche Komplexität hinzu, da es erfordert, dass die Oberfläche unter Verwendung eines 2-dimensionalen Splines dritter Ordnung interpoliert wird.

Es ist nicht verständlich, warum die Einführung von Rauschen in die ideale Oberfläche tatsächlich notwendig ist. Wenn die ideale Oberfläche wirklich ideal wäre, sollte sie gut genug verstanden werden, dass eine wahre polynome Anpassung in x und y zumindest empirisch bestimmt werden könnte, wenn nicht analytisch. Wenn das Zufallsgeräusch eine tatsächliche Messung simulieren würde, dann müßte die Messung nur so oft aufgezeichnet werden, bis das Rauschen auf Null gemittelt ist. In ähnlicher Weise kann die Verwendung von Signalfiltern dazu beitragen, Rauschen zu eliminieren und das wahre Verhalten des Signals aufzudecken.

Um den nächsten Punkt auf der Oberfläche zu einem anderen Punkt zu finden, müssen die Abstandsgleichung und ihre Ableitungen verwendet werden. Wenn die Oberfläche wirklich nur auf Basis von Splines beschrieben werden kann, muss man rekonstruieren die Spline-Darstellung und finden Sie ihre Derivate, die nicht trivial ist. Alternativ könnte die Oberfläche mit einem feinen Netz ausgewertet werden, aber hier kommt es schnell zu Speicherproblemen, weshalb Interpolation zuerst verwendet wurde.

Wenn wir jedoch zustimmen können, dass die Oberfläche mit einem einfachen Ausdruck in x und y definiert werden kann, wird die Minimierung trivial:

Zum Zweck der Minimierung ist es bequemer, das Quadrat der Entfernung d^2(x,y) ( z ist nur eine Funktion von x und y ) zwischen zwei Punkten, D(x,y) , zu betrachten löscht die Quadratwurzel. Um die kritischen Punkte von D(x,y) zu finden, nehmen wir seine partiellen Ableitungen w.r.t x und y und finden ihre Wurzeln durch Setzen von = 0: d/dx D(x,y) = f1(x,y) = 0 und d/dy D(x,y) = f2(x,y)=0 . Dies ist ein nicht lineares Gleichungssystem, das wir mit scipy.optimize.root lösen können. Wir müssen nur root a guess übergeben (die Projektion des pt of interest auf die Oberfläche) und die Jacobian des Gleichungssystems.

%Vor%

Ausgabe:

%Vor%     
Crispin 17.03.2017 17:15
quelle
-1

Ja! Die Verwendung von K-Means mit Clustering wird genau das tun. Also wird s_ideal das Ziel sein, dann trainierst du auf p_z . Letztendlich erhalten Sie Zentroide, die Ihnen den nächsten Punkt auf der Oberfläche s_ideal zu jedem Punkt in p geben.

Hier ist ein Beispiel, es ist ziemlich nah an dem, was Sie wollen.

    
grillo 14.03.2017 00:15
quelle

Tags und Links