跳转至

多阶段两级火箭

背景

火箭级间分离是一个混杂事件:高度和速度在分离瞬间保持连续,但抛弃空级结构会使飞行器质量瞬时变化。将每个动力级表示为独立阶段,可以明确区分这两类转换,也不需要用人为设置的极快连续过程来近似质量跳变。

本示例优化竖直上升轨迹,使火箭到达给定远地点。所有量均经过无量纲化,以保持动力学和非线性规划问题的数值尺度均衡。

问题定义

对于第 \(i\in\{1,2\}\) 级,状态为高度 \(h_i\)、竖直速度 \(v_i\) 和质量 \(m_i\),控制 \(\alpha_i\) 为节流比例。动力学为

\[ \dot h_i=v_i, \qquad \dot v_i=\frac{T_i\alpha_i}{m_i}-g, \qquad \dot m_i=-\beta_i\alpha_i, \]

其中

\[ g=1, \qquad (T_1,\beta_1)=(2.40,0.080), \qquad (T_2,\beta_2)=(1.60,0.045). \]

第一阶段的时间区间为 \([0,t_s]\),第二阶段为 \([t_s,t_f]\)。目标函数权衡终止时间和控制消耗:

\[ \min\quad t_f+0.04\left(\int_0^{t_s}\alpha_1^2\,\mathrm{d}t +\int_{t_s}^{t_f}\alpha_2^2\,\mathrm{d}t\right). \]

任务从单位质量、静止状态开始,并在给定远地点结束:

\[ [h_1(0),v_1(0),m_1(0)]=[0,0,1], \]
\[ [h_2(t_f),v_2(t_f),m_2(t_f)]=[2,0,m_f]. \]

质量构成包括 \(0.06\) 的一级推进剂、\(0.20\) 的一级抛弃结构、\(0.12\) 的二级推进剂和 \(0.62\) 的二级干质量。一级在推进剂耗尽时分离,因此

\[ m_s^-=1-0.06=0.94, \qquad m_s^+=m_s^- -0.20=0.74. \]

在共享的分离时刻,高度和速度连续,质量则按照上述关系离散重置:

\[ \begin{aligned} h_1(t_s)&=h_s=h_2(t_s), \\ v_1(t_s)&=v_s=v_2(t_s), \\ m_1(t_s)&=m_s^-, \\ m_2(t_s)&=m_s^+. \end{aligned} \]

路径边界为

\[ 0\le\alpha_i\le1, \qquad 0\le h_i\le2, \qquad 0\le v_i\le3, \]
\[ 0.94\le m_1\le1, \qquad 0.62\le m_2\le0.74. \]

其余系统边界为

\[ \begin{aligned} 0.10&\le h_s\le1.80, & 0.05&\le v_s\le2.50, \\ 0.20&\le t_s\le3.00, & 0.62&\le m_f\le0.74, \\ 0.40&\le t_f-t_s\le5.00, & 1.00&\le t_f\le7.00. \end{aligned} \]

变量与单位

所有数值均为无量纲量,因此单位栏中的短横线表示经过缩放的模型量。

符号 含义 单位
\(h_i\) \(i\) 级的高度 -
\(v_i\) \(i\) 级的竖直速度 -
\(m_i\) \(i\) 级的飞行器质量 -
\(\alpha_i\) \(i\) 级的节流比例 -
\(T_i\) 满节流推力系数 -
\(\beta_i\) 满节流质量流率系数 -
\(t_s,t_f\) 分离时刻和终止时刻 -
\(m_s^-,m_s^+\) 分离前和分离后的瞬时质量 -

建模选择

共享静态参数 \(h_s\)\(v_s\)\(t_s\) 精确连接两个 Radau 阶段。分离前后的质量分别使用静态参数 \(m_s^-\)\(m_s^+\),再由系统等式连接,从而表示真实的质量重置,而不会错误地强制质量连续。

一级燃尽质量和二级干质量来自上述推进剂构成。一级自身的推进剂不足以到达目标远地点,因此两个动力级会自然参与任务,无需人为设置二级节流下限。目标中的小权重节流平方项对最短时间目标起正则化作用。

每个阶段采用 96 个 Radau 网格区间,每个区间使用一个配点,从而得到分段常值节流和分段线性状态重构。因此,节点处的边界也在节点之间成立,不会受到高阶插值过冲的影响。初始猜测包含精确的 0.20 质量跳变,并保持高度和速度连续。优化完成后,程序还会在每个阶段的 2,001 个均匀时间点上独立检查全部路径边界。

运行示例

在仓库根目录运行:

python -m examples.multiphase_two_stage_rocket

如需保存图片且不打开窗口:

python -m examples.multiphase_two_stage_rocket --save two-stage-rocket.png --no-show

关键实现

阶段端点使用共享系统符号连接连续状态,并在分离前后使用不同的质量符号:

system = System(
    [
        "h_separation", "v_separation",
        "m_before_drop", "m_after_drop",
        "t_separation", "m_final", "t_final",
    ]
)
h_s, v_s, m_before, m_after, t_s, m_f, t_f = system.s

first_stage.set_boundary_condition(
    [0.0, 0.0, 1.0], [h_s, v_s, m_before], 0.0, t_s
)
second_stage.set_boundary_condition(
    [h_s, v_s, m_after], [2.0, 0.0, m_f], t_s, t_f
)
system.set_phase([first_stage, second_stage])

燃尽质量和离散重置写成系统级等式,终端质量下界表示二级干质量:

system.set_system_constraint(
    [m_before, m_after - m_before, m_f, t_f - t_s],
    [0.94, -0.20, 0.62, 0.40],
    [0.94, -0.20, 0.74, 5.00],
)
system.set_objective(
    t_f + 0.04 * (first_stage.I[0] + second_stage.I[0])
)

完整源码还包括全部路径和静态变量边界、具有动力学合理性的初始猜测、求解器状态检查,以及对阶段连续性、推进剂限制和质量重置的数值验证。

已验证结果

经过验证的解得到目标函数值 \(2.64500359\)、分离时刻 \(t_s=0.750000\) 和终止时刻 \(t_f=2.601708\)。分离高度为 \(h_s=0.403132\),分离速度为 \(v_s=1.105664\)。二级使用 \(0.015374\) 个质量单位的推进剂,随后滑行至目标远地点,终端质量为 \(m_f=0.724626\)

分离前后的高度和速度在所列精度下完全一致,计算得到的质量跳变为 \(0.200000\)。密集重构在所列精度下没有路径边界超限;最大速度为 \(1.495408<3\),二级最小质量比干质量下界高 \(0.104626\)。图中的竖直虚线表示分离时刻,质量图中的点线段表示瞬时质量重置。

多阶段两级火箭上升的高度、速度、质量和节流历程

源码

完整可运行示例见 examples/multiphase_two_stage_rocket.py