我有两个数据对应于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()
我最终看起来像这样;
这显然是我的功能的可怕表现。我在这里缺少什么?
谢谢。
答案 0 :(得分:2)
您可以通过以下方式获得您可能期望的结果(日志轴上的平滑样条曲线):
f = interp1d(np.log(re),np.log(cd), kind='cubic')
plt.plot(x,np.exp(f(np.log(x))))
这将在日志空间中构建插值并正确绘制它。以线性比例绘制数据,以查看立方体如何翻转以使尾部位于左侧。
答案 1 :(得分:1)
您缺少的主要是轴上的log
缩放。根据您的输入数据,显示的样条曲线不是不合理的结果。尝试使用plt.xscale('linear')
代替plt.xscale('log')
绘制绘图。也许三次样条不是最好的插值技术,至少在原始数据上。更好的选择可能是在数据插入日志上进行插值。