计算下落物体的当前速度

时间:2014-01-25 16:19:56

标签: ruby physics game-physics

我试图在没有滑槽的情况下首先计算天空潜水员的速度,一旦展开,物体应该减速直到它再次达到它的终端速度。然而,在尝试这个时,我遇到了一些问题。

  • 最大计算速度的第一个似乎具有更高的最大值 比我计算的终端速度。
  • 其次,当减速时(例如,cross_sectional_area增加和/或阻力系数),阻力爆炸!它变得如此之大 如果没有完成,玩家可能会闯入太空 压扁。

代码:

drag_coefficient     = 1.5.to_f
mass                 = 100.to_f
cross_sectional_area = 0.7.to_f
GRAVITY              = 9.8.to_f 
density              = 1.2690.to_f # Air density
  def terminal_velocity
    ((2.to_f * mass * GRAVITY / (density * drag_coefficient * cross_sectional_area)) ** 0.5.to_f).to_f
  end

  # Air resistance in N
  def drag_force
    (0.5.to_f * drag_coefficient * density * cross_sectional_area * @velocity) ** 2
  end

  # Delta time in seconds
  def tick(delta_time)
    @velocity += (acceleration * delta_time)
  end

  # Acceleration in m/s
  def acceleration
    (gravitational_force - drag_force) / mass
  end

  # Gravitational force in N
  def gravitational_force
    mass * GRAVITY
  end

我一直在寻找这方面的好消息来源,但它在数学上要么非常密集,要么完全过于简单。

编辑:只是平方速度,这就是我得到的,它看起来好多了。 (感谢PinnyM !!)

使用这些变量(以20ms刻度计算但仅绘制整个第二个值):

GRAVITY              = 9.8
drag_coefficient,    = 1.1
mass                 = 100
cross_sectional_area = 0.7
density              = 1.2690.to_f

http://savedbythegoog.appspot.com/?id=5cbe34730e3b56ec97d961704e636bab5da58225

我得到上面的加速度和速度图表似乎很好,但是终端速度和计算所达到的速度之间存在明显的脱节。

现在在t = 40时我改变了drag_coefficient和cross_sectional_area(这应该是t的函数来模拟降落伞的开口,但是为了测试我刚刚使用了一个常数值)。变更后的变量:

drag_coefficient,    = 1.9
cross_sectional_area = 35.0

我得到以下图表(由于减速度很疯狂,因此增加的幅度较小):http://savedbythegoog.appspot.com/?id=fed3506199191043e94a27060dffc95800c70152

这意味着他在0.5秒内减速似乎太高了。这只是因为降落伞的开启是t的一个功能还是我遗漏了一些东西。 任何指针/帮助都非常感谢。

编辑内联和简化代码。原始要点:https://gist.github.com/anonymous/29e1ed08ad4e0d7d28a0

2 个答案:

答案 0 :(得分:2)

这里有很多问题。

首先,你的阻力系数相当高。任何超过一个的东西都很高。设计不良的降落伞可能具有超过一致的阻力系数。值1.5? “设计糟糕”甚至没有接近描述降落伞设计的糟糕程度。设计良好的降落伞的Cd约为0.75至0.9。

其次,你的伞兵在死亡谷底部非常寒冷的一天打开他们的滑道。 15℃(~60°F)海平面的空气密度为1.225 kg / m 3 。随着海拔的升高,空气密度急剧下降。如果您使用的是一些数学倾向的语言,我可以指出一个相当不错的模型,说明压力,密度和温度如何随高度而变化。谷歌“标准气氛1976”。

这里有一个小问题:你正在使用红宝石。我无法在ruby中找到标准大气模型的实现。如果你在数学上倾向于(数学并不那么难),你可能想要写一个标准大气模型的ruby实现。或者只是坚持密度为1.225 kg / m 3 。不要使用1.269 kg / m 3

第三,最重要的是,降落伞不会立即打开并暴露35 m 2 的阻力区域。降落伞完全打开需要一些时间。如果伞兵快速下降,那么部署时滞可能还不够。高于10g(~981 m / sec 2 )的加速度可能是致命的。那些喜欢在打开滑槽之前自由摔倒的伞兵有降落伞,其中包括一个飞行员滑道(又名一个锥形滑槽)和一个主滑道。飞行员滑道打开主降落伞,但沿途它会使飞伞降落一点。

最后,你的数值积分是欧拉方法。了解Euler方法的工作原理对于理解初值问题的数值解法的基础知识至关重要。一旦你了解它正在做什么以及它是如何工作的,那就是你应该抛弃它的那一刻。欧拉的方法产生了相当糟糕的结果。

答案 1 :(得分:1)

我担心我的物理过于生锈,无法评论你正在使用的方程式的有效性。但这部分至少对我来说过于简单:

@velocity += (acceleration * delta_time)

由于我可以回想起来,使用力与空气阻力(取决于速度)计算速度会产生高度非线性的微分方程。事实上,如此复杂,这个问题几个世纪以来只得到了近似的解决方案。 (这不是因为缺乏尝试:由于弹道学的原因,军方特别感兴趣。)

从这个角度来说,我真诚地怀疑你会得到任何接近正确结果的东西,只有1s嘀嗒功能,尤其是m/s^2中表示的常数:你最终会发现物质错误每一个滴答。

可能通过缩小刻度来获得更好的结果,以便更接近于逼近黎曼积分:它需要足够小以至于从一个刻度到下一刻的累积误差是无关紧要的与最终结果相比。 (目前情况可能并非如此。)

那就是说,不要屏住呼吸太长时间,因为如果@Pinny的评论有任何意义,你的方程也可能不正确。 (同样,我的物理学太过生疏,无法评论后者。)