我试图根据非均匀采样的 3D 位置数据找出我的对象的加速度大小。我在非均匀网格上使用二阶导数的标准近似值(参见例如此处,第 121 页):
其中是第一个采样间隔,是第二个采样间隔,是采样点。
我正在尝试通过以下方式实现它:
class ComputeAcceleration
{
Vector3D prevPosition;
Vector3D prevPrevPosition;
float prevTimeStep;
float acceleration;
// This function gets called every time step with the time step
// since the last data input as argument.
void Update(const float timeStep)
{
float doubleTimeStep = prevTimeStep + timeStep;
Vector3D currentPosition = getCurrentPosition();
Vector3D accelerationVector = prevTimeStep * currentPosition -
doubleTimeStep * prevPosition +
timeStep * prevPrevPosition;
accelerationVector *= 2 / (doubleTimeStep * prevTimeStep * timeStep);
acceleration = sqrt(accelerationVector.X * accelerationVector.X +
accelerationVector.Y * accelerationVector.Y+
accelerationVector.Z * accelerationVector.Z);
prevPrevPosition = prevPosition;
prevPosition = currentPosition;
}
}
我找不到其中的错误,但是当我实时绘制它时,我得到的曲线根本不像加速度,而是速度,以某种不稳定的方式。我根据速度(我知道这是正确的)绘制它,它看起来大致是这样的:

我在这里做一些根本错误的事情吗?