这个插值函数如何工作?

时间:2015-01-10 22:07:16

标签: python scipy

我正在尝试编写一个内插一些数据的函数,然后你可以选择x轴上的任何值来找到y轴上的相应点。

例如:

f = f_from_data([3, 4, 6], [0, 1, 2])
print f(3.5)

产生答案

0.5

我遇到了一个看起来像这样的答案:

def f_from_data(xs,ys):
    return scipy.interpolate.interp1d(xs, ys)

有人可以解释一下这是如何运作的吗?我理解interp1d,但我不确定这段简单的代码如何能够得到答案,例如

print f(5)
输入

3 个答案:

答案 0 :(得分:2)

一个简单的例子可能有所帮助。 interp1d是一个类似函数的类。它不返回数字,而是返回另一个类似函数的对象。再次调用它后,它会在x的输入值处返回y的插值。您也可以为此功能提供单点或整个数组:

import numpy as np
from scipy.interpolate import interp1d

X=[3,4,6]
Y=[0,1,2]

f = interp1d(X,Y, bounds_error=False)
print f(3.5)

X2 = np.linspace(3, 6, 5)
print X2
print f(X2)

0.5
[ 3.    3.75  4.5   5.25  6.  ]
[ 0.     0.75   1.25   1.625  2.   ]

答案 1 :(得分:1)

引用documentation

This class returns a function whose call method uses interpolation 
to find the value of new points.

因此,使用x值调用返回的函数会得到相应的插值y值。

答案 2 :(得分:1)

您的示例使用线性插值 - 数据点之间的直线连接。

因此,对于您的给定数据(xs = [3, 4, 6]ys = [0, 1, 2]),该函数看起来像

chart of interpolated function

其中蓝点是输入数据,绿线是插值函数,红点是测试点f(3.5) == 0.5


计算f(5.0)

首先,您必须找出您所在的细分市场。

x == 5位于第二段,介于4到6之间,因此我们在点C (5, y)A (4, 1)之间寻找点B (6, 2)

C就行,AC = k * AB其中0. <= k < 1.;这给了我们两个未知数的方程(ky)。解决,我们得到

y = Ay + (By - Ay) * (Cx - Ax) / (Bx - Ax)

并加入,

y = 1. + (2. - 1.) * (5. - 4.) / (6. - 4.)
  = 1.5

因此插值点为C (5, 1.5),函数返回f(5.0) = 1.5


从上面开始,您应该可以编写自己的f()函数给定xsys;这正是scipy.interpolate.interp1d(xs, ys)所做的 - 取xsys并返回插值函数,即

f = scipy.interpolate.interp1d([3, 4, 6], [0, 1, 2])

# f is now a function that you can call, like
f(5.0)      # =>  1.5