2013-05-18 80 views
23

我有一組定義3D輪廓的3D點。我想要做的是獲得對應於這個輪廓的最小表面表示(see Minimal Surfaces in Wikipedia)。基本上這需要求解一個非線性偏微分方程。Python中的最小表面解決方案

在Matlab中,使用pdenonlin功能(see Matlab's documentation)幾乎是直接的。可以在這裏找到其用於解決最小表面問題的示例:Minimal Surface Problem on the Unit Disk

我需要在Python中做出這樣的實現,但是我知道我還沒有找到任何關於如何實現這個的網頁資源。

任何人都可以指出我的任何資源/這種實現的例子嗎?

謝謝, Miguel。

UPDATE

所述的3D表面(理想的三角形網格表示),我想找到由該組3D點的有界(如見於該圖中,點位於在最佳擬合平面) :

enter image description here

好了,所以做了一些研究,我發現,這個極小曲面問題與Biharmonic Equation的解決方案相關的,而且我還發現,Thin-plate spline是這個方程根本上解決。

所以我認爲這種方法將嘗試使用薄板樣條擬合表面的稀疏表示(由點的3D輪廓給出)。我發現this example in scipy.interpolate其中散佈數據(x,y,z格式)使用薄板樣條插值以獲得均勻網格(XI,YI)上的ZI座標。

出現兩個問題: (1)對於3D輪廓點集計算曲面問題,薄板樣條插值是否是正確的方法? (2)如果是這樣,如何使用非均勻網格對scipy執行薄板插值?

再次感謝! 米格爾

UPDATE:實現在Matlab(但它不工作ON SciPy的Python)的

我跟着this example使用Matlab的tpaps功能和獲得的最小表面安裝到我的輪廓上的統一電網。這是結果在Matlab(看上去太棒了!): enter image description here

不過,我需要在Python實現這一點,所以我使用的是包scipy.interpolate.Rbf和thin-plate功能。下面是在Python代碼(XYZ包含每個點的輪廓中的三維座標):

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) 

不過這是結果(從Matlab中獲得很大的不同):

enter image description here

很明顯,scipy的結果不符合最小的曲面。

是scipy.interpolate.Rbf +薄板做不如預期,爲什麼它從MATLAB的結果有什麼不同?

+0

你的3d點與你想要的輸出之間的關係究竟是什麼?你有沒有位於最小表面上的點,並且你正在尋找該表面的代數描述?或者點描述了某種邊界,並且您正在尋找由該邊界定義的最小曲面?你的輸出應該是什麼形式?它可能有助於查看整個matlab代碼,以便人們可以尋找翻譯方法,即使不理解解釋爲最小曲面。 https://launchpad.net/cbcpdesys看起來有用嗎? – MvG

+0

@MvG:在我更新的問題中查看更多詳情。 (1)這些點大致位於最小的表面上; (2)這些點描述尚未獲得的曲面的邊界(3)理想情況下,我想獲得的曲面類型是三角形網格表示。 – CodificandoBits

+0

嘗試在http://scicomp.stackexchange.com中詢問。 – lhf

回答

1

這個問題表明我們需要求解一個非線性偏微分方程。然而,維基百科表示,「他們很難研究:幾乎沒有適用於所有這些方程的通用技術,通常每個方程都必須作爲一個單獨的問題來研究。」但是,你沒有給出等式!並且Matlab有時使用遺傳算法到達其表面?也就是說,它是否使用經驗法則進行最佳猜測,然後嘗試組件方塊中的小變化,直到找不到更小的表面。實施這種解決方案會很費勁,但在概念上並不困難(假設你喜歡這種方式)。還要記住,連續函數的演算只是函數的所有線性逼近的演算的一個特例(增量設置爲零而不是某個有限值)。通過閱讀J·L·貝爾關於平滑無窮小分析的書籍,我可以清楚地看到這一點 - 只需使用具有有限增量的代數,並將所得因子留在導數中,而不是「忽略」它們。

0

很明顯,Matlab和SciPy以不同的方式理解TPS。 Matlab實現看起來是正確的。 SciPy以與其他RBF相同的方式處理TPS,因此您可以自己在Python中正確實現它 - 只需形成相關線性方程系統的矩陣並解決它以接收TPS係數即可。