也许这不是一个编程问题,而是一个数学问题。但是这里。
想象一下,您正在制作一个由车辆上的电机驱动的过山车。车辆具有使用该电机可以实现的固定力值。在你的过山车的一部分中,你想从我最喜欢的电子游戏之一中穿过像这样的半环:过山车大亨!
当你绕过半圈时,你不知道你的速度会是多少,也不知道绕过它需要多长时间。但是,您可以根据您的发动机加速度、质量和重力加速度计算出您在半环上的任何点的最大可能加速度是多少。我们不要用数字来混淆这个讨论,而是假设我们已经获得了加速度与位置的曲线。它看起来像这样:
我已经成功地推导出了作为加速度与位置曲线和初始速度函数的速度公式。从运动学方程
v^2 = 2*a*p
我可以将速度推导出为位置的函数。v = sqrt(2 * [a=f(p) wrt 位置的积分])
在 MATLAB 中我可以通过以下方式获得:
v = sqrt(2.*abs(trapz(pos, acc)));
实际上,我正在使用以下代码获取沿轨道的每个点的速度(acc 和 pos 是上面绘制的加速度与位置的数组):
vel = 1;
newAcc = 0;
while ix <= length(acc)
pa = acc(ix-1) + (acc(ix)-acc(ix-1))./2;
newAP = (pos(ix)-pos(ix-1)).*pa; % This is more time efficient than trapz
newAcc = newAcc + abs(2.*newAP);
vel(ix) = sqrt(newAcc);
ix = ix + 1;
end
现在我遇到了困境。我有加速度、速度和位置,现在我需要时间。我认为我的数学是正确的。由于我有 a/v/p,它应该就像选择任何涉及时间的运动学方程并重新排列它以获得时间一样简单(我想在轨道上的每个位置获得时间,这样我就可以绘制 a/v/ p 作为时间的函数)。
这应该意味着我可以从以下任何一个中进行选择:
1. p_f = p_i + v_i*t + 1/2*a*t^2
2. v_f = v_i + a*t
3. p = (v_i + v_f)*t/2
方程 1 是二次方程。另外两个看起来简单多了。等式 2 看起来很有希望。让我们试试看。
t = (v_f - v_i)/a
将此转换为Matlab,我认为应该是这样的:
time = 0;
while ix <= length(acc)
pa = acc(ix-1) + (acc(ix)-acc(ix-1))./2;
newAP = (pos(ix)-pos(ix-1)).*pa; % This is more time efficient than trapz
newAcc = newAcc + abs(2.*newAP);
vel(ix) = sqrt(newAcc);
dt = (vel(ix)-vel(ix-1))./acc(ix);
time(ix) = time(ix-1) + dt;
ix = ix + 1;
end
但是从我的测试来看,这会产生不正确的结果!我对数学和算法都感到困惑。但我想这个地方只是为了回答关于算法的问题。我看不出我的公式是如何不正确的。我是否错误地将其转换为 Matlab?