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

nuc*_*eon 10 interpolation linear-interpolation

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

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

该图表使这一点更加清晰:

点图

在这种情况下,红线来自对应于100的集合,黄线来自对应于50的集合.

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

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

带插值点的点图

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

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

我已经在已知值之间使用了简单的插值(例如,对于设置"50"和"100",找到相应Y的X,然后将它们平均得到"75"),我最终会看到如下所示:

插值不太好

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

我很容易理解为什么我的错了.这是另一种查看问题的方法:

插图

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

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

nuc*_*eon 11

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

最终产品

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

我的代码太粗糙,而且对我的项目来说太具体了,对其他任何人都没什么用处.但这是基本逻辑.

您必须有两组数据才能进行插值.我将这些称为"外部"曲线和"内部"曲线.假设"外部"曲线完全包围"内部"曲线,而不与"内部"曲线相交.曲线实际上只是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大,,看看洛伊中有一个值.如果是,则在两个值之间进行插值并返回插值的X.(换句话说,我们将"装入"我们想要的坐标.)

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

Jaggy的结果

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

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

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