Orbital transfert: energy minimisation

The energy minimisation orbital transfer problem consists in minimising

\[ 0.5\int_{0}^{tf} {\lVert u(t) \rVert}^2 \, \mathrm{d}t\]

subject to the constraints

\[ \dot x_1(t) = x_3(t) \\ \dot x_2(t) = x_4(t) \\ \dot x_3(t) = -\frac{\mu*x_1(t)}{r(t)^3} + u_1(t) \\ \dot x_4(t) = -\frac{\mu*x_2(t)}{r(t)^3} + u_2(t) \\ \lVert u(t) \rVert \leq \gamma_{max} \\ r(t) = \sqrt{x_1(t)^2 + x_2(t)^2}\]

and the limit conditions

\[ x_1(0) = x_{0,1}, \quad x_2(0) = x_{0,2}, \quad x_3(0) = x_{0,3}, \quad x_4(0) = x_{0,4} \\ r(tf) = r_f, \quad x_3(t_f) = -\sqrt{\frac{\mu}{{r_f}^3}}*x_2(t_f), \quad x_4(t_f) = -\sqrt{\frac{\mu}{{r_f}^3}}*x_1(t_f) \\\]

with the constants

\[t_0 = 0 \\ t_f = 20 \\ x0 = [-42272.67, 0, 0, -5796.72] \\ μ = 5.1658620912*1e12 \\ rf = 42165 \\ m_0 = 2000 \\ F_{max} = 100 \\ γ_{max} = \frac{F_{max}*3600.0^2}{m_0*10^3} \\\]

using CTProblems
using DifferentialEquations
using Plots

You can access the problem in the CTProblems package:

prob = Problem(:orbital_transfert, :energy)
title           = Orbital transfert - energy minimisation - min ∫ ‖u‖² dt
model    (Type) = OptimalControlModel{Autonomous, Fixed}
solution (Type) = OptimalControlSolution

Then, the model is given by

prob.model

The (autonomous) optimal control problem is given by:

    t ∈ [t0, tf], time
    x ∈ R⁴, state
    u ∈ R², control
    x(t0) == x0, initial_con
    [norm((x(tf))[1:2]) - rf, x₃(tf) + α * x₂(tf), x₄(tf) - α * x₁(tf)] == [0, 0, 0], boundary_con
    0 ≤ norm(u(t)) ≤ 1, u_con
    ẋ(t) == A * [(-μ * x₁(t)) / sqrt(x₁(t) ^ 2 + x₂(t) ^ 2) ^ 3; (-μ * x₂(t)) / sqrt(x₁(t) ^ 2 + x₂(t) ^ 2) ^ 3; x₃(t); x₄(t)] + B * u(t)
    ∫(0.5 * (u₁(t) ^ 2 + u₂(t) ^ 2)) → min

The (autonomous) optimal control problem is of the form:

    minimize  J(x, u) = ∫ f⁰(x(t), u(t)) dt, over [0.0, 20.0]

    subject to

        ẋ(t) = f(x(t), u(t)), t in [0.0, 20.0] a.e.,

        ξl ≤ ξ(u(t)) ≤ ξu, 
        ϕl ≤ ϕ(x(0.0), x(20.0)) ≤ ϕu, 

    where x(t) ∈ R⁴ and u(t) ∈ R².

Declarations (* required):
╭────────┬────────┬──────────┬──────────┬───────────┬────────────┬─────────────╮
│ times* │ state* │ control* │ variable │ dynamics* │ objective* │ constraints │
├────────┼────────┼──────────┼──────────┼───────────┼────────────┼─────────────┤
│   V    │   V    │    V     │    X     │     V     │     V      │      V      │
╰────────┴────────┴──────────┴──────────┴───────────┴────────────┴─────────────╯

You can plot the solution.

plot(prob.solution)