Demonstrate the Trajectory optimization function for sails in 2D orbits.
Choose either Simplex or genetic algorithms. Select either a Mars transfer or the planar portion of Solar Polar Imager (SPI). Choose either Simplex or GA for each run at the top of the script. Assumes a perfectly specular sail.
Functions demonstrated: TwoDOptimalSailAngle RHSOpt2DOrbit Plot2DTrajectory CostSail2D TrajectoryOptimization
Since version 7. ------------------------------------------------------------------------ See also Constant, Planets, heuristicXover, nonUnifMutation, normGeomSelect, Plot2DTrajectory, TwoDOptimalSailAngle, CostSail2D, TrajectoryOptimization, RHSOpt2DOrbit ------------------------------------------------------------------------
Contents
%------------------------------------------------------------------------------- % Copyright (c) 2005-2006 Princeton Satellite Systems, Inc. % All rights reserved. %------------------------------------------------------------------------------- disp('This demo takes several minutes to run.') %%%%%%%%%%%%%%%%%%%%%%%%%%%%% % User input method = 1; % 1, simplex 2, genetic algorithms mission = 'mars'; % 'spi' or 'mars' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
This demo takes several minutes to run.
On the next pass use the newly computed lambda as the first guess
%------------------------------------------------------------------ d.repeat = 0; aU = Constant('au'); c = Constant('speed of light');
Spacecraft properties
%----------------------
This assumes 100 kg mass, 160x160 m sail
%----------------------------------------- area = 160^2; mass = 350; % acceleration is premultiplied by au^2 for scaling in RHS d.d.accel = area*1367*1e-6/(c*mass)*aU^2; % km/sec^2 d.d.sailAngleFun = @TwoDOptimalSailAngle;
Heliocentric system
%--------------------- d.d.mu = Constant('mu sun');
Dynamics function
%------------------
d.d.rhsFun = @RHSOpt2DOrbit;
d.d.plotFun = @Plot2DTrajectory;
Cost function called by optimizer
%----------------------------------
d.d.costFun = @CostSail2D;
Initial costate guess
%---------------------- % Boundary conditions, initial and final state
[r;rDot;v;m]
%--------------------------------------------- switch mission case 'spi' rF = 0.48*aU; lambda0 = [0.151216557215921; 24176.8510939925; 803052.637561317 ]; nDays = 2.5*365; case 'mars' [name,rF] = Planets('rad',4); rF = rF(1)*aU; lambda0 = [-0.001047975499; 21925.68149; 201476.7856]; nDays = 2.7*365; end d.d.x0 = [aU;0;sqrt(d.d.mu/aU)]; d.d.xF = [rF;0;sqrt(d.d.mu/rF)]; d.d.rF = d.d.xF(1); d.d.lambda0 = lambda0;
Integration (ode113) parameters
%-------------------------------- d.d.data.absTol = 1e-8; d.d.data.relTol = 2.5e-6; d.d.data.maxStep = 0.1; % ode113 will never take a step bigger than this % fraction of the end time d.d.tEnd = nDays*86400; % (s)
Weights for the costates
%------------------------- d.d.errorScale = [d.d.xF(3)/d.d.xF(1); 1; 1]; switch method case 1 %----------------------------- % 1. Downhill simplex (fmins) %----------------------------- d.method = 'downhill simplex'; % Simplex parameters %------------------- d.d.stateTol = 1e-4; d.d.funTol = 1e-2; d.d.nIts = 600; % Optimize the trajectory. It will used Plot2DTrajectory % to plot the results %------------------------------------------------------- lambda = TrajectoryOptimization( d ); disp('Costates for Simplex') disp(lambda{1}) case 2 %----------------------------- % 2. Genetic algorithm (GAOT) %----------------------------- d.method = 'genetic algorithm'; % The number of individuals %-------------------------- d.d.nI = 40; % The number of generations %-------------------------- d.d.nG = 35; % The bounds on the costate %-------------------------- d.d.bounds = [-10 10; 1e6*[-1 1; -1 1]]; % The selection function %----------------------- d.d.fncSelect = @normGeomSelect; d.d.optSelect = [0.01]; % The crossover function %----------------------- d.d.fncXOver = @heuristicXover; d.d.optXOver = [40 5 ]; % The mutation function %---------------------- d.d.fncMutate = @nonUnifMutation; d.d.optMutate = [10 d.d.nG 3]; % Optimize %--------- lambda = TrajectoryOptimization( d ); disp('Costates for Genetic Algorithm') disp(lambda{1}) end %-------------------------------------- % PSS internal file version information %--------------------------------------
Case 1: Method: downhill simplex
Iteration Func-count min f(x) Procedure
0 1 2.7486
1 4 2.74563 initial simplex
2 9 2.74563 shrink
3 10 2.74563 reflect
4 11 2.74563 reflect
5 13 2.74507 expand
6 15 2.74403 expand
7 17 2.74403 contract inside
8 19 2.74403 contract inside
9 21 2.7431 expand
10 22 2.7431 reflect
11 24 2.74106 expand
12 25 2.74106 reflect
13 27 2.73724 expand
14 29 2.73705 reflect
15 30 2.73705 reflect
16 32 2.72754 expand
17 33 2.72754 reflect
18 35 2.72077 expand
19 37 2.69752 expand
20 38 2.69752 reflect
21 40 2.65726 expand
22 42 2.51974 expand
23 43 2.51974 reflect
24 45 2.23779 expand
25 47 2.13384 contract outside
26 49 2.13384 contract inside
27 51 2.13384 contract inside
28 53 2.13384 contract inside
29 55 2.13384 contract inside
30 57 2.13384 contract inside
31 59 2.13384 contract inside
32 60 2.13384 reflect
33 62 2.13384 contract inside
34 64 2.13354 contract inside
35 66 2.13238 contract outside
36 68 2.11548 expand
37 70 2.11548 contract inside
38 71 2.11548 reflect
39 72 2.11548 reflect
40 74 2.10853 expand
41 76 2.09825 expand
42 78 2.05926 expand
43 80 2.01562 expand
44 82 2.0131 reflect
45 84 1.92541 reflect
46 86 1.27801 expand
47 87 1.27801 reflect
48 89 1.27801 contract inside
49 90 1.27801 reflect
50 92 1.27801 contract inside
51 94 0.486897 reflect
52 96 0.486897 contract inside
53 97 0.486897 reflect
54 99 0.486897 contract inside
55 100 0.486897 reflect
56 102 0.486897 contract inside
57 104 0.283709 contract inside
58 105 0.283709 reflect
59 107 0.283709 contract inside
60 108 0.283709 reflect
61 109 0.283709 reflect
62 111 0.223843 reflect
63 113 0.223843 contract inside
64 115 0.223843 contract inside
65 117 0.132836 reflect
66 119 0.132836 contract outside
67 121 0.118953 contract inside
68 123 0.106716 contract inside
69 125 0.0780875 contract inside
70 127 0.0637931 contract inside
71 129 0.0637931 contract inside
72 131 0.0637931 contract inside
73 133 0.0637931 contract inside
74 135 0.0354368 expand
75 137 0.0354368 contract inside
76 139 0.0260392 contract outside
77 141 0.0260392 contract inside
78 143 0.0260392 contract inside
79 145 0.0207826 contract inside
80 150 0.0207826 shrink
81 152 0.0207826 contract outside
82 157 0.0207826 shrink
83 158 0.0207826 reflect
84 160 0.0207826 contract inside
85 162 0.0207826 contract outside
86 163 0.0207826 reflect
87 165 0.0207826 contract outside
88 167 0.0207826 contract inside
89 169 0.0207826 contract inside
90 174 0.0207826 shrink
91 179 0.0207826 shrink
92 180 0.0207826 reflect
93 182 0.0207826 contract inside
94 184 0.0207826 contract inside
95 185 0.0207826 reflect
96 187 0.0205148 expand
97 189 0.0200609 expand
98 191 0.0200609 contract inside
99 193 0.0197296 expand
100 195 0.0197296 contract inside
101 197 0.0192068 expand
102 199 0.0184014 expand
103 201 0.0184014 contract inside
104 203 0.0184014 contract inside
105 205 0.0184014 contract inside
106 206 0.0184014 reflect
107 208 0.0184014 contract inside
108 210 0.0184014 contract inside
109 212 0.0184014 contract inside
110 214 0.0184014 contract inside
111 216 0.0184014 contract inside
112 218 0.0184014 contract inside
113 220 0.0184014 contract inside
114 222 0.0184014 contract inside
115 223 0.0184014 reflect
116 225 0.0184014 contract inside
117 227 0.0184014 contract inside
118 229 0.0184014 contract inside
119 231 0.0184014 contract inside
120 233 0.0184014 contract inside
121 235 0.0184014 contract inside
122 237 0.0184014 contract inside
123 239 0.0183908 reflect
124 241 0.0183908 contract inside
125 243 0.0183908 contract inside
126 245 0.0183908 contract inside
127 247 0.0183897 reflect
128 249 0.0183897 contract inside
129 251 0.0183897 contract inside
130 253 0.0183856 reflect
131 255 0.0183856 contract inside
132 257 0.0183856 contract inside
133 258 0.0183856 reflect
134 260 0.0183856 contract inside
135 262 0.0183856 contract inside
136 264 0.0183846 reflect
137 266 0.0183846 contract inside
138 268 0.0183846 contract inside
139 270 0.0183846 contract inside
140 272 0.0183845 reflect
141 274 0.0183845 contract inside
142 276 0.0183845 contract inside
143 278 0.0183841 reflect
144 280 0.0183841 contract inside
145 282 0.018384 reflect
146 284 0.018384 contract inside
147 286 0.018384 contract inside
148 288 0.0183839 reflect
149 290 0.0183839 contract inside
150 292 0.0183839 contract inside
151 294 0.0183838 expand
152 296 0.0183837 reflect
153 298 0.0183837 contract inside
154 300 0.0183837 contract inside
155 302 0.0183837 contract inside
156 304 0.0183837 expand
157 306 0.0183837 contract inside
158 308 0.0183837 contract inside
159 310 0.0183836 reflect
160 312 0.0183836 contract inside
161 314 0.0183836 contract inside
162 316 0.0183836 contract inside
163 318 0.0183836 reflect
164 320 0.0183836 contract inside
165 322 0.0183836 reflect
166 324 0.0183836 contract inside
167 326 0.0183836 contract inside
168 328 0.0183836 contract inside
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-02
Radial position error = 696.2113 (km)
Radial velocity error = 0.0089 (km/s)
Tangential velocity error = -0.0161 (km/s)
Time of minimum error = 2.4188 years
Costates for Simplex
-0.0046295
-11610
-21033