质点弹道模型将弹丸看作一个质点,考虑在空气阻力和重力的作用下弹丸的飞行轨迹。该模型相对相对简单易于实现,也能够对实际的飞行轨迹进行较好的估计。质点弹道是建立在小攻角假设下,忽略弹体姿态对飞行的影响,仅计算质心在三维空间的线运动。质点弹道具有非常广泛的实际应用,被视为现代外弹道学的基础。
运动方程
质点弹道的理论基础是牛顿运动定律,即质心运动的加速度由受到的力决定,公式如下:
式中,左侧为质心的加速度,右侧为弹丸受到的空气阻力和重力。其中,速度为弹丸相对风的速度,阻力的简化记号如下:
将公式表示成分量形式,则如下:
弹丸相对风的速度为:
公式表明,质点弹道是一个非线性的耦合模型,对其进行解析计算需要进行大量的变换处理,例如将独立变量转换为弧长等。另一种直接的求解方式需要依靠数值计算。在二战前,数值计算质点弹道是一个大难题,冯.诺伊曼等人也由此推开了计算机世界的大门——ENIAC诞生就是为计算弹道问题。但是,在今天这就是小菜一碟了。因此后续将介绍利用数值计算的方法进行数值计算。
弹道方程的数值计算
计算机技术高度发达的今天,任何一台数字计算机都能够具备计算质点弹道的能力,甚至是你的只能手机也可以对弹道实现轻松求解。
认识数值计算
为快速理解弹道方程的数值计算,先从现有的资源开始思想入门。打开电脑或手机,用最熟练和最熟悉的方式打开以下链接或者App:
以网络冲浪和手机游戏的方式来感受弹道的数值计算应该很直观吧。经过摸索后,分析得到数值计算弹道模型的几个要素:
- 弹丸物理参数:质量、弹径等
- 气动参数:空气动力系数(阻力等)或弹形几何
- 射击诸元:初速、射角等
- 气象参数:大气模型、风速等
- 数值方法:插值、积分
其中,弹丸物理参数属于固有属性;气动参数在前面章节已经介绍,在质点弹道中只需要用到阻力系数;射击诸元等属于常微分方程的初始条件;气象参数由标准气象或插值表格计算;数值方法隐含在计算过程的代码中。
标准大气
气动力是由气动力系数和动压计算得到,其中气象条件影响着动压的大小。国际上对实际大气条件进行研究和建模,使得能够在计算机能快速计算特定高度下的气压、密度等数据。常见的标准大气有:国际标准大气、美国标准大气等。针对我国炮兵的使用条件,也存在我国炮兵标准大气。
标准大气参数虽然标准大气的种类很多,但都是气压、温度、密度和声速随高度的变化规律,如上图所示。那么实际应用过程中,需要根据弹丸飞行的高度进行插值即可得到需要的参数。
数值方法
数值方法就是计算机求解公式的数学表达,例如上述对大气的高度插值。在很短的时间内,弹道方程属于常微分方程,因此进行数值积分即可得到飞行轨迹随时间的变化曲线。
质点弹道计算中需要用到的数值方法只有插值和积分,都是数学和工程领域最基本的方法,因此只是简单地作如下说明:
- 插值:在已知的表格内,以其中一列作为索引,其他列作为值,输入任意x(在索引范围内)得到y(值)的过程,最常见的线性插值即可满足弹道计算中对气动系数和大气参数的插值要求;
- 积分:这里特指常微分方程的积分,在很小的时间步长内由当前的状态计算下一时间步的状态,常见方法有牛顿插值、龙格-库塔等,弹道常微分方程求解最常用的为四阶龙格-库塔法。
数值方法的数学本质请自行参阅书籍,其代码实现的方式也很多样。
编程实现
进行计算机求解需要编程语言,将公式及其数值方法翻译成为机器能够识别的语言。当前,能够用于弹道计算的编程语言数不胜数,任何一种都可以实现质点弹道的数值计算。但是作为工具,用户当然是希望选择一种方便易用的,因此下面针对性的进行介绍。
根据应用背景将弹道求解分为分析研究和硬件实践两大类,分别作以下推荐性的介绍。由于笔者学识和经验有限,推荐可能存在不妥,望读者谅解并指正。
- 分析研究类:MATLAB和Python,两种都是脚本语言,代码编写效率很高,存在大量的库和内嵌函数,极大的方便了后续研究工作的扩展,包括数据处理、飞行控制方法设计。
- 硬件实践类:C/C++,目前微控制器中最常用的编译语言,代码编写效率一般,但代码执行效率高,数值方法需要自己编写函数或者引入开源库。
为便于读者快速编写代码,下面给出一个Python求解常微分方程的例子,并以例程说明代码实现流程。
Lorenz Attractor 问题的数学描述:一个三维的动力学问题,同样具有非线性耦合特性,需要通过常微分方程的数值积分方法进行求解。模型方程和弹道方程类似,如下所示。
方程中含有三个系数,假设系数均为常数(区别:弹道模型中的气动系数需要进行插值),如下:
三维问题的初始条件如下(弹道方程中是起始点的位置和发射诸元):
![](http://latex.codecogs.com/svg.latex?[x,y,z]=[2.0, 3.0, 4.0])
数值积分方法直接采用 Scipy 包中的 odeint 来实现,全部代码如下:
from scipy.integrate import odeint # 引入数值积分方法
def Lorenz(state,t): # 定义常微分方程
# unpack the state vector
x = state[0]
y = state[1]
z = state[2]
# these are our constants
sigma = 10.0
rho = 28.0
beta = 8.0/3.0
# compute state derivatives
xd = sigma * (y-x)
yd = (rho-z)*x - y
zd = x*y - beta*z
# return the state derivatives
return [xd, yd, zd]
state0 = [2.0, 3.0, 4.0] # 初始条件
t = arange(0.0, 30.0, 0.01) # 边界条件
state = odeint(Lorenz, state0, t) # 数值积分
# do some fancy 3D plotting # 数据处理可视化
from mpl_toolkits.mplot3d import Axes3D
fig = figure()
ax = fig.gca(projection='3d')
ax.plot(state[:,0],state[:,1],state[:,2])
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
show()
(代码来源:Gribblelab,得到的结果如下图所示)
例程得到的结果曲线代码清晰地展示了求解常微分方程的四个要素,并结合弹道计算列举如下:
- 常微分方程:弹道方程
- 初始条件:射击诸元
- 边界条件:积分时长或弹丸落地
- 数值积分方法:龙格-库塔
小结
本章介绍了质点弹道模型及其数值计算方法,和以后学习内容有一个共性——模型是核心,数值计算是方法,代码是工具。因此,得首先重视对弹道模型的学习和认识,然后才能拿起工具去实现方法。
网友评论