二维插值不规则网格fortran

时间:2013-07-04 21:55:55

标签: interpolation non-uniform-distribution

如何在FORTRAN中实现二维插值,其中数据如下所示。 x和y是两个坐标,z是取决于它们的值 x均匀间隔,但y不均匀间隔,y的最大值 对应于x的均匀值继续增加。 不会失去太多准确性 -

  • 根据给定的x获取z值的最简单方法是什么 和你?
  • 基于a获取z值的最快方法是什么? 给定x和y?

由于 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  -

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

2 个答案:

答案 0 :(得分: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值已经均匀间隔的事实。这允许您进行更好的插值。看到这张图片:

enter image description here

答案 1 :(得分:6)

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

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

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

(编辑)我忘记了方法的名称(如果我知道的话)但是,多亏了@Floris,在三角形中插值的好方法叫做barycentric interpolation,它找到基于插值的值关于三个较小三角形中的区域的比率,通过从大三角形内的点到三角形的每个角绘制线,可以将大三角形分割成三角形。可以使用Heron's formula从三角形每边的长度找到每个小三角形的面积。

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