弹道方程以及代码实现


弹道方程以及代码实现

什么是弹道方程?

弹道方程,就是使用数学模型来量化子弹在空气阻力作用下的运动轨迹。这听起来十分复杂,但其实际上其算法核心是依托于我们初中学过的斜抛运动,并没有想象之中的那么深奥。

弹道示意图

现在,我们假设子弹从A点出发,需要击打B点,在重力加速度和空气阻力的作用下,我们不可能使子弹的初速度直接指向AB方向,而是使子弹的发射方向偏离AC方向$\alpha$角度,这样才能确保子弹能以优美的弧线直接击打中B点。弹道方程的核心便是求解$\alpha$角

忽略空气阻力的弹道方程建模

  1. 首先对初速度V进行速度分解

    $$
    \begin{cases}
    v_x=v\cos\alpha \
    v_y=v\sin\alpha
    \end{cases}
    $$

  2. 由于水平上不受力的作用(忽略了空气阻力),故

    • 飞行时间 $t=\frac{f}{v_x}=\frac{f}{v\cos\alpha}$ (f为如图的水平距离)

    • 子弹击打中的高度
      $$
      h = v_y t - \frac{1}{2} g t^2=v \sin \alpha * \frac{f}{v \cos \alpha} - \frac{1}{2} g * (\frac{f}{v \cos \alpha})^2=f \tan \alpha - \frac{1}{2} g * (\frac{f}{v \cos \alpha})^2
      $$

  3. 求解:先来分析已知条件以及目的参数,我们已经计算得到了B点相对于A点的位置,那么h和f已知,有重力加速度已知,目标是求解$\alpha$,这容易得到$\alpha$的解析式,下面利用高斯牛顿法迭代求解$\alpha$

  4. 高斯牛顿法求解方程

    • 首先构造残差函数

      $$
      \lvert\lvert e \rvert\rvert ^2 = \lvert\lvert h_{actual}-h_{calc} \rvert\rvert ^2
      $$

      其中$ h_{actual} $ 为已知值, $ h_{calc} $ 是使用迭代法逐渐逼近的h值

      我们的目标是

      $$
      \min \lvert\lvert e \rvert\rvert ^2 = \lvert\lvert h_{actual}-h_{calc} \rvert\rvert ^2 = \lvert\lvert h_{actual} - f\tan\alpha+\frac{1}{2}g*(\frac{f}{v\cos\alpha})^2 \rvert\rvert ^2
      $$

      以此来达到使用计算机迭代逼近$ h_{actual} $的目的

    • 对误差函数e进行泰勒展开,则:

      $$
      e(\alpha + \Delta\alpha)=e(\alpha)+\frac{\delta e}{\delta \alpha} * \Delta \alpha
      $$

    • 那么近似的误差函数可以写为(对内部进行泰勒展开并且将整个式子展开)

      $$
      \lvert\lvert e(\alpha + \Delta\alpha) \rvert\rvert ^2 = e^2 + 2e \frac{\delta e}{\delta \alpha} \Delta\alpha + (\frac{\delta e}{\delta \alpha} )^2 (\Delta \alpha)^2
      $$

    • 对于这个方程,$ e(\alpha + \Delta\alpha) $ 表示当e加上一个微小变量时e的变化幅度,当e最小时,有那么$ \frac {d e(\alpha + \Delta\alpha)}{d \Delta \alpha} = 0 $ ,解得

      $$
      \Delta \alpha = -\frac{e}{\frac{\delta e}{\delta\alpha}}
      $$

    • $\Delta \theta$变化的方向是使误差函数趋于最小值的方向,那么

      $$
      \alpha_{updata}= \alpha + \Delta\alpha
      $$

  5. 完整流程图

牛顿法迭代流程图


文章作者: 闲梦溪
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 闲梦溪 !