4

如何在 FORTRAN 中实现二维插值,其中数据如下所示。x 和 y 是两个坐标,z 是依赖于它们的值 x 是均匀分布的,但 y 不是均匀分布的,并且对应于 x 的均匀值的 y 的最大值不断增加。在不损失太多准确性的情况下-

  • 根据给定的 x 和 y 获得 z 值的最简单方法是什么?
  • 根据给定的 x 和 y 获得 z 值的最快方法是什么?

谢谢 SM

x    y    z
-----------
0   0     -
0   0.014 -
0   0.02  -

.....
....

0.1 0     -
0.1 0.02  -
0.1 0.03  - 

.......
.....

1.0  0     -
1.0  0.05  -
1.0  0.08  -

.......
.......
4

3 回答 3

7

我将假设您已经按照您提供的格式将数据读入数组 N x 3。我假设您事先不知道 X 间距是什么——您肯定不知道 Y 间距,因为它会发生变化。因此,我会推荐以下策略:

  • 找出 X 间距:从第一行开始,遍历 X 元素,直到看到值发生变化。您现在知道 XSTART 和 XSTEP - 稍后您将需要它们。
  • 在数组中对值 X 进行二分搜索,直到找到 XFOUND 值,使得 XFOUND < X < XFOUND + XSTART
  • 假设您指向“列表中的某个位置”,您会找到相应的 Y 值 - 取决于它是否大于或小于您需要的值,您向上或向下排列数组,直到找到第一个条目 < Y。相应的值分别是 X11、Y11、Z11。数组中的下一行有 X12 Y12 和 Z12。
  • 您还需要两个点才能进行插值 - 重复此过程,寻找“X 的下一个较大值”。这将为您提供 XYZ21 和 XYZ22
  • 现在您可以考虑计算插值 Z 值。一般来说,有不同的技术,具有不同的精度:
  • “最近邻”:找到最近的点,并使用它的 Z 值(最简单,最不准确)
  • “线性插值”:找到最近的三个点,并根据相对距离对值进行线性插值
  • “高阶估计”:为此,您通常需要创建网格点的完整连接映射,因此您可以进行样条插值并获得通常在网格点之间的点处更准确的平滑插值(假设样本所描述的函数实际上是一个平滑函数!)

我的 FORTRAN 有点生锈 - 希望这能有所帮助。

PS - 可能更简单的方法是使用 X 值已经均匀分布的事实。这使您可以进行更好的插值。看这张图片:

在此处输入图像描述

于 2013-07-04T22:35:45.160 回答
6

在找到解决此问题的最快方法之前,我建议先找到解决问题方法。简而言之,我建议:

1) 求 (x,y) 点的 Delaunay 三角剖分。例如,执行此操作的 Fortran 代码位于GEOMPACK中。

2) 要进行插值,给定 Delaunay 三角剖分,找到包含要进行插值的点的三角形,然后根据该点相对于每个三角形顶点的位置对 z 值进行插值。

(编辑)我忘记了方法的名称(如果我知道的话)但是,感谢@Floris,一种在三角形中插值的好方法称为重心插值,它根据区域的比率找到插值在三个较小的三角形中,一个大三角形可以通过从大三角形内部的一点到三角形的每个角画线来分割成。每个小三角形的面积可以使用Heron 公式从三角形每条边的长度求得。

如果需要提高速度,我认为它们可以主要通过找到一种快速方法来找到包含插值点的三角形,但我想在选择要优化的代码位之前分析一些测试运行。

于 2013-07-04T23:01:57.297 回答