Demonstrate the Trajectory optimization using the Zermelo problem
which models a 2D constant velocity field. This is a good example for numerical optimization because there is an analytical cost function. The final state is the origin.
Since version 7. ------------------------------------------------------------------------ See also RHSZermelo, PlotZermelo, ZermeloCost, ZermeloAnalyticalLambda, TrajectoryOptimization ------------------------------------------------------------------------
Contents
%------------------------------------------------------------------------------- % Copyright (c) 2005-2006 Princeton Satellite Systems, Inc. % All rights reserved. %------------------------------------------------------------------------------- clear d
Dynamics function
%------------------ d.d.rhsFun = 'RHSZermelo'; d.d.plotFun = 'PlotZermelo';
Cost function called by optimizer
%---------------------------------- d.d.costFun = 'ZermeloCost';
Initial costate guess
%---------------------- d.d.lambda0 = [-0.4;1]; % Boundary conditions, initial and final state
[r;rDot;v;m]
%---------------------------------------------
d.d.x0 = [3.66;-1.86];
d.d.xF = [0;0];
d.d.rF = d.d.xF(1);
d.d.v = 1;
d.d.h = 1;
Integration (ode113) parameters
%-------------------------------- d.d.data.absTol = 1e-6; d.d.data.relTol = 2.5e-4; d.d.data.maxStep = 0.1; d.d.tEnd = 10; % (s)
Weights for the costates
%------------------------- d.d.errorScale = [5e7; 1; 1]; d.method = 'downhill simplex'; d.repeat = 0;
Simplex parameters
%------------------- d.d.stateTol = 1e-4; d.d.funTol = 1e-4; d.d.nIts = 600; % Optimize the trajectory. It will use PlotZermelo
to plot the results.
%------------------------------------------------------- [lambda,xf,tf] = TrajectoryOptimization( d ); disp('Costates for Simplex') disp(lambda{1})
Case 1: Method: downhill simplex
Iteration Func-count min f(x) Procedure
0 1 3.60186
1 3 3.35152 initial simplex
2 5 2.47418 expand
3 7 0.866531 expand
4 8 0.866531 reflect
5 10 0.866531 contract outside
6 12 0.775953 contract inside
7 14 0.50396 contract inside
8 16 0.148131 contract inside
9 17 0.148131 reflect
10 19 0.126745 contract inside
11 21 0.126745 contract inside
12 23 0.126745 contract inside
13 24 0.126745 reflect
14 26 0.109584 contract inside
15 28 0.109352 reflect
16 30 0.0691972 contract inside
17 32 0.0663115 reflect
18 36 0.0663115 shrink
19 40 0.0663115 shrink
20 42 0.0663115 contract outside
21 44 0.0663115 contract inside
22 46 0.0631696 reflect
23 48 0.0624588 reflect
24 50 0.0624588 contract inside
25 52 0.0624588 contract inside
26 54 0.0624588 contract inside
27 56 0.0623775 reflect
28 58 0.0623775 contract inside
29 60 0.0623775 contract inside
30 62 0.0623775 contract inside
31 64 0.0623775 contract inside
32 66 0.0623713 reflect
33 68 0.0623713 contract inside
34 70 0.0623713 contract inside
35 72 0.0623533 reflect
36 74 0.0623533 contract inside
37 76 0.0623519 reflect
38 78 0.0623519 contract inside
39 80 0.0623519 contract inside
40 82 0.0623519 contract inside
41 84 0.0623504 reflect
42 86 0.062349 reflect
43 88 0.062349 contract inside
44 90 0.0623487 reflect
45 92 0.0623487 contract inside
46 94 0.0623487 contract inside
47 96 0.0623485 reflect
48 98 0.0623485 contract inside
49 100 0.0623485 contract inside
50 102 0.0623484 reflect
Optimization terminated:
the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-04
and F(X) satisfies the convergence criteria using OPTIONS.TolFun of 1.000000e-04
Costates for Simplex
-0.32259
1.2077
Compute and plot the analytical solution for comparison.
%--------------------------------------------------------- disp('Costates for Analytical') lambda = ZermeloAnalyticalLambda( d.d.x0(1)/d.d.h, d.d.x0(2)/d.d.h, d.d.v ) xF = PlotZermelo( lambda, d.d, '', 'Analytical Solution' ); disp('Achieved State') disp(xF) %-------------------------------------- % PSS internal file version information %--------------------------------------
Costates for Analytical
lambda =
-0.50027
1.8646
Achieved State
0.059676
0.091217