【问题标题】:Intuitive interpolation between unevenly spaced points不均匀间隔点之间的直观插值
【发布时间】:2015-09-22 03:49:32
【问题描述】:

我有以下图表,我想使用 Python 和 Matplotlib 将其数字化为高质量的出版级图形:

我使用数字化仪程序从 3 个数据集中的一个中获取了一些样本:

x_data = np.array([
1,
1.2371,
1.6809,
2.89151,
5.13304,
9.23238,
])

y_data = np.array([
0.0688824,
0.0490012,
0.0332843,
0.0235889,
0.0222304,
0.0245952,
])

我已经尝试了 3 种不同的方法来通过这些数据点拟合曲线。第一种方法是使用scipy.interpolate import spline通过点绘制样条线

这会导致(将实际数据点绘制为蓝色标记):

这显然不好。

我的第二次尝试是使用scipy.optimize import curve_fit 使用一系列不同阶数的多项式来绘制曲线拟合。即使是四阶多项式,答案也是无用的(低阶的更无用):

最后,我使用scipy.interpolate import interp1d 尝试在数据点之间进行插值。线性插值显然会产生预期的结果,但这条线是笔直的,这个练习的全部目的是获得一条漂亮的平滑曲线:

如果我然后使用三次插值,我会得到一个很糟糕的结果,但是二次插值会产生更好的结果:

但它还没有完全实现,我认为interp1d 不能进行高阶插值。

有没有人有这样做的好方法?也许我最好尝试在 IPE 或其他方式中这样做?

谢谢!

【问题讨论】:

    标签: python matplotlib scipy interpolation


    【解决方案1】:

    标准三次样条不能很好地在间距非常不均匀的数据点之间进行合理的插值。幸运的是,还有很多其他的插值算法和Scipy provides a number of them。以下是应用于您的数据的一些内容:

    import numpy as np
    from scipy.interpolate import spline, UnivariateSpline, Akima1DInterpolator, PchipInterpolator
    import matplotlib.pyplot as plt
    
    x_data = np.array([1, 1.2371, 1.6809, 2.89151, 5.13304, 9.23238])
    
    y_data = np.array([0.0688824, 0.0490012, 0.0332843, 0.0235889, 0.0222304, 0.0245952])
    
    x_data_smooth = np.linspace(min(x_data), max(x_data), 1000)
    fig, ax = plt.subplots(1,1)
    
    spl = UnivariateSpline(x_data, y_data, s=0, k=2)
    y_data_smooth = spl(x_data_smooth)
    ax.plot(x_data_smooth, y_data_smooth, 'b')
    
    bi = Akima1DInterpolator(x_data, y_data)
    y_data_smooth = bi(x_data_smooth)
    ax.plot(x_data_smooth, y_data_smooth, 'g')
    
    bi = PchipInterpolator(x_data, y_data)
    y_data_smooth = bi(x_data_smooth)
    ax.plot(x_data_smooth, y_data_smooth, 'k')
    
    ax.plot(x_data_smooth, y_data_smooth)
    ax.scatter(x_data, y_data)
    
    plt.show()
    

    我建议查看这些以及其他一些,并找到一个与您认为正确的匹配。不过,您可能还想再采样几个点。例如,我认为 PCHIP 算法希望保持数据点之间的拟合单调,因此将最小点数字化会很有用(无论您使用哪种算法,这可能都是一个好主意)。

    【讨论】:

    • 感谢@tom10 的详尽回答!我一定会看一看,你做的所有配合看起来对我的目的来说都足够好!
    猜你喜欢
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 2022-08-03
    • 2015-06-08
    相关资源
    最近更新 更多