这个插值函数是如何工作的?
How does this interpolating function work?
我正在尝试编写一个内插一些数据的函数,然后您可以选择 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)
输入进去了。
This class returns a function whose call method uses interpolation
to find the value of new points.
因此,使用 x
值调用返回的函数会给出相应的插值 y
值。
一个简单的例子可能会有帮助。 interp1d
是一个像函数一样工作的 class。它 returns 不是一个数字,而是另一个类似函数的对象。一旦你再次调用它,它 returns y 在 x 的输入值处的插值。您还可以为该函数提供单个点或整个数组:
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. ]
您的示例使用线性插值 - 数据点之间的直线连接。
因此,对于您给定的数据(xs = [3, 4, 6]
和 ys = [0, 1, 2]
),函数看起来像
其中蓝点为输入数据,绿线为插值函数,红点为测试点f(3.5) == 0.5
计算f(5.0)
:
首先,你得找出你在哪条线段上。
x == 5
在第二段,4 和 6 之间,所以我们要在点 A (4, 1)
和 B (6, 2)
之间寻找点 C (5, y)
。
C
就行了,所以AC = k * AB
where 0. <= k < 1.
;这给了我们两个未知数的两个方程(k
和 y
)。求解,我们得到
y = Ay + (By - Ay) * (Cx - Ax) / (Bx - Ax)
并代入,
y = 1. + (2. - 1.) * (5. - 4.) / (6. - 4.)
= 1.5
所以插值点是C (5, 1.5)
和函数returnsf(5.0) = 1.5
根据以上内容,您应该可以编写自己的 f()
函数,给定 xs
和 ys
;这正是 scipy.interpolate.interp1d(xs, ys)
所做的 - 采用 xs
和 ys
以及 returns 一个插值函数,即
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
我正在尝试编写一个内插一些数据的函数,然后您可以选择 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)
输入进去了。
This class returns a function whose call method uses interpolation
to find the value of new points.
因此,使用 x
值调用返回的函数会给出相应的插值 y
值。
一个简单的例子可能会有帮助。 interp1d
是一个像函数一样工作的 class。它 returns 不是一个数字,而是另一个类似函数的对象。一旦你再次调用它,它 returns y 在 x 的输入值处的插值。您还可以为该函数提供单个点或整个数组:
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. ]
您的示例使用线性插值 - 数据点之间的直线连接。
因此,对于您给定的数据(xs = [3, 4, 6]
和 ys = [0, 1, 2]
),函数看起来像
其中蓝点为输入数据,绿线为插值函数,红点为测试点f(3.5) == 0.5
计算f(5.0)
:
首先,你得找出你在哪条线段上。
x == 5
在第二段,4 和 6 之间,所以我们要在点 A (4, 1)
和 B (6, 2)
之间寻找点 C (5, y)
。
C
就行了,所以AC = k * AB
where 0. <= k < 1.
;这给了我们两个未知数的两个方程(k
和 y
)。求解,我们得到
y = Ay + (By - Ay) * (Cx - Ax) / (Bx - Ax)
并代入,
y = 1. + (2. - 1.) * (5. - 4.) / (6. - 4.)
= 1.5
所以插值点是C (5, 1.5)
和函数returnsf(5.0) = 1.5
根据以上内容,您应该可以编写自己的 f()
函数,给定 xs
和 ys
;这正是 scipy.interpolate.interp1d(xs, ys)
所做的 - 采用 xs
和 ys
以及 returns 一个插值函数,即
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