1. 建立火箭运动学模型
任务说明
本案例实现火箭在二维平面内的质点运动学模型。给定初始位置、初始速度和加速度随时间变化的函数,通过数值积分(欧拉法)更新火箭的位置与速度,为后续制导算法提供运动学基础。模型忽略质量变化、空气动力和重力以外的力,仅描述运动学关系。
运动学方程
二维平面内质点运动学由以下微分方程描述:
dvx/dt = ax(t)
dvy/dt = ay(t)
dx/dt = vx
dy/dt = vy
其中 (x, y) 为位置,(vx, vy) 为速度,(ax, ay) 为加速度。本案例采用固定时间步长 dt 的欧拉积分进行离散更新。
代码实现
import numpy as np
class RocketKinematics:
"""二维质点运动学模型(欧拉积分)"""
def __init__(self, x0, y0, vx0, vy0, dt):
self.x = x0
self.y = y0
self.vx = vx0
self.vy = vy0
self.dt = dt
self.t = 0.0
def step(self, ax, ay):
"""推进一个时间步,ax/ay 为当前时刻加速度分量"""
# 更新速度
self.vx += ax * self.dt
self.vy += ay * self.dt
# 更新位置
self.x += self.vx * self.dt
self.y += self.vy * self.dt
# 更新时间
self.t += self.dt
return self.x, self.y, self.vx, self.vy, self.t
def simulate_constant_accel(duration, dt):
"""示例:恒定加速度 (2.0, 1.5) m/s²,初始位置原点,初始速度 (10, 0) m/s"""
rocket = RocketKinematics(x0=0.0, y0=0.0, vx0=10.0, vy0=0.0, dt=dt)
n_steps = int(duration / dt)
trajectory = []
for _ in range(n_steps):
state = rocket.step(ax=2.0, ay=1.5)
trajectory.append(state)
return trajectory
if __name__ == "__main__":
# 仿真 5 秒,步长 0.01 秒
traj = simulate_constant_accel(duration=5.0, dt=0.01)
# 打印最后一步状态
x, y, vx, vy, t = traj[-1]
print(f"t={t:.2f}s x={x:.2f}m y={y:.2f}m vx={vx:.2f}m/s vy={vy:.2f}m/s")
代码说明
RocketKinematics 类封装了运动学状态与欧拉更新逻辑。step 方法接收当前时刻的加速度分量,依次更新速度与位置。示例函数 simulate_constant_accel 演示了恒定加速度下的轨迹计算,便于验证数值正确性。
验证方法
对于恒定加速度情形,解析解为:
x(t) = x0 + vx0·t + 0.5·ax·t²
y(t) = y0 + vy0·t + 0.5·ay·t²
vx(t) = vx0 + ax·t
vy(t) = vy0 + ay·t
运行上述代码,观察输出。以示例参数(初始位置原点,初始速度 (10,0) m/s,加速度 (2.0,1.5) m/s²,仿真 5 秒)为例,预期输出为:
t=5.00s x=75.00m y=18.75m vx=20.00m/s vy=7.50m/s
将代码输出与解析解对比,误差应小于 0.01(由步长 0.01s 引入的欧拉截断误差)。若误差在允许范围内,则模型实现正确。
落地与扩展
将上述代码保存为 rocket_kinematics.py,直接运行即可得到仿真结果。后续制导算法可在每个时间步调用 step(ax, ay),其中加速度由制导律计算得出,从而形成完整的闭环仿真链路。该模型是后续所有制导算法仿真的运动学基础。