【问题标题】:Algorithm for generating smooth curves from incoming data points从输入数据点生成平滑曲线的算法
【发布时间】:2019-11-26 05:26:59
【问题描述】:

我正在寻找一种算法,可以在点进入时平滑地插值 live

例如,假设我从一个包含 10 个 (x,y) 对的数组开始。我目前正在使用 scipy 和高斯窗口来生成平滑曲线。但是,我不知道如何更新平滑曲线以响应在未来某个点生成的第 11 个点(没有完全重做所有 11 个点的平滑)。

我正在寻找的是一种算法,它遵循之前的平滑曲线直到第 10 个 (x,y) 对 并且 在第 10 个和第 11 对(以类似于重做整个算法的方式 - 所以没有锋利的边缘)。有什么东西可以满足我的需求吗?

【问题讨论】:

    标签: python gaussian smoothing


    【解决方案1】:

    我认为您可以使用Cubic Spline。给定n(x_1, y_1)..(x_n, y_n) 的列表,算法在(x_k, y_k)(x_{k+1}, y_{k+1}) 之间找到一个三次多项式p_k,并具有以下约束:

    • 多项式p_kp_{k+1}经过点(x_{k+1}, y_{k+1});
    • 多项式p_kp_{k+1}(x_{k+1}, y_{k+1}) 处具有相同的一阶导数;
    • 多项式p_kp_{k+1}(x_{k+1}, y_{k+1}) 处具有相同的二阶导数。

    此外,还为第一个和最后一个多项式定义了一些边界条件。我使用了natural,它在曲线末端强制二阶导数为零。

    您可以应用的步骤是:

    1. 使用三次样条插值前 10 个点。
    2. p_10 处的一阶导数值赋给变量d
    3. p_10p_11 运行三次样条,强制p_10 处的一阶导数为dp_11 处的二阶导数为零。

    从那里,您可以对剩余的点重复相同的步骤。

    此代码将为所有点生成插值:

    import matplotlib.pyplot as plt
    import numpy as np
    from scipy.interpolate import CubicSpline
    
    height=4
    n = 20
    x = np.arange(n)
    xs = np.arange(-0.1,n+0.1,0.1)
    y = np.random.uniform(low=0, high=height, size=n)
    
    plt.plot(x, y, 'o', label='data')
    cs = CubicSpline(x, y)
    plt.plot(xs, cs(xs), color='orange')
    plt.ylim([0, height+1])
    

    现在,此代码将插入前 10 个点,然后在点 10 和 11 之间进行另一个插值:

    k = 10
    delta = 0.001
    
    plt.plot(x, y, 'o', label='data')
    xs = np.arange(x[0], x[k-1]+delta, delta)
    cs = CubicSpline(x[0:k], y[0:k])
    plt.plot(xs, cs(xs), color='red')
    
    d = cs(x[k-1], 1)
    
    xs2 = np.arange(x[k-1], x[k]+delta, delta)
    cs2 = CubicSpline(x[k-1:k+1], y[k-1:k+1], bc_type=((1, d), 'natural'))
    plt.plot(xs2, cs2(xs2), color='blue')
    
    plt.ylim([0, height+1])
    

    【讨论】:

    • 哇,这正是我想要的正是。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多