2013-05-18 12 views
23

Ich habe eine Reihe von 3D-Punkten eine Kontur 3D definieren. Was ich tun möchte, ist, die minimale Oberflächenrepräsentation zu erhalten, die dieser Kontur entspricht (see Minimal Surfaces in Wikipedia). Dies erfordert grundsätzlich die Lösung einer nichtlinearen partiellen Differentialgleichung.Minimale Oberflächen Lösung in Python

In Matlab ist dies fast unkompliziert mit der pdenonlin Funktion (see Matlab's documentation). Ein Beispiel seiner Verwendung zur Lösung eines minimalen Oberflächenproblems kann hier gefunden werden: Minimal Surface Problem on the Unit Disk.

Ich muss eine solche Implementierung in Python machen, aber bis ich weiß, ich habe keine Web-Ressourcen auf wie zu diesem gefunden.

Kann mir jemand zeigen alle Ressourcen/Beispiele für solche Umsetzung?

Danke, Miguel.

UPDATE

Die 3D-Oberfläche (idealerweise eine dreieckige Gitterdarstellung) mag ich finde dieses Set von 3D-Punkten begrenzt ist (wie in dieser Figur zu sehen, die Punkte liegen in der Best-Fit-Ebene) :

enter image description here

Ok, so einige der Forschung ich, dass dieses minimalen Oberflächen Problem mit der Lösung der Biharmonic Equation verwendet ist gefunden, und ich fand auch, dass die Thin-plate spline diese Gleichung die grundlegende Lösung ist.

Also ich denke, der Ansatz wäre zu versuchen, diese dünne Darstellung der Oberfläche (durch die 3D-Kontur der Punkte gegeben) mit dünnen Platten Splines anzupassen. Ich fand this example in scipy.interpolate, wo gestreute Daten (x, y, z-Format) interpoliert wird mit dünnen Platte Splines, um die ZI-Koordinaten auf einem einheitlichen Gitter (XI, YI) zu erhalten.

Zwei Fragen ergeben sich: (1) Wäre die Spline-Interpolation mit dünnen Platten der richtige Ansatz für das Problem der Berechnung der Oberfläche aus der Menge der 3D-Konturpunkte? (2) Wenn ja, wie wird die Dünnplatteninterpolation bei scipy mit einem NON-UNIFORM-Gitter durchgeführt?

Danke nochmal! Miguel

UPDATE: UMSETZUNG IN MATLAB (aber es funktioniert ON SciPy PYTHON NICHT)

Ich folgte this example Matlab mit tpaps Funktion und erhielt die minimale Oberfläche meiner Kontur auf einem einheitlichen Raster versehen. Dies ist das Ergebnis in Matlab (sieht gut aus!): enter image description here

Allerdings muß ich dies in Python implementieren, so dass ich mit dem Paket scipy.interpolate.Rbf und die thin-plate Funktion.Hier ist der Code in Python (XYZ enthält die 3D-Koordinaten jedes Punktes in der Kontur):

GRID_POINTS = 25 
x_min = XYZ[:,0].min() 
x_max = XYZ[:,0].max() 
y_min = XYZ[:,1].min() 
y_max = XYZ[:,1].max() 
xi = np.linspace(x_min, x_max, GRID_POINTS) 
yi = np.linspace(y_min, y_max, GRID_POINTS) 
XI, YI = np.meshgrid(xi, yi) 

from scipy.interpolate import Rbf 
rbf = Rbf(XYZ[:,0],XYZ[:,1],XYZ[:,2],function='thin-plate',smooth=0.0) 
ZI = rbf(XI,YI) 

aber dies ist das Ergebnis (ganz anders als, erhalten in Matlab):

enter image description here

Es ist offensichtlich, dass das Ergebnis von scipy nicht einer minimalen Oberfläche entspricht.

Ist scipy.interpolate.Rbf + dünnplattige wie erwartet zu tun, warum es von Matlab Ergebnis abweichen?

+0

Was genau ist die Beziehung zwischen Ihren 3D-Punkten und Ihrer gewünschten Ausgabe? Haben Sie Punkte, die ungefähr auf der Minimalfläche liegen, und Sie suchen nach einer algebraischen Beschreibung dieser Fläche? Oder beschreiben die Punkte eine Art Grenze und Sie suchen nach der minimalen Fläche, die durch diese Grenze definiert wird? Welche Form sollte Ihre Ausgabe haben? Es könnte helfen, den ganzen Matlab-Code zu sehen, so dass man nach Wegen suchen könnte, dies zu übersetzen, auch ohne die Interpretation als minimale Flächen zu verstehen. Ist https://launchpad.net/cbcpdesys hilfreich? – MvG

+0

@MvG: Siehe mehr Details in meiner aktualisierten Frage. (1) Die Punkte liegen ungefähr auf der Minimalfläche; (2) Die Punkte beschreiben die Grenze der noch nicht erhaltenen Oberfläche. (3) Idealerweise ist die Art der Oberfläche, die ich erhalten möchte, eine Dreiecksnetzdarstellung. – CodificandoBits

+0

Versuchen Sie auch, in http://scicomp.stackexchange.com zu fragen. – lhf

Antwort

1

Die Frage stellt fest, dass wir einen nichtlinearen partiellen Differentialgleichung lösen müssen. Wikipedia sagt jedoch, dass "sie schwierig zu studieren sind: es gibt fast keine allgemeinen Techniken, die für alle diese Gleichungen funktionieren, und normalerweise muss jede einzelne Gleichung als ein separates Problem untersucht werden." Allerdings hast du die Gleichung nicht angegeben! Und verwendet Matlab manchmal genetische Algorithmen, um auf seine Oberflächen zu gelangen? Das heißt, verwendet es eine Faustregel, um eine bestmögliche Schätzung zu machen und dann kleine Variationen in den Komponentenquadraten auszuprobieren, bis keine kleinere Oberfläche gefunden werden kann. Die Implementierung dieser Art von Lösung wäre mühsam, aber nicht konzeptionell schwierig (vorausgesetzt, Sie mögen so etwas). Denken Sie auch daran, dass der Kalkül von stetigen Funktionen nur ein Spezialfall des Kalküls aller linearen Approximationen von Funktionen ist (das Inkrement wird anstelle eines endlichen Wertes auf Null gesetzt). Dies wurde mir klargemacht, indem ich die Bücher von J. L. Bell auf einer glatten Infinitesimalanalyse lese - benutze einfach diese Algebra mit endlichen Inkrementen und lasse die resultierenden Faktoren in den Ableitungen, anstatt sie zu "vernachlässigen".

0

Offensichtlich Matlab und SciPy verstehen TPS auf unterschiedliche Weise. Die Matlab-Implementierung sieht korrekt aus. SciPy behandelt TPS auf die gleiche Weise wie andere RBFs, so könnte man es richtig in Python selbst implementieren - es würde ausreichen, um eine Matrix der zugehörigen linearen Gleichungssystems zu bilden und lösen es TPS-Koeffizienten zu erhalten.

Verwandte Themen