【问题标题】:Interpolating values that have very high spread具有非常高传播的插值
【发布时间】:2020-06-22 21:04:42
【问题描述】:

我试图对一些数据进行插值,以便为我拥有的一些数据点制作一条平滑曲线,但 interp1d 不适用于使用我拥有的 x 值,如果我只是将新的 x 向量设为 [1, 2,3,4,5,6,7,8],但是对于原始 x 值,我得到了一些根本不适合数据的曲线。

我想知道是否是我的 x 向量的大跨度导致了问题?

我的数据是这样的:

y = np.array([0.768, 0.901, 1.790, 1.213, 0.543, 0.261, 0.121, 0.049])
x = np.array([1.2e-17, 3.7e-16, 1.2e-14, 2.8e-13, 4.8e-12, 9.2e-11, 2.0e-9, 5.0e-8])

尝试插值和绘图:

xnew = np.linspace(np.min(x),np.max(x),100)
f = interp1d(x, y, kind='quadratic')
y_smooth=f(xnew)

plt.scatter(x,y)
plt.plot(xnew, y_smooth)
plt.ylim(0,2)
plt.xscale('log')
plt.show()

给出一个完全没有意义的数字。我已经用谷歌搜索并搜索了几个小时的解决方案,尝试了不同的方法,例如曲线拟合,但似乎没有任何效果。

更改 x 数据向量,得到所需的曲线,但显然 x 值错误:

new_x_data = [1,2,3,4,5,6,7,8]

plt.scatter(new_x_data,y)

任何帮助将不胜感激。

【问题讨论】:

    标签: python numpy interpolation


    【解决方案1】:

    对代码的最小更改是:

    x = np.log(np.array([1.2e-17, 3.7e-16, 1.2e-14, 2.8e-13, 4.8e-12, 9.2e-11, 2.0e-9, 5.0e-8]))
    y = np.array([0.768, 0.901, 1.790, 1.213, 0.543, 0.261, 0.121, 0.049])
    
    xnew = np.linspace(np.min(x),np.max(x),100)
    f = interp1d(x, y, kind='quadratic')
    y_smooth=f(xnew)
    
    plt.scatter(np.exp(x), y)
    plt.plot(np.exp(xnew), y_smooth)
    plt.ylim(0,2)
    plt.xscale('log')
    plt.show()
    

    这让我看起来很明智。注意 logexps 移动到日志空间并再次退出以使插值与绘图一致

    【讨论】:

    • 这正是我所需要的,进出日志空间,谢谢!
    【解决方案2】:

    我认为这只是您查看结果的方式存在差异。

    尝试使用日志空间而不是 linspace - 它应该更好地遵循要点。实际上,xnew 中的绝大多数点都聚集在右侧。

    编辑: 这更好地显示了正在发生的事情。它在它们之间进行插值,看起来不太好。

    import matplotlib.pyplot as plt
    import numpy as np
    from scipy.interpolate import interp1d
    
    y = np.array([0.768, 0.901, 1.790, 1.213, 0.543, 0.261, 0.121, 0.049])
    x = np.array([1.2e-17, 3.7e-16, 1.2e-14, 2.8e-13, 4.8e-12, 9.2e-11, 2.0e-9, 5.0e-8])
    
    xnew = np.logspace(-16, -8, 100)
    f = interp1d(x, y, kind='quadratic')
    y_smooth=f(xnew)
    
    plt.scatter(x,y)
    plt.plot(xnew, y_smooth)
    plt.ylim(0,4)
    plt.xscale('log')
    plt.show()
    

    【讨论】:

    • 感谢您对日志空间的回答和提示,不幸的是它没有帮助。会不会是 10^-17 对 python 来说太小而无法处理的问题?
    • @Emil 另一种看待这个问题的方式是:您需要确保插值代码看到的是对数转换的值。 “python”在这里正确地遵循数学,你只是期望它做其他事情
    • 我添加了一些示例代码——插值上下摆动非常剧烈。根据您的应用程序,您可以选择在 (log(x), y) 上进行插值,这将是一个截然不同的数学结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多