弹道方程以及代码实现
什么是弹道方程?
弹道方程,就是使用数学模型来量化子弹在空气阻力作用下的运动轨迹。这听起来十分复杂,但其实际上其算法核心是依托于我们初中学过的斜抛运动,并没有想象之中的那么深奥。
现在,我们假设子弹从A点出发,需要击打B点,在重力加速度和空气阻力的作用下,我们不可能使子弹的初速度直接指向AB方向,而是使子弹的发射方向偏离AC方向$\alpha$角度,这样才能确保子弹能以优美的弧线直接击打中B点。弹道方程的核心便是求解$\alpha$角
忽略空气阻力的弹道方程建模
首先对初速度V进行速度分解
$$
\begin{cases}
v_x=v\cos\alpha \
v_y=v\sin\alpha
\end{cases}
$$由于水平上不受力的作用(忽略了空气阻力),故
飞行时间 $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
$$
求解:先来分析已知条件以及目的参数,我们已经计算得到了B点相对于A点的位置,那么h和f已知,有重力加速度已知,目标是求解$\alpha$,这容易得到$\alpha$的解析式,下面利用高斯牛顿法迭代求解$\alpha$
高斯牛顿法求解方程
首先构造残差函数
$$
\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
$$
完整流程图