这个插值函数是如何工作的?

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)

输入进去了。

引用documentation

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.;这给了我们两个未知数的两个方程(ky)。求解,我们得到

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() 函数,给定 xsys;这正是 scipy.interpolate.interp1d(xs, ys) 所做的 - 采用 xsys 以及 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