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

问题描述 投票:0回答:1

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

在尝试将许多分析曲线拟合到这些点后,我决定使用RBF插值(https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.Rbf.html),因为我认为这将更好地重现该表面,因为这些点都应该位于该表面上(我假设是测量值的错误可以忽略不计)。

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

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)

我还考虑在插值范围之外创建一些其他dummy点,以进一步约束模型,但这将非常复杂。

我还附上动画以更好地了解表面。

Animation

python scipy interpolation surface
1个回答
0
投票

只是想发布我的解决方案,以防有人遇到相同的问题。实际上,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毫米。绝对成功:)

© www.soinside.com 2019 - 2024. All rights reserved.