Engee 文档
Notebook

火箭控制参数的优化

导言

应用数学和控制理论领域的一项紧迫任务是求解动态系统最优控制的非线性问题。 这个例子考虑了这样一个任务的一个特殊但说明性的情况-考虑到其动力学,最大化火箭垂直飞行的最终高度。

这项研究的目的是证明使用现代计算优化工具的公式和数值解决这些问题的方法。

所提出的模型考虑了关键的物理因素:由于燃料消耗而产生的可变质量,取决于高度的重力以及空气动力学阻力,这使得它适合于演示最佳控制的原理。

我们将附加必要的库。

In [ ]:
using JuMP, Ipopt, Measures

有必要选择这样的最佳参数,以确保垂直发射火箭的最大可能高度。

我们可以根据火箭的质量、燃料消耗、重力和空气阻力来控制火箭的推力。

让我们来看看模型的基本描述。

我们的模型中有三个状态变量:

*速度:

*高度:

*火箭和剩余燃料的质量:

和一个控制变量:

*牵引: .

火箭的动力学由三个方程描述:

*提升速度:

*加速:

*质量损失率: ,

阻力在哪里 是高度和速度,重力的函数 -高度功能,以及 -常数。

这些力的定义如下:

.

我们使用具有固定步数的时间离散化模型。 .

因此,我们的目标是最大化 .

初始数据

在该模型中使用归一化的无量纲参数。

初始化源数据。

In [ ]:
h_0 = 1                      # 初始高度
v_0 = 0                      # 初始速度
m_0 = 1.0                    # 初始重量
m_T = 0.6                    # 最终重量
g_0 = 1                      # 表面的重力
h_c = 500                    # 电阻的高度参数
c = 0.5 * sqrt(g_0 * h_0)    # 比冲(燃料消耗推力)
D_c = 0.5 * 620 * m_0 / g_0  # 电阻系数
u_t_max = 3.5 * g_0 * m_0    # 最大推力
T_max = 0.2                  # 飞行时间(秒)
T = 1_000                    # 时间步数
Δt = T_max / T               # 时间步长

让我们创建一个模型并选择一个优化方法。 由于这是一个非线性任务,我们需要使用非线性方法,如Ipopt

In [ ]:
model = Model(Ipopt.Optimizer)
set_silent(model)

接下来,我们将创建描述火箭状态和控制的变量。 它们都随着时间的推移而变化。 为了使方法更快地找到解,我们将每个变量设置为其近似初始值。

In [ ]:
@variable(model, x_v[1:T] >= 0, start = v_0)           # 速度
@variable(model, x_h[1:T] >= 0, start = h_0)           # 身高
@variable(model, x_m[1:T] >= m_T, start = m_0)         # 重量
@variable(model, 0 <= u_t[1:T] <= u_t_max, start = 0); # 推力;推力

让我们设置初始和最终条件。

In [ ]:
fix(x_v[1], v_0; force = true)
fix(x_h[1], h_0; force = true)
fix(x_m[1], m_0; force = true)
fix(u_t[T], 0.0; force = true)

优化目标是确保火箭在机动结束时达到尽可能高的高度。

In [ ]:
@objective(model, Max, x_h[T])

模型中的阻力和重力是使用函数设置的:

In [ ]:
D(x_h, x_v) = D_c * x_v^2 * exp(-h_c * (x_h - h_0) / h_0)
g(x_h) = g_0 * (h_0 / x_h)^2

优化约束以描述火箭运动的方程组的形式定义。

In [ ]:
ddt(x::Vector, t::Int) = (x[t] - x[t-1]) / Δt
@constraint(model, [t in 2:T], ddt(x_h, t) == x_v[t-1])
@constraint(model, [t in 2:T], ddt(x_v, t) == (u_t[t-1] - D(x_h[t-1], x_v[t-1])) / x_m[t-1] - g(x_h[t-1]))
@constraint(model, [t in 2:T], ddt(x_m, t) == -u_t[t-1] / c);

让我们完成优化任务并检查解决方案。:

In [ ]:
optimize!(model)
assert_is_solved_and_feasible(model)
solution_summary(model)
******************************************************************************
This program contains Ipopt, a library for large-scale nonlinear optimization.
 Ipopt is released as open source code under the Eclipse Public License (EPL).
         For more information visit https://github.com/coin-or/Ipopt
******************************************************************************

Out[0]:
solution_summary(; result = 1, verbose = false)
├ solver_name          : Ipopt
├ Termination
│ ├ termination_status : LOCALLY_SOLVED
│ ├ result_count       : 1
│ └ raw_status         : Solve_Succeeded
├ Solution (result = 1)
│ ├ primal_status        : FEASIBLE_POINT
│ ├ dual_status          : FEASIBLE_POINT
│ ├ objective_value      : 1.01278e+00
│ └ dual_objective_value : 4.66547e+00
└ Work counters
  ├ solve_time (sec)   : 6.59115e+00
  └ barrier_iterations : 24

让我们定义一个函数,用于绘制具有最佳参数的火箭的高度,质量,速度和推力。

In [ ]:
函数轨迹(y;kwargs...)
    return Plots.plot(
        (1:T) * Δt,
        value.(y);
        xlabel = "时间以秒为单位",
        legend = false,
        linewidth = 2,
        kwargs...,
    )
end

让我们绘制火箭的高度。

In [ ]:
Plots.plot(траектория(x_h; ylabel = "身高"))
Out[0]:

让我们绘制火箭的质量变化。

In [ ]:
Plots.plot(траектория(x_m; ylabel = "重量"))
Out[0]:

让我们绘制火箭的速度。

In [ ]:
Plots.plot(траектория(x_v; ylabel = "速度"))
Out[0]:

让我们绘制火箭的最佳推力。

In [ ]:
Plots.plot(траектория(u_t; ylabel = "推力;推力"))
Out[0]:

结论

在本研究的框架内,成功地解决了垂直火箭飞行模型的非线性最优控制问题。 最大化最终高度的目标是通过构建初始连续问题的离散近似及其后续优化来实现的。

本文提出的方法是通用的,可以扩展到更复杂的情况,例如三维动力学问题,多级飞行或具有附加相位约束的系统。 因此,该研究有助于应用非线性规划方法解决最优控制工程问题的实践。