Rocket

Rocket

This problem can be found here.

Packages that will be used

using NLOptControl, PrettyPlots

Constants

# Note that all parameters in the model have been normalized
# to be dimensionless. See the COPS3 paper for more info.
h_0 = 1    # Initial height
v_0 = 0    # Initial velocity
m_0 = 1    # Initial mass
g_0 = 1    # Gravity at the surface

# Parameters
T_c = 3.5  # Used for thrust
h_c = 500  # Used for drag
v_c = 620  # Used for drag
m_c = 0.6  # Fraction of initial mass left at end

# Derived parameters
c     = 0.5*sqrt(g_0*h_0)  # Thrust-to-fuel mass
m_f   = m_c*m_0            # Final mass
D_c   = 0.5*v_c*m_0/g_0    # Drag scaling
T_max = T_c*g_0*m_0        # Maximum thrust

Define the Problem:

n=define(numStates=3,numControls=1,X0=[h_0,v_0,m_0],XF=[NaN,NaN,m_f],XL=[h_0,v_0,m_f],XU=[NaN,NaN,m_0],CL=[0.0],CU=[T_max]);

State and Control Names

states!(n,[:h,:v,:m],descriptions=["height (t)","velocity (t)","mass (t)"]);
controls!(n,[:T],descriptions=["thrust (t)"]);

Differential Equations

Drag=:($D_c*v[j]^2*exp(-$h_c*(h[j]-$h_0)/$h_0));
Grav=:($g_0*($h_0/h[j])^2);
dx=Array{Expr}(3,);
dx[1]=:(v[j]);
dx[2]=:((T[j]-$Drag)/m[j]-$Grav)
dx[3]=:(-T[j]/$c);

Then add the differential equations to the model:

dynamics!(n,dx)

Configure the Problem:

configure!(n;(:finalTimeDV=>true));

Objective Function

@NLobjective(n.ocp.mdl,Max,n.r.ocp.x[end,1]);

Optimize

optimize!(n);

Post Process

allPlots(n)