从测针运动测量中,我得到了两个测量值:时间和距离。因此,我有两个数组,首先是一个时间戳数组(以毫秒为单位),然后是一个具有相同大小的距离测量值的数组。例如,两个数组可能看起来像:
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中完成?
答案 0 :(得分:1)
一阶导数可以计算为(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
。 / p>
我没有详细研究您的数据,但是如果您在数据点之间没有恒定的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))
基本上,您只需将一阶导数的数据输入到导数算法中,就可以得到二阶导数。
答案 1 :(得分:0)
对于@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)上拟合滑动抛物线模型,并在中心点的两侧减小权重以进行平滑。 / p>