我有一組定義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點的有界(如見於該圖中,點位於在最佳擬合平面) :
好了,所以做了一些研究,我發現,這個極小曲面問題與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(看上去太棒了!):
不過,我需要在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中獲得很大的不同):
很明顯,scipy的結果不符合最小的曲面。
是scipy.interpolate.Rbf +薄板做不如預期,爲什麼它從MATLAB的結果有什麼不同?
你的3d點與你想要的輸出之間的關係究竟是什麼?你有沒有位於最小表面上的點,並且你正在尋找該表面的代數描述?或者點描述了某種邊界,並且您正在尋找由該邊界定義的最小曲面?你的輸出應該是什麼形式?它可能有助於查看整個matlab代碼,以便人們可以尋找翻譯方法,即使不理解解釋爲最小曲面。 https://launchpad.net/cbcpdesys看起來有用嗎? – MvG
@MvG:在我更新的問題中查看更多詳情。 (1)這些點大致位於最小的表面上; (2)這些點描述尚未獲得的曲面的邊界(3)理想情況下,我想獲得的曲面類型是三角形網格表示。 – CodificandoBits
嘗試在http://scicomp.stackexchange.com中詢問。 – lhf