在 Python 中通过数值微分计算加速度

Calculating acceleration by numerical differentiation in Python

从手写笔移动测量中,我得到了两个测量值:时间和距离。所以我有两个数组,第一个是时间戳数组(以毫秒为单位),然后是相同大小的距离测量数组。例如,这两个数组可能如下所示:

distance = [1.4142,1.0000,1,0,1.0000,1.0000,0,0,1.0000,1.0000,0,1.0000,2.0000,2.2361,0,3.0000,3.6056,3.1623,3.1623,0,3.6056,3.1623,3.1623,0,1.4142,2.2361,1.0000,0,0]

timestamps = [1563203.5,1563208,1563210.5,1563213.5,1563218.5,1563223.5,1563226.5,1563229,1563233.5,1563238.5,1563242.5,1563245,1563248.5,1563253.5,1563258,1563260.5,1563263.5,1563268.5,1563273.5,1563276.5,1563279,1563283.5,1563288.5,1563292.5,1563295,1563298.5,1563303.5,1563307,1563317.5]

我认为一阶导数给出了速度,二阶导数给出了加速度。

我对使用数值微分计算加速度很感兴趣。如何在 python 中完成?

一阶导数可以计算为(f(x+h) - f(x-h)) / (2h)。这给出了 h^2.

数量级的估计误差

二阶导数可以计算为(f(x+h) - 2f(x) + f(x-h)) / h^2。这也给出了 h^2.

数量级的估计误差

注意:您可以使用 (f(x+h) - f(x))/h(f(x) - f(x-h))/h 来估计导数,但它们给出的估计误差约为 h,大于 h^2 .

我没有详细查看你的数据,但如果你的数据点之间没有恒定的 h 间隔,这些公式就不太适用。在那种情况下,我将简单地分两步计算加速度:

v(x_i) = (p(x_(i+1) - p(x_(i-1))) / (x_(i+1) - x_(i-1))
a(x_i) = (v(v_(i+1) - v(x_(i-1))) / (x_(i+1) - x_(i-1))

您基本上只需将一阶导数的数据反馈回您的推导算法,就可以得到二阶导数。

替代@SirGuy 描述的两阶段微分方案,假设局部加速度恒定,您可以考虑连续三元组点之间的抛物线拟合,

a T0² / 2 + b T0 + c = X0
a T1² / 2 + b T1 + c = X1
a T2² / 2 + b T2 + c = X2

你很容易通过两两减法消去c,化简后

a (T1 + T0) / 2 + b = (X1 - X0) / (T1 - T0) = V01
a (T2 + T1) / 2 + b = (X2 - X1) / (T2 - T1) = V12

最后,

a = 2 (V12 - V01) / (T2 - T0).

如果数据有噪声,你也可以考虑考虑更多的点,在K个点(比如5个或7个)上拟合一个滑动抛物线模型,中心点两边权重递减,进行平滑.