约束 3D 表面的 RBF 插值以保持曲率

Constraining RBF interpolation of 3D surface to keep curvature

我的任务是开发一种算法,给定一组表示现有表面测量值的稀疏点,使我们能够计算表面上任何点的 z 坐标。面临的挑战是找到一种合适的插值方法,该方法可以仅在给定几个点的情况下重新创建 3D 表面,并在包含初始测量值的范围之外外推值(对于许多插值方法来说,这是一个臭名昭著的问题)。

在尝试将许多分析曲线拟合到我决定使用 RBF interpolation 的点之后,因为我认为这将更好地重现表面,因为点应该都位于它上面(我假设测量误差可以忽略不计)。

考虑到我使用的几个点,第一个结果令人印象深刻。

Interpolation results

在我显示的图片中,蓝色点是用于 RBF 插值的那些,它产生以灰度表示的形状。红点是我试图用我的插值算法重现的相同形状的额外测量值。

不幸的是,有一些异常值,尤其是当我试图推断初始测量区域之外的点时(您可以在图片的右上角和下部中心插图中看到这一点)。这是意料之中的,尤其是在 RBF 方法中,因为我试图从最初没有任何信息的区域中提取信息。

显然 RBF 插值试图使表面变平,而我只需要 继续 形状的曲率。当然,鉴于它是如何定义的,该方法对此一无所知。然而,这会导致与我试图拟合的测量结果存在很大差异。

这就是为什么我要问是否有任何方法可以限制插值方法以保持曲率或使用不同的径向基函数,该函数不会仅在插值范围的边界上如此快速地平滑。我试过 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)

我也在考虑在插值范围之外创建一些额外的虚拟点来进一步约束模型,但这会非常复杂。

我还附加了一个动画以更好地了解表面。

Animation

只是想 post 我的解决方案,以防有人遇到同样的问题。问题确实与 RBF 插值的 scipy 实施有关。相反,我尝试采用更灵活的库 https://rbf.readthedocs.io/en/latest/index.html#。 结果很酷!使用以下选项

from rbf.interpolate import RBFInterpolant
spline = RBFInterpolant(X_obs, U_obs, phi='phs5', order=1, sigma=0.0, eps=1.)

即使在边缘,我也能得到正确的形状。

Surface interpolation

我玩过不同的 phi 函数,这里是插值表面和我正在测试插值的点(图中的红点)之间的分布箱线图.

Boxplot

使用 phs5 我得到了最好的结果,上表面的平均散布约为 0.5 毫米,下表面的平均散布约为 0.8 毫米。在我得到类似的平均值但有许多异常值 > 15 毫米之前。绝对成功:)