使用 SciPy 插值数据
Interpolating Data Using SciPy
我有两个对应于 x 和 y 值的数据数组,我想用三次样条插值。
我试过这样做,但是我的插值函数没有通过我的数据点。
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d
re = np.array([0.2,2,20,200,2000,20000],dtype = float)
cd = np.array([103,13.0,2.72,0.800,0.401,0.433],dtype = float)
plt.yscale('log')
plt.xscale('log')
plt.xlabel( "Reynold's number" )
plt.ylabel( "Drag coefficient" )
plt.plot(re,cd,'x', label='Data')
x = np.linspace(0.2,20000,200000)
f = interp1d(re,cd,kind='cubic')
plt.plot(x,f(x))
plt.legend()
plt.show()
我最终得到的结果是这样的;
这显然是我职能的糟糕表现。我在这里错过了什么?
谢谢。
您缺少的主要是 log
坐标轴缩放。根据您的输入数据,显示的样条曲线并非不合理的结果。尝试使用 plt.xscale('linear')
而不是 plt.xscale('log')
绘制绘图。也许三次样条不是最好的插值技术,至少在原始数据上是这样。更好的选择可能是在 insead 数据的日志上进行插值。
你可以通过这样做得到你可能期望的结果(对数轴上的平滑样条曲线):
f = interp1d(np.log(re),np.log(cd), kind='cubic')
plt.plot(x,np.exp(f(np.log(x))))
这将在日志中构建插值 space 并正确绘制。在线性刻度上绘制您的数据,以查看立方体如何翻转才能使尾巴位于左侧。
我有两个对应于 x 和 y 值的数据数组,我想用三次样条插值。
我试过这样做,但是我的插值函数没有通过我的数据点。
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d
re = np.array([0.2,2,20,200,2000,20000],dtype = float)
cd = np.array([103,13.0,2.72,0.800,0.401,0.433],dtype = float)
plt.yscale('log')
plt.xscale('log')
plt.xlabel( "Reynold's number" )
plt.ylabel( "Drag coefficient" )
plt.plot(re,cd,'x', label='Data')
x = np.linspace(0.2,20000,200000)
f = interp1d(re,cd,kind='cubic')
plt.plot(x,f(x))
plt.legend()
plt.show()
我最终得到的结果是这样的;
这显然是我职能的糟糕表现。我在这里错过了什么?
谢谢。
您缺少的主要是 log
坐标轴缩放。根据您的输入数据,显示的样条曲线并非不合理的结果。尝试使用 plt.xscale('linear')
而不是 plt.xscale('log')
绘制绘图。也许三次样条不是最好的插值技术,至少在原始数据上是这样。更好的选择可能是在 insead 数据的日志上进行插值。
你可以通过这样做得到你可能期望的结果(对数轴上的平滑样条曲线):
f = interp1d(np.log(re),np.log(cd), kind='cubic')
plt.plot(x,np.exp(f(np.log(x))))
这将在日志中构建插值 space 并正确绘制。在线性刻度上绘制您的数据,以查看立方体如何翻转才能使尾巴位于左侧。