首页 > 解决方案 > 为什么 linspace 和 interp1d 的输出总是一样的?

问题描述

所以我正在做我的任务,我们需要使用插值(线性插值)。我们被要求使用interp1d包 from并使用它在给定新值和旧坐标scipy.interpolate的情况下生成新值和. 为了获得新的坐标(让我们称之为),我使用了 between和新的坐标(让我们称之为),我发现使用函数 on 。 yx(x1,y1)(x2,y2)
xx_newnp.linspace(x1,x2)yy_newinterp1dx_new

但是,我也注意到应用np.linspaceon生成的值与我们从on中得到(y1,y2)的值完全相同。 y_newinterp1dx_new

谁能向我解释为什么会这样?如果这是真的,它总是真的吗?
如果这总是正确的,为什么我们在interp1d可以使用的时候还需要使用这个函数np.linspace呢?

这是我写的代码:

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

标签: pythonnumpyscipyinterpolation

解决方案


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

您从两个输入点获得的线性函数由参数m=(y1-y2)/(x1-x2)和定义b=y1-m*x1(x1,y1),(x2,y2)您的两个输入点(或代码片段中的x和数组中的元素)在哪里。y

那么,现在做np.linspace(start, stop, num,...)什么呢?它为您提供和num之间均匀分布的点。这些点是, , ..., 。步长由 给出。-1 来自您想要包含端点的事实。所以你的区间中的第 th 点将位于。在我们应用我们的线性函数后,这些点最终会达到什么值?让我们插入:startstopstartstart + deltaenddeltadelta=(end-start)/(num - 1)nxn=x1+n*(x2-x1)/(num-1)yinterp1d

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值,然后比较结果。


推荐阅读