也许这不是一个编程问题,而是一个数学问题。但是这里有。
想象一下,你正在制造一辆由车辆上的电机供电的过山车。车辆具有使用该电动机可以实现的固定力值。在你的过山车的一个部分,你想要从我最喜欢的视频游戏之一穿过这样的半环:过山车大亨!
当您绕过半圈时,您不知道自己的速度是多少,或者您需要花多长时间才能绕过它。但是,您可以根据发动机的加速度,质量和加速度来确定您在半环的任何位置的最大可能加速度。让我们不要用数字讨论这个讨论,而是假设我们已经获得了加速度与位置曲线的可用性。它看起来像这样:
我已成功推导出速度公式,它是加速度与位置曲线和初始速度的函数。从运动学方程式
v^2 = 2*a*p
我可以将速度推导为位置的函数。 v = sqrt(2 * [a = f(p)wrt position的积分])
在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
现在我陷入困境。我有加速度,速度和位置,现在我需要时间。我认为我的数学是正确的。因为我有一个/ v / p它应该就像选择任何涉及时间的运动学方程一样简单并重新排列它以获得时间(我想在轨道的每个位置得到时间所以我可以绘制一个/ 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?
答案 0 :(得分:0)
以下代码是解决方案。我一直坐在这一段时间,只是忘了回答这个问题。
while p < pf
vel(i) = real(sqrt(vel(i-1).^2 + 2 .* ((acc(i)+acc(i-1))./2) .* (pos(i)-pos(i-1)) ));
time(i) = time(i-1) + (pos(i)-pos(i-1)) ./ ( (vel(i)+vel(i-1))./2 );
i = i + 1;
end
时间功能来自
的重新排列d = (vi+vf)*t/2
针对位置值数组进行了修改。