二维插值不规则网格fortran

use*_*812 4 interpolation non-uniform-distribution

如何在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  -

.......
.......
Run Code Online (Sandbox Code Playgroud)

Flo*_*ris 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值已经均匀间隔的事实.这允许您进行更好的插值.看这张图:

在此输入图像描述

  • 我描述的方法只需要你找到四个"非矩形"角点,其中`y11 <Y,y21 <Y,y12> Y,y22> Y`.即使对于未排序的数组,您也可以找到这些点; 之后,使用我给出的方程转换为矩形网格并进行插值.看看@ Simon的建议,看看GEOMPACK获得Delaunay三角剖分 - 那么你可以使用[重心插值](http://classes.soe.ucsc.edu/cmps160/Fall10/resources/barycentricInterpolation.pdf).这样做一次以获得矩形网格上的值将是要走的路 - 然后使用快速插值. (3认同)

Sim*_*mon 6

找到解决这个问题的最快方法之前,我建议找到一个方法来解决这个问题.简而言之,我建议:

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

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

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

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