在网格上插值的最佳算法

4
我有一组坐标由数组 x , y 和 z 给出,并且每个点中密度场的值存储在数组 d 中。 我想在均匀网格上重建密度场。 最好的算法是什么? 我知道在Python中,Scipy模块的 griddata 函数很方便,但我想编写自己的代码,我只需要一个提示。

你有一个网格还是随机散点?你的点是如何存储的? - Kendall Frey
我的点是随机分布的,它们没有在任何网格上定义。目的是在正则网格上平滑密度分布。 - Brian
那么,这篇文章或许对你有所帮助。 - Kendall Frey
3个回答

2

如果您有某种标量场,并且点是场的起源,您可以通过遍历所有格点并计算给定源的场强度来实现暴力方法。有递归方法允许“消除”宽范围的体积,其中场几乎是恒定的,并且通过计算从一个点到下一个点的变化来节省一些CPU时间的技术。

如果您拥有的点是值的采样,则必须将空间分解为卷,并插值值。您可以使用简单的Voronoi分解-通常在2D中进行降水测量-或Delaunay四面体化(您可以查看TetGen的文档)。第一种方法假定每个Voronoi体积中函数是恒定的;最后允许呈现三线性插值

如果您需要平滑3D网格,则三线性插值似乎是最佳方法。

还有其他用于快速可视化的方法,涉及维护按距离从任何一个给定点到您的常规网格中的顺序排列的3D点列表。在穿过网格时,您使用二次增量重新计算距离。然后,您根据所选基数的一部分点执行简单的插值(即,如果您考虑距离d1..d4的四个最近点,则通过按比例加权v1..v4的值来计算P中的值)。这种方法自己实现起来快速而容易,但请注意,在点之间的最小距离小于晶格步长的地方,它的性能不佳(您可以通过考虑更多的点来补偿这一点;如果采样函数在相同的尺度上平滑,则效果不太明显)。


1

如果您想自己实现数学方法,当然需要先学习理论。在这种情况下,它是三维散点数据插值

维基百科, MATLAB帮助scipy帮助都说至少有半打不同的方法。维基百科对它们有相当好的描述,还有一篇比较文章,但我强烈建议您在这样一个术语密集型的主题上找到一些您本地语言的资料。


1
一种方法是形成散点 [x,y,z] 的 Delaunay 三角剖分(在您的 3D 情况下实际上是四面体剖分!),并在每个元素内使用密度场的线性表示进行插值,该线性表示在四面体顶点处定义。
要评估每个结构化网格点的密度,您需要 (i) 确定点位于哪个四面体中,然后 (ii) 评估线性插值器。
形成 Delaunay 三角剖分并不容易,但有一些很好的库可用于此,具体取决于您选择的语言。一个很好的选择是 CGAL
希望这可以帮助到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接