为什么 linspace 和 interp1d 的输出总是一样的?

Why is the output of linspace and interp1d always the same?

所以我在做我的作业,我们需要使用插值(线性插值)。我们被要求使用 scipy.interpolate 中的 interp1d 包,并使用它在给定新 x 值和旧坐标 (x1,y1) 和 [= 的情况下生成新的 y 值16=].
为了获得新的 x 坐标(我们称之为 x_new),我在 (x1,x2) 和新的 y 坐标之间使用了 np.linspace(我们称之为 y_new ) 我发现在 x_new 上使用 interp1d 函数。

但是,我还注意到在 (y1,y2) 上应用 np.linspace 会生成与我们在 x_new 上从 interp1d 获得的 y_new 完全相同的值。

任何人都可以向我解释为什么会这样吗?如果这是真的,它总是真的吗?
如果这总是正确的,为什么我们在可以使用 np.linspace 的地方还需要使用 interp1d 函数?

这是我写的代码:

import scipy.interpolate as ip
import numpy as np

x = [-1.5, 2.23]
y = [0.1, -11]

x_new = np.linspace(start=x[0], stop=x[-1], num=10)
print(x_new)

y_new = np.linspace(start=y[0], stop=y[-1], num=10)
print(y_new)

f = ip.interp1d(x, y)
y_new2 = f(x_new)
print(y_new2)  # y_new2 values always the same as y_new

您偶然发现这一点的原因是您仅使用两个点进行线性函数的插值。您有两个不同的 x 值和对应的 y 值作为输入。然后,您要求 interp1d 找到最适合您的输入数据的线性函数 f(x)=m*x +b。由于您只有两个点作为输入数据,因此存在精确解,因为线性函数恰好由两个点定义。看这个:拿一张纸,画两个点,然后想一想你可以画多少条直线来连接这些点。

您从两个输入点获得的线性函数由参数 m=(y1-y2)/(x1-x2)b=y1-m*x1 定义,其中 (x1,y1),(x2,y2) 是您的两个输入点(或您的 [=代码段中的 10=] 和 y 数组。

那么,现在 np.linspace(start, stop, num,...) 做什么?它在 startstop 之间为您提供 num 个均匀分布的点。这些点是 startstart + delta、...、end。步长 deltadelta=(end-start)/(num - 1) 给出。 -1 来自您想要包含端点的事实。因此,间隔中的第 n 个点将位于 xn=x1+n*(x2-x1)/(num-1)。在我们应用 interp1d 的线性函数后,这些点最终会达到什么 y 值?让我们插入:

f(xn)=m*xn+b=(y1-y2)/(x1-x2)*(x1+n/(num-1)*(x2-x1)) + y1-(y1-y1)/(x1-x2)*x1。对此进行简化得到 f(xn)=(y2-y1)*n/(num - 1) + y1。这正是您从 np.linspace(y1,y2,num) 得到的,即 f(xn)=yn!

现在,这总是有效吗?不!我们利用了这样一个事实,即我们的线性函数是由我们在 np.linspace 中使用的区间的两个端点定义的。所以这在一般情况下是行不通的。尝试在输入列表中再添加一个 x 值和一个 y 值,然后比较结果。