2013-12-08 68 views
6

我很抱歉有些令人困惑的标题,但我不确定如何总结这个更清晰。如何内插两个不规则数据集之间的点?

我有两组X,Y数据,每组对应一个总的总体值。他们从原始数据中进行相当密集的抽样。我正在寻找的是一种为任何给定的Y找到插值X的方法,以获得我已拥有的集合之间的值。

图表使这更清楚:

A graph of points

在这种情况下,红色线是从对应于100的一组,黄线是从对应于50

一组我想能够说,假设这些集合对应于值的梯度(尽管它们明显由离散的X,Y测量值组成),那么我如何找到,比如说,如果Y为500对于一个相当于75的值的集合?

在这里的例子我希望我所希望的点是什么地方在这里:

A graph of points with an interpolated point

我不需要这个功能过于花哨 - 它可以是数据点的简单线性插值。我只是无法思考。

请注意,两组的X和Y都没有完全重叠。然而,“这些集合最接近的X点在哪里”或“这些集合共享的最接近的Y点在哪里”的说法相当简单。我已经在已知值之间使用了简单的插值(例如找到设置为“50”和“100”的相应Ys的X值,然后平均值得到“75”),最后我看到类似这样的东西:

Not very good interpolation

所以很明显,我在这里做了什么。很明显,在这种情况下,对于Y高于“最低”集合的最大值Y的所有情况,X(正确)返回0。事情从一开始就很好,但是当某个人开始接近最低值Y时,它开始出现故障。

很容易明白为什么我的错误。这里是另一种方式来看待这个问题:

Illustration

在“正确”的版本,X应该是约250相反,我在做什么基本上是平均400和0,X是200。在这种情况下我如何解决X?我认为双线性插值可能会有答案,但是我一直没能找到答案,这就清楚地说明了我将如何去做这类事情,因为它们似乎都是针对不同的问题构建的。

谢谢您的帮助。请注意,尽管我已经明确地绘制了R中的上述数据,以便轻松查看我在说什么,但最终的工作是使用Javascript和PHP。我不是在寻找一些重任;简单就好。

+0

这听起来更像是一个数学问题,而不是编程问题,所以可能更适合http://math.stackexchange.com或http://stats.stackexchange.com。 –

+1

我正在寻找一种实用的解决方案,而不是理论上的解决方案。我对这类论坛的经验是他们想回答一个优雅的等式,我不知道如何实现代码。 (另外,我从字面上理解目前在数学或统计数据首页上没有任何问题,这不是令人鼓舞的......)(我的意思是一个例子:http://math.stackexchange.com/questions/177491/如何执行简单线性插值的数据集) – nucleon

+0

问题是您可能在红线和/或黄线上没有重点?如果是这样,你可以分别插入红线和黄线的值,然后取平均值..? – thebjorn

回答

9

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

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长度的百分比(来自步骤1)的位置。检查Y值。这是我们期望的Y值吗?如果是(不太可能),则返回该点的X.如果不是,请查看Y是否小于目标Y.如果是,则将该点的位置存储在一个变量中,我将该变量设置为lowY。然后再次返回步骤2查找外曲线上的下一个点。如果它大于目标Y,请查看lowY是否有值。如果是的话,这两个值之间的插值,并返回插值X.(我们已经“在盒子里”我们所期望的坐标,换句话说。)

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

Jaggy results

我下毫不做作,这是一个优化的解决方案,但求解点的采空区实际上是瞬时的我的电脑上,所以我承担对于现代化的机器来说,这不是太重要,至少是我拥有的总点数(每条曲线30-50)。

感谢大家的帮忙;它通过一点点说明了这一点,并且意识到我在这里所做的并不是简单的线性插值,而是沿曲线的一种“径向”插值。

+2

真的很好的工作人。我有同样的问题,但使用matlab。这里是答案,如果你想它=) http://stackoverflow.com/questions/23494254/interpolation-between-two-curves-matlab – Nikko

相关问题