Test fmincon against an analytical solution for the linear tangent law

The test is for a lunar landing in 2D. The surface is assumed flat. The acceleration is constant.

See also: Constant, Simulate2DLanding, LandingCost2D, LandingConst2D

Contents

%--------------------------------------------------------------------------
%   Copyright (c) 2021 Princeton Satellite Systems, Inc.
%   All rights reserved.
%--------------------------------------------------------------------------
%   Since version 2021.1
%--------------------------------------------------------------------------

Parameters

muMoon      = Constant('mu moon');
rMoon       = Constant('equatorial radius moon');
d.n         = 100; % Number of increments
d.g         = muMoon/rMoon^2;
d.a         = 3*d.g; % Engine acceleration
h           = 15;

% Find the thrust direction angles
beta        = zeros(1,d.n);

% We don't want the last beta since the vehicle is on the ground
beta        = beta(1:end-1);
d.n         = d.n-1;

r           = rMoon + h;
x           = [0;r;sqrt(muMoon/r);0];

tMin        = x(3)/d.a;
t           = linspace(0,tMin,d.n+1);
d.h         = h;
d.u         = x(3);

% Simulate the landing
Simulate2DLanding( t, beta, d, 'Analytical' );

Now repeat with fmincon

% fmincon options
opts      = optimset('Display','iter-detailed',...
                     'TolFun',1e-4,...
                     'algorithm','interior-point',...
                     'TolCon',1e-5,...
                     'MaxFunEvals',3500);

% Pass the initial state to the optimizer
d.x =  x;

% The cost is time, which is a decision variable
% The cost is the time to reach the final state vector
costFun   = @(x) LandingCost2D(x,d);

% The numerical integration of the state is in the constraint function
constFun	= @(x) LandingConst2D(x,d);

% The final state vector is [x;0;0;0];
% We don't care what x is since we can always start the descent at the
% appropriate time.

% First guess for the time decision variable
dT        = t(2:end) - t(1:end-1);

% The decision variables are acceleration angle and time increment
u0        = [beta';dT'];

% Lower and upper bounds
lB        = [-(pi/2)*ones(length(dT),1);zeros(length(dT),1)];
uB        = [(pi/2)*ones(length(dT),1);100*ones(length(dT),1)];

% Find the optimal decision variables.
u         = fmincon(costFun,u0,[],[],[],[],lB,uB,constFun,opts);
                                            First-order      Norm of
 Iter F-count            f(x)  Feasibility   optimality         step
    0     199    3.434516e+02    1.657e+03    1.212e-06
    1     398    2.909333e+02    1.598e+03    9.920e-01    1.037e+01
    2     597    3.545084e+02    1.521e+03    1.157e+00    7.586e+00
    3     796    3.955306e+02    1.474e+03    1.307e+00    4.443e+00
    4     995    4.510892e+02    1.406e+03    1.589e+00    6.062e+00
    5    1194    5.211936e+02    1.312e+03    1.992e+00    7.761e+00
    6    1393    5.594808e+02    1.260e+03    2.269e+00    4.362e+00
    7    1592    5.808764e+02    1.230e+03    2.401e+00    2.615e+00
    8    1791    5.871804e+02    1.221e+03    2.256e+00    8.665e-01
    9    1990    5.952486e+02    1.207e+03    2.271e+00    1.329e+00
   10    2189    6.109752e+02    1.185e+03    2.389e+00    2.711e+00
   11    2388    6.219461e+02    1.169e+03    2.481e+00    2.440e+00
   12    2587    6.233785e+02    1.167e+03    2.619e+00    1.546e+01
   13    2786    6.484953e+02    1.075e+03    7.376e-03    6.018e+00
   14    2985    6.486025e+02    1.074e+03    7.557e-03    3.105e-01
   15    3184    6.486394e+02    1.074e+03    7.693e-03    8.762e-02
   16    3383    6.613633e+02    1.027e+03    3.296e-02    2.992e+00
   17    3583    6.613715e+02    1.027e+03    3.294e-02    3.912e-02

Solver stopped prematurely.

fmincon stopped because it exceeded the function evaluation limit,
options.MaxFunctionEvaluations = 3.500000e+03.

Set up the simulation

beta      = u(1:d.n)';
dT        = u(d.n+1:2*d.n);
t         = zeros(1,length(dT));
for k = 2:d.n+1
  t(k) = t(k-1) + dT(k-1);
end

% Simulate the landing
Simulate2DLanding( t, beta, d, 'FMinCon' );


%--------------------------------------