Test fmincon against an analytical solution for the linear tangent law

The test is for a lunar landing in 3D. The solution is in the moon fixed frame.

Requires fmincon from the MATLAB Optimization Toolbox.

See also: Constant, RHSPlanet3D, BilinearTangentLaw, Simulate3DLanding, LandingCost3D, LandingConst3D, DispWithTitle

Contents

%--------------------------------------------------------------------------
%   Copyright (c) 2015 Princeton Satellite Systems, Inc.
%   All rights reserved.
%--------------------------------------------------------------------------
%   Since 2016.1
%--------------------------------------------------------------------------

if( ~HasOptimizationToolbox )
  error('You need the MATLAB optimization toolbox to run this script.');
end

Parameters

muMoon        = Constant('mu moon');
rMoon         = Constant('equatorial radius moon');
h             = 15; % Initial altitude (km)
r             = rMoon + h;
u             = sqrt(muMoon/r); % Orbital velocity
g             = muMoon/rMoon^2; % Gravity at the lunar surface
printFigures	= false;
algorithm     = 'interior-point';

d           = RHSPlanet3D;
nG          = 3;      % multiple of gravity, guess
a           = nG*g;   % Desired acceleration
d.n         = 40;     % Number of steps
d.m0        = 50;     % Dry mass (kg)

Simulate a guess

Find the thrust direction angles

[beta, t, tMin] = BilinearTangentLaw( u, g, a, h, d.n );
fprintf(1,'2D analytical minimum time %g sec\n',tMin);

dV          = a*1000*tMin;
mF          = d.m0*(exp(dV/d.uE) - 1 );

thrustMax   = a*1000*(d.m0+mF);
d.s0        = [r;0;0;0;0;u;mF];

d.n         = d.n-1;
d.beta      = -pi/2+fliplr(beta(1:end-1)); %-1.37*ones(1,d.n); % constant
d.alpha     = zeros(1,d.n);
d.thrust    = thrustMax*ones(1,d.n); % constant
d.accel     = '';

dT          = t(2:end) - t(1:end-1);

% Simulate and create plots
Simulate3DLanding( dT, d, 'Guess' );
2D analytical minimum time 365.763 sec

Now find the optimal angles with fmincon

Start with the angles found from BilinearTangentLaw. The constraint function simulates the trajectory with RHSPlanet3D.

beta Thrust angle in rv plane alpha Thrust angle out of plane

d.timeOpt   = 1; % Flag, variable timestep
d.fuelW     = 0; % Weight on fuel
d.timeW     = 1; % weight on time

% fmincon options
if( verLessThan('matlab', 'R2014b') )
  opts      = optimset( 'Display','iter-detailed',...
                        'TolFun',0.6,...
                        'TolCon',1e-5,...
                        'MaxFunEvals',100000);
else
  opts      = optimset( 'Display','iter-detailed',...
                        'TolFun',0.6,...
                        'algorithm',algorithm,...
                        'TolCon',1e-5,...
                        'MaxFunEvals',100000);
end

costFun   = @(x) LandingCost3D(x,d);  % cost - sum of total time and fuel mass
constFun	= @(x) LandingConst3D(x,d); % constraints

alpha     = zeros(d.n,1);
thrust    = thrustMax*ones(d.n,1);

x0        = [d.beta';alpha;thrust;dT'];
cost0     = LandingCost3D( x0, d );

lB        = [-(pi/2)*ones(d.n,1);-0.001*ones(d.n,1);zeros(2*d.n,1)];
uB        = [ (pi/2)*ones(d.n,1); 0.001*ones(d.n,1);ceil(thrust);10*ones(length(dT),1)];
[x,cost]  = fmincon(costFun,x0,[],[],[],[],lB,uB,constFun,opts);
                                            First-order      Norm of
 Iter F-count            f(x)  Feasibility   optimality         step
    0     157    3.657635e+02    4.761e+01    1.133e-01
    1     314    2.832440e+02    1.813e+01    4.871e+00    1.328e+01
    2     471    2.732671e+02    2.806e+00    6.459e+00    1.808e+00
    3     628    2.736891e+02    5.733e-02    5.985e+00    1.141e+00
    4     785    2.727743e+02    5.043e-02    6.357e+00    8.696e-01
    5     943    2.732662e+02    3.493e-02    6.264e+00    5.587e-01
    6    1100    2.744763e+02    1.914e-02    6.169e+00    2.698e+00
    7    1257    2.753971e+02    2.531e-02    6.050e+00    6.015e+00
    8    1415    2.761194e+02    3.521e-03    6.094e+00    6.269e+00
    9    1573    2.765031e+02    1.618e-03    6.198e+00    7.246e+00
   10    1731    2.768875e+02    2.509e-03    6.131e+00    4.967e+00
   11    1888    2.768227e+02    5.213e-03    6.133e+00    6.983e-01
   12    2047    2.769269e+02    7.365e-03    6.129e+00    1.003e+00
   13    2204    2.771786e+02    2.687e-03    6.134e+00    1.472e+00
   14    2361    2.772818e+02    1.147e-03    6.129e+00    9.722e-01
   15    2518    2.773014e+02    3.848e-04    6.132e+00    1.859e-01
   16    2675    2.773112e+02    5.678e-06    6.136e+00    1.420e-01
   17    2833    2.773404e+02    1.306e-06    6.143e+00    3.440e-01
   18    2991    2.773714e+02    2.871e-06    6.142e+00    4.289e-01
   19    3149    2.773782e+02    5.106e-06    6.136e+00    5.413e-01
   20    3307    2.773628e+02    1.360e-05    6.136e+00    8.925e-01
   21    3465    2.773546e+02    2.057e-05    6.132e+00    4.649e-01
   22    3622    2.773533e+02    2.192e-04    6.139e+00    1.062e-01
   23    3779    2.773553e+02    1.438e-04    6.143e+00    1.264e-01
   24    3936    2.773585e+02    1.545e-05    6.146e+00    1.510e-01
   25    4094    2.773577e+02    4.387e-07    4.692e+00    1.230e-01
   26    4252    2.773278e+02    3.375e-06    9.947e+00    3.996e-01
   27    4410    2.773108e+02    3.118e-06    1.321e+01    4.980e-01
   28    4567    2.772920e+02    1.567e-05    1.981e+01    6.723e-01
   29    4725    2.772445e+02    1.851e-05    2.491e+01    9.711e-01
   30    4883    2.772340e+02    5.619e-07    1.777e+01    3.648e-01

                                            First-order      Norm of
 Iter F-count            f(x)  Feasibility   optimality         step
   31    5041    2.772331e+02    1.455e-06    1.459e+01    2.839e-01
   32    5199    2.772266e+02    2.284e-08    8.656e+00    1.176e-01
   33    5357    2.772223e+02    5.914e-07    8.265e+00    2.422e-01
   34    5515    2.772245e+02    2.825e-07    6.535e+00    1.770e-01
   35    5673    2.772272e+02    2.966e-07    1.008e+01    2.497e-01
   36    5831    2.772317e+02    8.485e-07    1.156e+01    3.958e-01
   37    5989    2.772281e+02    1.189e-08    9.517e+00    1.983e-01
   38    6147    2.772242e+02    1.877e-07    1.368e+01    5.833e-01
   39    6305    2.772189e+02    3.543e-06    3.471e+01    9.399e-01
   40    6463    2.772146e+02    5.868e-07    1.797e+01    4.047e-01
   41    6621    2.772139e+02    9.484e-07    1.161e+01    4.453e-01
   42    6779    2.772137e+02    1.775e-06    1.446e+01    5.754e-01
   43    6937    2.772114e+02    1.158e-07    8.098e+00    1.852e-01
   44    7095    2.772119e+02    2.810e-09    3.941e+00    6.868e-02
   45    7253    2.772125e+02    1.140e-07    1.083e+01    3.027e-01
   46    7411    2.772176e+02    1.791e-07    1.838e+01    4.175e-01
   47    7569    2.772268e+02    4.834e-08    1.305e+01    2.448e-01
   48    7727    2.772508e+02    7.479e-07    8.712e+00    8.861e-01
   49    7885    2.772780e+02    1.332e-06    1.584e+01    9.124e-01
   50    8043    2.772774e+02    1.995e-08    4.391e+00    6.991e-02
   51    8201    2.772772e+02    9.627e-10    4.278e+00    9.549e-02
   52    8359    2.772804e+02    4.958e-09    9.036e+00    1.770e-01
   53    8516    2.772802e+02    4.050e-06    6.785e+00    9.765e-02
   54    8674    2.772816e+02    2.713e-08    1.157e+01    2.228e-01
   55    8832    2.772878e+02    8.008e-08    1.734e+01    4.671e-01
   56    8990    2.772883e+02    1.603e-07    1.211e+01    3.550e-01
   57    9148    2.772898e+02    4.732e-09    7.156e+00    8.572e-02
   58    9306    2.772863e+02    3.674e-09    3.702e+00    1.371e-01
   59    9464    2.772857e+02    8.937e-09    2.885e+00    1.466e-01
   60    9622    2.772845e+02    8.143e-09    4.703e+00    1.190e-01

                                            First-order      Norm of
 Iter F-count            f(x)  Feasibility   optimality         step
   61    9779    2.772826e+02    7.818e-06    8.468e+00    1.385e-01
   62    9937    2.772824e+02    1.492e-08    6.144e+00    2.489e-01
   63   10095    2.772773e+02    2.451e-08    5.814e+00    5.335e-01
   64   10253    2.772710e+02    2.580e-08    7.164e+00    5.459e-01
   65   10411    2.772681e+02    1.472e-08    5.287e+00    2.389e-01
   66   10569    2.772688e+02    4.589e-09    3.743e+00    8.871e-02
   67   10727    2.772673e+02    7.040e-09    4.074e+00    2.775e-01
   68   10884    2.772660e+02    2.003e-06    3.359e+00    2.248e-01
   69   11042    2.772643e+02    1.533e-08    3.592e+00    6.967e-02
   70   11199    2.772622e+02    5.396e-06    4.913e+00    1.245e-01
   71   11357    2.772600e+02    1.778e-07    5.742e+00    3.087e-01
   72   11515    2.772600e+02    9.166e-08    5.184e+00    2.487e-01
   73   11673    2.772609e+02    6.558e-09    7.981e+00    1.274e-01
   74   11830    2.772598e+02    4.517e-06    2.788e+00    3.992e-02
   75   11987    2.772590e+02    1.529e-06    3.564e+00    1.491e-01
   76   12144    2.772590e+02    4.502e-07    1.953e+00    1.980e-01
   77   12301    2.772594e+02    2.362e-07    2.473e+00    6.369e-02
   78   12458    2.772603e+02    7.339e-07    3.989e+00    7.188e-02
   79   12616    2.772592e+02    1.897e-09    3.131e+00    8.550e-02
   80   12774    2.772559e+02    3.745e-08    2.343e+00    2.451e-01
   81   12932    2.772543e+02    2.827e-08    2.228e+00    2.080e-01
   82   13090    2.772549e+02    9.221e-09    2.897e+00    1.050e-01
   83   13247    2.772546e+02    8.400e-07    1.199e+00    2.048e-02
   84   13405    2.772541e+02    2.331e-09    2.202e+00    6.098e-02
   85   13562    2.772542e+02    6.832e-07    2.319e+00    5.206e-02
   86   13719    2.772544e+02    9.752e-07    2.237e+00    6.906e-02
   87   13877    2.772540e+02    1.389e-10    2.041e+00    6.364e-02
   88   14035    2.772528e+02    1.665e-09    2.107e+00    1.735e-01
   89   14193    2.772516e+02    6.473e-10    2.248e+00    1.177e-01
   90   14351    2.772502e+02    2.036e-09    3.198e+00    1.053e-01

                                            First-order      Norm of
 Iter F-count            f(x)  Feasibility   optimality         step
   91   14508    2.772496e+02    2.437e-06    2.455e+00    6.098e-02
   92   14666    2.772485e+02    5.847e-09    1.563e+00    9.848e-02
   93   14824    2.772462e+02    2.316e-09    6.692e-01    1.565e-01
   94   14982    2.772452e+02    9.657e-10    6.501e-01    9.221e-02
   95   15140    2.772445e+02    1.251e-09    1.078e+00    8.572e-02
   96   15298    2.772442e+02    9.754e-11    7.398e-01    7.865e-02
   97   15456    2.772450e+02    2.926e-09    1.146e+00    1.014e-01
   98   15614    2.772461e+02    9.212e-09    2.500e+00    1.617e-01
   99   15771    2.772466e+02    7.898e-07    2.445e+00    1.252e-01
  100   15929    2.772473e+02    9.882e-10    2.471e+00    2.051e-01
  101   16087    2.772480e+02    2.819e-09    1.789e+00    1.644e-01
  102   16245    2.772487e+02    1.846e-10    1.663e+00    3.457e-02
  103   16402    2.772492e+02    2.652e-07    1.195e+00    3.932e-02
  104   16559    2.772496e+02    6.041e-08    1.143e+00    3.925e-02
  105   16717    2.772499e+02    3.746e-09    1.180e+00    7.072e-02
  106   16875    2.772502e+02    2.846e-09    1.142e+00    9.960e-02
  107   17033    2.772518e+02    4.250e-09    1.831e+00    9.321e-02
  108   17190    2.772515e+02    8.423e-07    9.105e-01    1.426e-02
  109   17347    2.772519e+02    7.367e-08    9.355e-01    2.871e-02
  110   17504    2.772530e+02    6.079e-07    8.817e-01    8.064e-02
  111   17662    2.772535e+02    1.592e-09    8.850e-01    5.600e-02
  112   17820    2.772539e+02    6.717e-10    1.249e+00    2.972e-02
  113   17978    2.772540e+02    2.731e-10    1.191e+00    2.582e-02
  114   18136    2.772542e+02    3.213e-10    1.036e+00    3.100e-02
  115   18294    2.772545e+02    1.110e-09    8.246e-01    4.903e-02
  116   18452    2.772547e+02    1.705e-09    9.945e-01    7.240e-02
  117   18609    2.772547e+02    5.005e-07    1.060e+00    5.613e-02
  118   18767    2.772546e+02    3.365e-11    1.193e+00    7.765e-02
  119   18925    2.772544e+02    1.753e-10    1.226e+00    7.308e-02
  120   19083    2.772536e+02    2.392e-10    1.488e+00    3.174e-02

                                            First-order      Norm of
 Iter F-count            f(x)  Feasibility   optimality         step
  121   19241    2.772533e+02    1.569e-13    6.474e-01    3.424e-02
  122   19399    2.772525e+02    2.208e-10    6.607e-01    8.021e-02
  123   19557    2.772524e+02    2.660e-11    5.857e-01    5.471e-02

Optimization completed: The relative first-order optimality measure, 5.856687e-01,
is less than options.OptimalityTolerance = 6.000000e-01, and the relative maximum constraint
violation, 5.587197e-13, is less than options.ConstraintTolerance = 1.000000e-05.

Simulate the landing with optimal angles

d.beta      = x(1:        d.n)';
d.alpha     = x(d.n+1:  2*d.n)';
d.thrust    = x(2*d.n+1:3*d.n)';
dT          = x(3*d.n+1:4*d.n)';

fprintf(1,'Optimal time %g sec\n',sum(dT));
Plot2D()

[cIn, cEq, s] = LandingConst3D( x, d );

DispWithTitle(cEq,'Final equality constraints, [altitude;y;x velocity;y velocity;z velocity]');

Simulate3DLanding( dT, d, 'FMinCon3D' );

if( printFigures )
  for k = 1:10
    PrintFig(0,2,k,sprintf('fmincon3D_%d',k));
  end
end

Figui

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

% $Id: 0a573b49691b9168dc3193e1f671bc25f6675b73 $
Optimal time 277.252 sec
Final equality constraints, [altitude;y;x velocity;y velocity;z velocity]
   2.6603e-11
  -6.2839e-14
  -4.2023e-13
   3.5147e-16
   7.6135e-13