使用SciPy插值数据

时间:2015-10-28 17:50:33

标签: python interpolation

我有两个数据对应于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()

我最终看起来像这样;

enter image description here

这显然是我的功能的可怕表现。我在这里缺少什么?

谢谢。

2 个答案:

答案 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')绘制绘图。也许三次样条不是最好的插值技术,至少在原始数据上。更好的选择可能是在数据插入日志上进行插值。