2013-05-18 8 views
23

Mam zestaw punktów 3D definiujących kontur 3D. Chcę uzyskać minimalną reprezentację powierzchni odpowiadającą temu konturowi (see Minimal Surfaces in Wikipedia). Zasadniczo wymaga to rozwiązania nieliniowego równania różniczkowego cząstkowego.Minimalne rozwiązanie powierzchni w Pythonie

W programie Matlab jest to prawie proste przy użyciu funkcji pdenonlin(see Matlab's documentation). Przykład jego użycia do rozwiązania problemu minimalnej powierzchni można znaleźć tutaj: Minimal Surface Problem on the Unit Disk.

Potrzebuję wykonać taką implementację w Pythonie, ale wiem, że nie znalazłem żadnych zasobów sieciowych, jak to zrobić.

Czy ktoś może wskazać mi jakieś zasoby/przykłady takiej realizacji?

Dzięki, Miguel.

UPDATE

Powierzchnia 3D (idealnie trójkątny reprezentacja mesh) Chcę znaleźć jest ograniczony przez ten zbiór punktów 3D (jak widać na tym rysunku, punkty leżą w najlepiej dopasowanej płaszczyźnie) :

enter image description here

Ok, więc robi jakieś badania stwierdziliśmy, że ta minimalna powierzchnia problem związany jest z roztworu Biharmonic Equation i ja również, że Thin-plate spline jest podstawowym rozwiązaniem tego równania.

Myślę więc, że podejście polegałoby na próbie dopasowania tej rzadkiej reprezentacji powierzchni (podanej przez kontur 3D punktów) za pomocą splajnów cienkościennych. Znalazłem this example in scipy.interpolate, gdzie rozproszone dane (format x, y, z) są interpolowane za pomocą splajnów cienkościennych w celu uzyskania współrzędnych ZI na jednolitej siatce (XI, YI).

Powstają dwa pytania: (1) Czy interpolacja cienkościenna jest właściwym podejściem do problemu obliczania powierzchni z zestawu punktów konturu 3D? (2) Jeśli tak, jak wykonać interpolację cienkich blach na scipy z siatką nie-UNIFORM?

Jeszcze raz dziękuję! Miguel

UPDATE: REALIZACJA w MATLAB (ale to nie działa na scipy Python)

Śledziłem this example użyciu tpaps funkcji MATLAB i uzyskała minimalną powierzchnię dopasowany do mojego konturu na jednolitej siatki. Jest to wynik w Matlab (wygląda świetnie!): enter image description here

Jednak muszę wdrożyć to w Pythonie, więc używam pakietu scipy.interpolate.Rbf i funkcję thin-plate.Oto kod w Pythonie (XYZ zawiera współrzędne 3D Każdy punkt na konturze):

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) 

jednak jest to wynik (różni się od uzyskanego w Matlab):

enter image description here

Jest oczywiste, że wynik scipy nie odpowiada minimalnej powierzchni.

Czy scipy.interpolate.Rbf + cienka płyta działa zgodnie z oczekiwaniami, dlaczego różni się od wyniku Matlaba?

+0

Jaka jest dokładnie relacja między punktami 3d a pożądanym wynikiem? Czy masz punkty, które leżą w przybliżeniu na minimalnej powierzchni i szukasz algebraicznego opisu tej powierzchni? A może punkty opisują pewną granicę i szukasz minimalnej powierzchni zdefiniowanej przez tę granicę? Jaką formę powinien mieć twój produkt? Może to pomóc w zobaczeniu całego kodu matlab, tak aby można było szukać sposobów na przetłumaczenie go, nawet bez zrozumienia interpretacji jako minimalnych powierzchni. Czy https://launchpad.net/cbcpdesys wyglądają na przydatne? – MvG

+0

@MvG: zobacz więcej szczegółów w moim zaktualizowanym pytaniu. (1) Punkty leżą w przybliżeniu na minimalnej powierzchni; (2) Punkty opisują granicę, jeszcze nie uzyskanej powierzchni (3). Idealny rodzaj powierzchni, którą chcę uzyskać, to trójkątna reprezentacja siatki. – CodificandoBits

+0

Spróbuj również zapytać w http://scicomp.stackexchange.com. – lhf

Odpowiedz

1

Pytanie wyjaśnia, że ​​musimy rozwiązać nieliniowe równanie różniczkowe cząstkowe. Jednak Wikipedia stwierdza, że ​​"są one trudne do zbadania: prawie nie istnieją ogólne techniki, które działają dla wszystkich takich równań, i zwykle każde indywidualne równanie musi być badane jako osobny problem." Jednak nie dałeś równania! A czy Matlab czasem używa algorytmów genetycznych, by dotrzeć do jego powierzchni? To znaczy, czy stosuje się regułę, aby zgadywać, a następnie próbuje małych zmian w kwadratach komponentów, dopóki nie znajdzie się mniejszej powierzchni. Wdrożenie tego rodzaju rozwiązania byłoby pracochłonne, ale nie koncepcyjnie trudne (zakładając, że lubisz takie rzeczy). Pamiętaj także, że rachunek funkcji ciągłych jest tylko specjalnym przypadkiem rachunku wszystkich liniowych przybliżeń funkcji (przyrost jest ustawiony na zero zamiast jakiejś skończonej wartości). Stało się to dla mnie jasne, czytając książki JL Bella o gładkiej, nieskończenie małej analizie - po prostu użyj tej algebry ze skończonymi przyrostami i pozostaw powstałe czynniki w wyprowadzeniach zamiast "zaniedbywać" je.

0

Oczywiście Matlab i SciPy rozumieją TPS na różne sposoby. Implementacja Matlab wygląda poprawnie. SciPy traktuje TPS w taki sam sposób, jak inne RBF-y, abyś mógł go poprawnie wdrożyć w Pythonie - wystarczyłoby utworzyć macierz odpowiedniego układu równań liniowych i rozwiązać go, aby otrzymać współczynniki TPS.

Powiązane problemy