【问题标题】:Interpolating Data Using SciPy使用 SciPy 插值数据
【发布时间】:2025-12-09 10:35:01
【问题描述】:

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

我最终的结果是这样的;

这显然是我功能的糟糕表现。我在这里错过了什么?

谢谢。

【问题讨论】:

    标签: python interpolation


    【解决方案1】:

    您可以通过执行以下操作获得您可能期望的结果(对数轴上的平滑样条曲线):

    f = interp1d(np.log(re),np.log(cd), kind='cubic')
    plt.plot(x,np.exp(f(np.log(x))))
    

    这将在对数空间中构建插值并正确绘制它。以线性比例绘制您的数据,以查看三次方必须如何翻转才能使尾部位于左侧。

    【讨论】:

    • 啊,我明白为什么我现在得到一个“有趣”的结果了。谢谢。
    【解决方案2】:

    您缺少的主要内容是您的轴上的log 缩放。鉴于您的输入数据,显示的样条曲线不是不合理的结果。尝试使用plt.xscale('linear') 而不是plt.xscale('log') 绘制绘图。也许三次样条不是最好的插值技术,至少在原始数据上是这样。更好的选择可能是对 insead 数据的日志进行插值。

    【讨论】:

    • 我想我确实有对数轴,还是我误解了你?
    • 你会的。这就是为什么合身看起来如此糟糕的原因。