2024-04-24 11:45:41 发布
网友
我正在寻找一种算法,它可以在点进入live时平滑地插值。你知道吗
例如,假设我从10(x,y)对数组开始。我目前正在使用scipy和高斯窗口来生成平滑曲线。但是,我不知道如何更新平滑曲线,以响应在未来某个点生成的第11个点(而不完全重新对所有11个点进行平滑)。你知道吗
我要找的是一个算法,它可以沿着前面的平滑曲线一直到第10对(x,y)并且也可以在第10对和第11对之间平滑插值(以一种类似于重做整个算法的方式-因此没有锐边)。有什么东西能满足我的要求吗?你知道吗
我想你可以利用Cubic Spline。给定一个n点(x_1, y_1)..(x_n, y_n)列表,该算法在(x_k, y_k)和(x_{k+1}, y_{k+1})之间找到一个具有以下约束的三次多项式p_k:
n
(x_1, y_1)..(x_n, y_n)
(x_k, y_k)
(x_{k+1}, y_{k+1})
p_k
p_{k+1}
此外,还有一些边界条件,为第一个和最后一个多项式定义。我使用了natural,它强制曲线末端的二阶导数为零。你知道吗
natural
您可以应用以下步骤:
p_10
d
p_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])
我想你可以利用Cubic Spline。给定一个
n
点(x_1, y_1)..(x_n, y_n)
列表,该算法在(x_k, y_k)
和(x_{k+1}, y_{k+1})
之间找到一个具有以下约束的三次多项式p_k
:p_k
和p_{k+1}
通过点(x_{k+1}, y_{k+1})
p_k
和p_{k+1}
在(x_{k+1}, y_{k+1})
处具有相同的一阶导数p_k
和p_{k+1}
在(x_{k+1}, y_{k+1})
处具有相同的二阶导数。你知道吗此外,还有一些边界条件,为第一个和最后一个多项式定义。我使用了
natural
,它强制曲线末端的二阶导数为零。你知道吗您可以应用以下步骤:
p_10
处的一阶导数值赋给变量d
。你知道吗p_10
和p_11
的三次样条曲线,强制要求p_10
处的一阶导数为d
,p_11
处的二阶导数为零。你知道吗从这里开始,您可以对其余的点重复相同的步骤。你知道吗
此代码将为所有点生成插值:
现在,此代码将对前10个点进行插值,然后在点10和11之间进行另一次插值:
相关问题 更多 >
编程相关推荐