具有非常高传播的插值
Interpolating values that have very high spread
我正在尝试对一些数据进行插值,以便为我拥有的一些数据点制作平滑曲线,但是 interp1d 无法使用我拥有的 x 值,如果我只是制作一个新的 x 向量,它就可以工作 [ 1,2,3,4,5,6,7,8],但使用原始 x 值,我得到一些根本不适合数据的曲线。
我想知道是不是我的 x 向量跨度太大导致了问题?
我的数据是这样的:
y = np.array([0.768, 0.901, 1.790, 1.213, 0.543, 0.261, 0.121, 0.049])
x = np.array([1.2e-17, 3.7e-16, 1.2e-14, 2.8e-13, 4.8e-12, 9.2e-11, 2.0e-9, 5.0e-8])
尝试插值和绘图:
xnew = np.linspace(np.min(x),np.max(x),100)
f = interp1d(x, y, kind='quadratic')
y_smooth=f(xnew)
plt.scatter(x,y)
plt.plot(xnew, y_smooth)
plt.ylim(0,2)
plt.xscale('log')
plt.show()
给出了一个完全没有意义的数字。我已经用谷歌搜索并搜索了几个小时的解决方案,尝试了不同的方法,例如曲线拟合,但似乎没有任何效果。
更改 x 数据向量,给出所需的曲线,但显然 x 值错误:
new_x_data = [1,2,3,4,5,6,7,8]
plt.scatter(new_x_data,y)
任何帮助将不胜感激。
我认为这只是您对结果的看法存在差异。
尝试使用日志空间而不是林空间——它应该能更好地遵循这些要点。事实上,xnew 中的绝大多数点都聚集在右侧。
编辑:
这更好地显示了正在发生的事情。它是在它们之间进行插值,只是看起来不太好。
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import interp1d
y = np.array([0.768, 0.901, 1.790, 1.213, 0.543, 0.261, 0.121, 0.049])
x = np.array([1.2e-17, 3.7e-16, 1.2e-14, 2.8e-13, 4.8e-12, 9.2e-11, 2.0e-9, 5.0e-8])
xnew = np.logspace(-16, -8, 100)
f = interp1d(x, y, kind='quadratic')
y_smooth=f(xnew)
plt.scatter(x,y)
plt.plot(xnew, y_smooth)
plt.ylim(0,4)
plt.xscale('log')
plt.show()
对代码的最小更改是:
x = np.log(np.array([1.2e-17, 3.7e-16, 1.2e-14, 2.8e-13, 4.8e-12, 9.2e-11, 2.0e-9, 5.0e-8]))
y = np.array([0.768, 0.901, 1.790, 1.213, 0.543, 0.261, 0.121, 0.049])
xnew = np.linspace(np.min(x),np.max(x),100)
f = interp1d(x, y, kind='quadratic')
y_smooth=f(xnew)
plt.scatter(np.exp(x), y)
plt.plot(np.exp(xnew), y_smooth)
plt.ylim(0,2)
plt.xscale('log')
plt.show()
这让我看起来很合理。注意 log
和 exp
s 移动到日志 space 并再次退出以使插值与图一致
我正在尝试对一些数据进行插值,以便为我拥有的一些数据点制作平滑曲线,但是 interp1d 无法使用我拥有的 x 值,如果我只是制作一个新的 x 向量,它就可以工作 [ 1,2,3,4,5,6,7,8],但使用原始 x 值,我得到一些根本不适合数据的曲线。
我想知道是不是我的 x 向量跨度太大导致了问题?
我的数据是这样的:
y = np.array([0.768, 0.901, 1.790, 1.213, 0.543, 0.261, 0.121, 0.049])
x = np.array([1.2e-17, 3.7e-16, 1.2e-14, 2.8e-13, 4.8e-12, 9.2e-11, 2.0e-9, 5.0e-8])
尝试插值和绘图:
xnew = np.linspace(np.min(x),np.max(x),100)
f = interp1d(x, y, kind='quadratic')
y_smooth=f(xnew)
plt.scatter(x,y)
plt.plot(xnew, y_smooth)
plt.ylim(0,2)
plt.xscale('log')
plt.show()
给出了一个完全没有意义的数字。我已经用谷歌搜索并搜索了几个小时的解决方案,尝试了不同的方法,例如曲线拟合,但似乎没有任何效果。
更改 x 数据向量,给出所需的曲线,但显然 x 值错误:
new_x_data = [1,2,3,4,5,6,7,8]
plt.scatter(new_x_data,y)
任何帮助将不胜感激。
我认为这只是您对结果的看法存在差异。
尝试使用日志空间而不是林空间——它应该能更好地遵循这些要点。事实上,xnew 中的绝大多数点都聚集在右侧。
编辑: 这更好地显示了正在发生的事情。它是在它们之间进行插值,只是看起来不太好。
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import interp1d
y = np.array([0.768, 0.901, 1.790, 1.213, 0.543, 0.261, 0.121, 0.049])
x = np.array([1.2e-17, 3.7e-16, 1.2e-14, 2.8e-13, 4.8e-12, 9.2e-11, 2.0e-9, 5.0e-8])
xnew = np.logspace(-16, -8, 100)
f = interp1d(x, y, kind='quadratic')
y_smooth=f(xnew)
plt.scatter(x,y)
plt.plot(xnew, y_smooth)
plt.ylim(0,4)
plt.xscale('log')
plt.show()
对代码的最小更改是:
x = np.log(np.array([1.2e-17, 3.7e-16, 1.2e-14, 2.8e-13, 4.8e-12, 9.2e-11, 2.0e-9, 5.0e-8]))
y = np.array([0.768, 0.901, 1.790, 1.213, 0.543, 0.261, 0.121, 0.049])
xnew = np.linspace(np.min(x),np.max(x),100)
f = interp1d(x, y, kind='quadratic')
y_smooth=f(xnew)
plt.scatter(np.exp(x), y)
plt.plot(np.exp(xnew), y_smooth)
plt.ylim(0,2)
plt.xscale('log')
plt.show()
这让我看起来很合理。注意 log
和 exp
s 移动到日志 space 并再次退出以使插值与图一致