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) :
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!):
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):
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?
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
@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
Versuchen Sie auch, in http://scicomp.stackexchange.com zu fragen. – lhf