python - Python中的最小曲面解决方案

标签 python geometry interpolation mesh differential-equations

我有一组定义 3D 轮廓的 3D 点。我想要做的是获得与这个轮廓对应的最小表面表示(see Minimal Surfaces in Wikipedia) .基本上这需要求解一个非线性偏微分方程。

在 Matlab 中,使用 pdenonlin 函数 (see Matlab's documentation) 几乎很简单。 .可以在此处找到其用于解决最小曲面问题的示例:Minimal Surface Problem on the Unit Disk .

我需要在 Python 中进行这样的实现,但据我所知,我还没有找到任何关于如何实现的网络资源。

谁能指出这种实现的任何资源/示例?

谢谢, 米格尔。

更新

我想要找到的 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 上进行薄板插值?

再次感谢! 米格尔

更新:在 MATLAB 中的实现(但它不适用于 SCIPY PYTHON)

我关注了this example使用 Matlab 的 tpaps 函数并在均匀网格上获得适合我的轮廓的最小表面。这是 Matlab 中的结果(看起来很棒!): enter image description here

但是我需要在 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 中获得的结果大不相同):

enter image description here

很明显,scipy 的结果并不对应于最小表面。

scipy.interpolate.Rbf + thin-plate 效果是否符合预期,为什么与 Matlab 的结果不同?

最佳答案

显然,Matlab 和 SciPy 以不同的方式理解 TPS。 Matlab 实现看起来是正确的。 SciPy 对 TPS 的处理方式与其他 RBF 相同,因此您可以自己在 Python 中正确实现它 - 形成相关线性方程组的矩阵并对其求解以接收 TPS 的系数就足够了。

关于python - Python中的最小曲面解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16625316/

相关文章:

python argparse store --foo=bar as args.key ='foo' , args.value ='bar'

python - 获取字段作为参数的函数

algorithm - 针对凸多面体形状类型转换胶囊

c - 编写代码来查找坐标之间的平行线(使用 C)

python - 从 bspline 中提取圆弧/圆定义

java - java中的Matlab函数imresize

python - 如何在Python中插入数据?

python - 很难理解 Bellman Ford 的迭代

python - Django - 用户继承了 IntegrityError

python - 如何让 python 中的函数在 2 个列表(每个列表都有自己的 x、y)之间进行插值?