Cod*_*its 23 python geometry interpolation mesh differential-equations
我有一组定义3D轮廓的3D点.我想要做的是获得与此轮廓相对应的最小曲面表示(请参阅维基百科中的最小曲面).基本上这需要求解非线性偏微分方程.
在Matlab中,使用该pdenonlin
函数几乎是直截了当的(参见Matlab的文档).可以在此处找到用于解决最小表面问题的示例:单位磁盘上的最小表面问题.
我需要在Python中实现这样的实现,但我知道我还没有找到任何关于如何实现这一目标的Web资源.
任何人都可以指出这种实施的任何资源/例子吗?
谢谢,米格尔.
UPDATE
我想要找到的3D表面(理想情况下是三角形网格表示)受这组3D点的限制(如图所示,这些点位于最佳拟合平面中):
好吧,做一些研究我发现这个最小的表面问题与双调和方程的解决方案有关,我还发现薄板样条是这个方程的基本解.
所以我认为这种方法是尝试使用薄板样条来拟合表面的稀疏表示(由点的3D轮廓给出).我在scipy.interpolate中找到了这个例子,其中使用薄板样条插值散射数据(x,y,z格式)以获得均匀网格(XI,YI)上的ZI坐标.
出现两个问题:(1)薄板样条插值是否是从三维轮廓点集计算表面问题的正确方法?(2)如果是这样,如何使用NON-UNIFORM网格在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)
Run Code Online (Sandbox Code Playgroud)
然而,这是结果(与Matlab中获得的结果完全不同):
很明显,scipy的结果与最小的表面不对应.
是scipy.interpolate.Rbf +薄板如预期的那样,为什么它与Matlab的结果不同?
小智 -1
显然,Matlab 和 SciPy 对 TPS 的理解方式不同。Matlab 实现看起来是正确的。SciPy 对待 TPS 的方式与其他 RBF 相同,因此您可以自己在 Python 中正确实现它 - 形成相关线性方程组的矩阵并求解它以获得 TPS 系数就足够了。