python - 为什么 linspace 和 interp1d 的输出总是一样的?
问题描述
所以我正在做我的任务,我们需要使用插值(线性插值)。我们被要求使用interp1d
包 from并使用它在给定新值和旧坐标scipy.interpolate
的情况下生成新值和.
为了获得新的坐标(让我们称之为),我使用了 between和新的坐标(让我们称之为),我发现使用函数 on 。 y
x
(x1,y1)
(x2,y2)
x
x_new
np.linspace
(x1,x2)
y
y_new
interp1d
x_new
但是,我也注意到应用np.linspace
on生成的值与我们从on中得到(y1,y2)
的值完全相同。 y_new
interp1d
x_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
解决方案
您偶然发现这一点的原因是您仅使用两个点来对线性函数进行插值。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 点将位于。在我们应用我们的线性函数后,这些点最终会达到什么值?让我们插入:start
stop
start
start + delta
end
delta
delta=(end-start)/(num - 1)
n
xn=x1+n*(x2-x1)/(num-1)
y
interp1d
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
值,然后比较结果。
推荐阅读
- mysql - 如何插入值(codeigniter)
- javascript - 如何下载多张图片?
- laravel - Heroku 部署后如何将 Vue.js 应用程序连接到 Laravel REST API
- android - 对话框片段中的内存泄漏
- python - Python 是否有逻辑反转标记,如 Java 中的感叹号?
- python - 没有从 for 循环中追加列表中的第一个值
- python - REST API 的 Python 请求令牌不断返回 401 无法确定正确的令牌格式
- c++ - 在 C++ 中写入 IPC SHM 时无法读取完整的字符串
- javascript - 如何仅在状态更改后解决 Promise
- visual-studio - 在 Visual Studio 中编写 MFC/STL 程序需要做什么?