如何在两组不规则数据之间插入点?

时间:2013-12-08 17:27:17

标签: interpolation linear-interpolation

我很抱歉这个有点令人困惑的标题,但我不知道如何更清楚地总结这一点。

我有两组X,Y数据,每组都对应一般的整体值。它们是从原始数据中相当密集地采样的。我正在寻找的是一种为任何给定Y找到插值X的方法,用于我已经拥有的集合之间的值。

图表更加清晰:

A graph of points

在这种情况下,红线是对应于100的集合,黄线是对应于50的集合。

我希望能够说,假设这些集合对应于一个值的梯度(即使它们显然由离散的X,Y测量值组成),我如何找到,例如,如果对于一个相当于75的值,Y是500?

在这里的示例中,我希望我想要的点在这附近:

A graph of points with an interpolated point

我不需要这个功能过于花哨 - 它可以是数据点的简单线性插值。我只是在思考它时遇到了麻烦。

请注意,两组的Xs和Ys都不完全重叠。然而,说“这些集合中最接近的X点在哪里”,或者“这些集合中最接近的Y点在哪里”,这是相当微不足道的。“

我在已知值之间使用了简单的插值(例如,找到设置为“50”和“100”的相应Y的X,然后平均得到“75”)并且我最终得到类似的东西:

Not very good interpolation

很明显我在这里做错了。显然,在这种情况下,对于Y高于“最低”集的最大Y的所有情况,X(正确地)返回0。事情开始很好,但是当一个人开始接近最低Y时,它开始变得混乱。

很容易理解我的错误原因。这是另一种看待问题的方法:

Illustration

在“正确”版本中,X应该是大约250.相反,我正在做的基本上是平均400和0,所以X是200.在这种情况下如何解决X?我当时认为双线性插值可能会得到答案,但是我已经能够找到的任何内容都清楚地说明了我是如何去做这类事情的,因为它们似乎都是针对不同的问题而构建的。

感谢您的帮助。请注意,虽然我已经在R中明显地绘制了上述数据,以便于查看我正在谈论的内容,但最终的工作是在Javascript和PHP中。我不是在找重物;简单就是更好。

1 个答案:

答案 0 :(得分:10)

好主人,我终于明白了。这是最终结果:

The final product

美丽!但它做了很多工作。

我的代码太粗糙,太具体到我的项目,对其他人没什么用处。但这是基本逻辑。

您必须有两组数据才能进行插值。我将这些称为“外部”曲线和“内部”曲线。假设“外部”曲线完全包围“内部”曲线,而不与“内部”曲线相交。曲线实际上只是X,Y数据的集合,并且对应于定义为Z的一组值。在此处使用的示例中,“外部”曲线对应于Z = 50并且“内部”曲线对应于Z = 100 。

重申的目标是为任何给定的Y找到X,其中Z是我们已知数据点之间的某个数字。

  1. 首先计算未知Z代表的两个曲线集之间的百分比。因此,如果在我们的示例中Z = 75,则结果为0.5。如果Z = 60,则为0.2。如果Z = 90那么那将是0.8。称这个比例为P.

  2. 选择“外部”曲线上的数据点,其中Y =您想要的Y.想象一下该点与0,0之间的线段。将其定义为AB。

  3. 我们想要找到AB与“内部”曲线相交的位置。为此,我们遍历内部曲线上的每个点。将所选点和点+ 1之间的线段定义为CD。检查AB和CD是否相交。如果没有,继续迭代直到他们这样做。

  4. 当我们找到一个AB-CD交叉点时,我们现在看看交叉点创建的线和我们在步骤2的“外部”曲线上的原始点。然后,这个线段之间是一条线。内部和外部曲线,其中线的斜率,如果它继续“向下”图表,将与0,0相交。将此新线段定义为EF。

  5. 找到EF长度的P%(从步骤1开始)的位置。检查Y值。这是我们想要的Y值吗?如果是(不太可能),则返回该点的X.如果没有,看看Y是否小于目标Y.如果是,则将该点的位置存储在变量中,我将其复制为低Y。然后再次返回步骤2,以获得外曲线上的下一个点。如果 大于目标Y,请查看lowY中是否有值。如果是,则在两个值之间进行插值并返回插值的X.(换句话说,我们将“装入”我们所需的坐标。)

  6. 上述程序运作良好。它在Y = 0的情况下失败但是很容易做到这一点,因为你可以在这两个特定点上进行插值。在样本数量少得多的地方,它会产生一些锯齿状的结果,但我想这是预期的(这些是Z = 5000,6000,7000,8000,9000,10000,其中只有5000和10000是已知点它们每个只有20个数据点 - 其余的都是插值的:

    Jaggy results

    我并不认为这是一个优化的解决方案,但是在我的计算机上几乎可以瞬间解决积分点数,所以我认为它对于现代机器来说并不太费力,至少我拥有的总点数是多少(每条曲线30-50)。

    感谢大家的帮助;通过一点点谈论这一点有很多帮助并且意识到我在这里真正想要的不是任何简单的线性插值,而是沿着曲线的一种“径向”插值。