使用 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 并正确绘制。在线性刻度上绘制您的数据,以查看立方体如何翻转才能使尾巴位于左侧。