Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从输入数据点生成平滑曲线的算法_Python_Gaussian_Smoothing - Fatal编程技术网

Python 从输入数据点生成平滑曲线的算法

Python 从输入数据点生成平滑曲线的算法,python,gaussian,smoothing,Python,Gaussian,Smoothing,我正在寻找一种算法,可以在点实时出现时平滑地进行插值 例如,假设我从10(x,y)对数组开始。我目前正在使用scipy和高斯窗口生成平滑曲线。但是,我不知道如何更新平滑曲线,以响应在未来某个点生成的第11个点(而不完全重新对所有11个点进行平滑) 我要寻找的是一种算法,遵循前一条平滑曲线,直到第10对(x,y),并且也在第10对和第11对之间平滑插值(以类似于重做整个算法的方式-因此没有锐边)。有什么东西能满足我的需要吗?我想你可以利用一个。给定n点的列表(x_1,y_1)-(x_n,y_n),

我正在寻找一种算法,可以在点实时出现时平滑地进行插值

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


我要寻找的是一种算法,遵循前一条平滑曲线,直到第10对(x,y),并且也在第10对和第11对之间平滑插值(以类似于重做整个算法的方式-因此没有锐边)。有什么东西能满足我的需要吗?

我想你可以利用一个。给定
n
点的列表
(x_1,y_1)-(x_n,y_n)
,该算法在
(x_k,y_k)
(x_{k+1},y_{k+1})之间找到一个三次多项式
p_k
,具有以下约束:

  • 多项式
    pk
    pk+1}
    通过点
    (x{k+1},y{k+1})
  • 多项式
    pk
    pk+1}
    (x{k+1},y{k+1})具有相同的一阶导数
    
    
  • 多项式
    pk
    pk+1}
    (x{k+1},y{k+1})处具有相同的二阶导数
此外,还有一些边界条件,为第一个和最后一个多项式定义。我使用了
natural
,它强制曲线末端的二阶导数为零

您可以应用的步骤包括:

  • 使用三次样条插值前10个点
  • p_10
    处的一阶导数值分配给变量
    d
  • p_10
    p_11
    运行三次样条曲线,强制执行
    p_10
    处的一阶导数为
    d
    ,而
    p_11
    处的二阶导数为零
  • 然后,可以对其余点重复相同的步骤

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

    导入matplotlib.pyplot作为plt
    将numpy作为np导入
    从scipy.interpolate导入线
    高度=4
    n=20
    x=np.arange(n)
    xs=np.arange(-0.1,n+0.1,0.1)
    y=np.随机.均匀(低=0,高=高度,大小=n)
    plt.plt(x,y,'o',label='data')
    cs=立方线(x,y)
    plt.plt(xs,cs(xs),颜色为橙色)
    plt.ylim([0,高度+1])
    

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

    k=10
    δ=0.001
    plt.plt(x,y,'o',label='data')
    xs=np.arange(x[0],x[k-1]+delta,delta)
    cs=立方线(x[0:k],y[0:k])
    plt.plt(xs,cs(xs),color='red')
    d=cs(x[k-1],1)
    xs2=np.arange(x[k-1],x[k]+delta,delta)
    cs2=立方线(x[k-1:k+1],y[k-1:k+1],bc_类型=((1,d),‘自然’)
    plt.plot(xs2,cs2(xs2),color='blue')
    plt.ylim([0,高度+1])
    

    哇,这正是我想要的。非常感谢你!