我的任务是开发一种算法,给定一组表示现有表面测量值的稀疏点,我们就可以计算表面上任何点的 z 坐标。面临的挑战是找到一种合适的插值方法,该方法可以在仅给定几个点的情况下重新创建 3D 表面,并推断出超出包含初始测量值的范围的值(对于许多插值方法来说,这是一个臭名昭著的问题)。
在尝试将许多分析曲线拟合到我决定使用的点之后RBF插值 https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.Rbf.html因为我认为这会更好地再现表面,因为点应该全部位于表面上(我假设测量的误差可以忽略不计)。
考虑到我使用的几个点,第一个结果非常令人印象深刻。
插值结果 https://i.stack.imgur.com/W7Frc.png
在我展示的图片中,蓝色点是用于 RBF 插值的点,它产生以灰度表示的形状。相反,红点是我试图用插值算法重现的相同形状的附加测量值。
不幸的是,存在一些异常值,特别是当我尝试推断进行初始测量的区域之外的点时(您可以在图片的右上角和中下插图中看到这一点)。这是可以预料的,特别是在 RBF 方法中,因为我试图从最初没有任何信息的区域中提取信息。
显然,RBF 插值试图使表面变平,而我只需要continue随着形状的曲率。当然,考虑到它是如何定义的,该方法对此一无所知。然而,这会导致与我试图拟合的测量结果存在很大差异。
这就是为什么我问是否有任何方法可以限制插值方法以保持曲率或使用不同的径向基函数,该函数不会仅在插值范围的边界上如此快速地平滑。我尝试了 epsilon 参数和距离函数的不同组合,但没有成功。这就是我现在正在使用的:
from scipy import interpolate
import numpy as np
spline = interpolate.Rbf(df.X.values, df.Y.values, df.Z.values,
function='thin_plate')
X,Y = np.meshgrid(np.linspace(xmin.round(), xmax.round(), precision),
np.linspace(ymin.round(), ymax.round(), precision))
Z = spline(X, Y)
我也在考虑创建一些额外的dummy插值范围之外的点可以进一步约束模型,但这会非常复杂。
我还附加了一个动画,以便更好地了解表面。
动画片 https://i.stack.imgur.com/jgftB.gif