我有一组定义 3D 轮廓的 3D 点。我想要做的是获得与这个轮廓相对应的最小表面表示(参见维基百科中的最小表面)。基本上这需要求解非线性偏微分方程。
在 Matlab 中,使用该pdenonlin
函数几乎很简单(参见 Matlab 的文档)。可以在此处找到其用于解决最小曲面问题的示例:单元盘上的最小曲面问题。
我需要在 Python 中进行这样的实现,但据我所知,我还没有找到任何关于如何实现的网络资源。
谁能指出这种实现的任何资源/示例?
谢谢,米格尔。
更新
我想要找到的 3D 表面(理想情况下是三角形网格表示)由这组 3D 点限定(如图所示,这些点位于最佳拟合平面中):
好的,所以做了一些研究,我发现这个最小表面问题与双调和方程的解有关,我还发现薄板样条是这个方程的基本解。
所以我认为该方法是尝试使用薄板样条曲线拟合表面的这种稀疏表示(由点的 3D 轮廓给出)。我在 scipy.interpolate 中找到了这个示例,其中使用薄板样条插值分散数据(x,y,z 格式)以获得均匀网格(XI,YI)上的 ZI 坐标。
出现了两个问题:(1)薄板样条插值是否是从 3D 轮廓点集计算表面问题的正确方法?(2)如果是这样,如何使用非均匀网格对scipy进行薄板插值?
再次感谢!米格尔
更新:在 MATLAB 中的实现(但它不适用于 SCIPY PYTHON)
我使用 Matlab 的函数遵循这个例子tpaps
,并在均匀的网格上获得了适合我的轮廓的最小表面。这是 Matlab 中的结果(看起来很棒!):
但是我需要在 Python 中实现它,所以我使用包 scipy.interpolate.Rbf 和thin-plate
函数。这是python中的代码(XYZ
包含轮廓中每个点的3D坐标):
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 + thin-plate 是否按预期进行,为什么它与 Matlab 的结果不同?