From 9b7c5a88c47f601932c79786a7cdec73606f6cf4 Mon Sep 17 00:00:00 2001 From: FerrerFerreAlex <32134913+FerrerFerreAlex@users.noreply.github.com> Date: Fri, 25 Apr 2025 18:03:46 +0200 Subject: [PATCH 01/22] launchingWorkin --- OptimalControl/main_constraint_nodrag.m | 224 ++++++++++++++++++++++++ OptimalControl/nodrag_data.mat | Bin 0 -> 44732 bytes 2 files changed, 224 insertions(+) create mode 100644 OptimalControl/main_constraint_nodrag.m create mode 100644 OptimalControl/nodrag_data.mat diff --git a/OptimalControl/main_constraint_nodrag.m b/OptimalControl/main_constraint_nodrag.m new file mode 100644 index 0000000000..f5d1d451ee --- /dev/null +++ b/OptimalControl/main_constraint_nodrag.m @@ -0,0 +1,224 @@ +function main_constraint_nodrag + +persistent u_history J_history; +clc; close all + +% Physical constants + +g = 9.81; % m/s^2 +lb = [0 0.01]; % [m/s rad] +ub = [10 pi/2]; % [m/s rad] + +% Initial conditions + +x1_0 = 0; % m +x2_0 = 0; % m +v0 = 15; % m/s +gamma0 = deg2rad(40); % degrees +t0 = 0; % s +tf = 2; % s +u0 = [tf;gamma0]; + + +cost = @(u) f_cost(u,g,t0,v0,x1_0,x2_0); +constraint = @(u) groundConstraint(u,g,t0,v0,x1_0,x2_0); + +%Check gradients +valid = checkGradients(cost,u0) +valid = checkGradients(constraint,u0) + +% Fmincon +options = optimoptions("fmincon","OutputFcn",@store_fmincon,"Algorithm","sqp",'DerivativeCheck','on'); +[u_opt, J_opt, exitflag] = fmincon(cost,u0, ... + [],[],[],[],lb,ub,@(u) nonlcon(u,g,t0,v0,x1_0,x2_0),options); + + +% Optimal solution + +y0 = [x1_0 x2_0 v0 u_opt(2)]; +t_span = linspace(t0,u_opt(1),100); + +[~,y] = ode45(@(t,y) dynamics(y,g), t_span, y0); + +x1_opt = y(:,1); +x2_opt = y(:,2); +tf_opt = u_opt(1); +gamma0_opt = u_opt(2); + +% Postprocess + +disp(["Maximum distance [m] = ",num2str(x1_opt(end))]) +disp(["Initial angle [°]: ",num2str(rad2deg(gamma0_opt))]) +disp(["Final Time [s]: ",num2str(tf_opt)]) + +% Trajectory + +figure +plot(x1_opt,x2_opt,'b-','LineWidth',2) +xlabel("Horizontal distance [m]") +ylabel("Vertical distance [m]") +grid on + +% Evolution of u + +figure; +plot(u_history(:,1), 'b-o', 'LineWidth', 2); +xlabel('Iteration'); +ylabel('Initial velocity u [m/s]'); +grid on + +figure +plot(u_history(:,2)*180/pi, 'r-o', 'LineWidth', 2); +xlabel('Iteration'); +ylabel('Initial angle \gamma '); +grid on; + +% Evolution of cost function + +figure; +plot(J_history,'o-','LineWidth',2) +xlabel('Iteration') +ylabel('Cost function J') +grid on + +% Save results + +vars = whos; + +nodrag_results = struct(); +for i = 1:length(vars) + var_name = vars(i).name; + nodrag_results.(var_name) = eval(var_name); +end + + +function stop = store_fmincon(u,optimValues,state) + + + +if isempty(u_history) + u_history = []; + J_history = []; +end + +if optimValues.iteration == 0 + u_history = []; + J_history = []; +end + + +switch state + case 'iter' + % Save value of u for every iteration + u_history = [u_history; u(:)']; + J_history = [J_history; optimValues.fval]; +end + +% Saving in a global variable +assignin('base','u_iterations',u_history); +assignin('base','J_iterations',J_history); + +stop = false; % Don't stop the optimization + +end + + +save('nodrag_data.mat', 'nodrag_results'); + +end + + +function [c,ceq,Dc,Dceq] = nonlcon(u,g,t0,v0,x1_0,x2_0) +c = []; +Dc = []; +[ceq,Dceq] = groundConstraint(u,g,t0,v0,x1_0,x2_0); +end + + +function [J,gradJ] = f_cost(u,g,t0,v0,x1_0,x2_0) + +y0 = [x1_0 x2_0 v0 u(2)]; +t_span = linspace(t0,u(1),1000); + +[~,y] = ode45(@(t,y) dynamics(y,g), t_span, y0); + +J = -y(end,1); + +% compute q + +pT = [1 0 0 0]; + +[~,p] = ode45(@(t,p) p_ode(t,p,y,g,t_span),flip(t_span),pT); + +q = p(end,:); + +% gradient of cost function with respect to u + +dydt_final = dynamics(y(end,:)',g); + +gradJ(1,1) = -dydt_final(1); +gradJ(2,1) = -q(1,4); + +end + + +function [ceq,Dceq] = groundConstraint(u,g,t0,v0,x1_0,x2_0) + +y0 = [x1_0 x2_0 v0 u(2)]'; +t_span = linspace(t0,u(1),1000); +[~,y] = ode45(@(t,y) dynamics(y,g), t_span, y0); + +% Constraint y2(T) = 0 + +ceq = y(end,2); + + +% Derivatives + +pT = [0 -1 0 0]; + +[~,p] = ode45(@(t,p) p_ode(t,p,y,g,t_span),flip(t_span),pT); + +q = p(end,:); + +dydt_final = dynamics(y(end,:)',g); + +Dceq(1,1) = dydt_final(2); +Dceq(2,1) = -q(4); + + + +end + + +function dpdt = p_ode(t,p,y,g,t_span) + +v = interp1(t_span, y(:,3), t); % velocity at time t +gamma = interp1(t_span, y(:,4), t); + +J = [0 0 0 0; + 0 0 0 0; + cos(gamma) sin(gamma) 0 (g/v^2)*cos(gamma); + -v*sin(gamma) v*cos(gamma) -g*cos(gamma) (g/v)*sin(gamma)]; + +dpdt = -J*p; + + +end + + +function dydt = dynamics(y,g) + +% State variables +v = y(3); +gamma = y(4); + +% Dynamics equation + +dydt = zeros(4,1); +dydt(1) = v*cos(gamma); +dydt(2) = v*sin(gamma); +dydt(3) = -g*sin(gamma); +dydt(4) = -(g/v)*cos(gamma); + +end \ No newline at end of file diff --git a/OptimalControl/nodrag_data.mat b/OptimalControl/nodrag_data.mat new file mode 100644 index 0000000000000000000000000000000000000000..aef283726ffc1e4c97085bcef735319bf38f1832 GIT binary patch literal 44732 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 (tfj7;v21Ml-)2AJIWZ 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 literal 0 HcmV?d00001 From 2c8fba2283b07c050442f124bb60416bef4c3d45 Mon Sep 17 00:00:00 2001 From: FerrerFerreAlex <32134913+FerrerFerreAlex@users.noreply.github.com> Date: Fri, 25 Apr 2025 18:31:12 +0200 Subject: [PATCH 02/22] "ch" --- OptimalControl/main_constraint_nodrag.m | 312 ++++++++---------------- OptimalControl/nodrag_data.mat | Bin 44732 -> 42467 bytes 2 files changed, 106 insertions(+), 206 deletions(-) diff --git a/OptimalControl/main_constraint_nodrag.m b/OptimalControl/main_constraint_nodrag.m index f5d1d451ee..6daf4a198a 100644 --- a/OptimalControl/main_constraint_nodrag.m +++ b/OptimalControl/main_constraint_nodrag.m @@ -1,224 +1,124 @@ function main_constraint_nodrag - -persistent u_history J_history; -clc; close all - -% Physical constants - -g = 9.81; % m/s^2 -lb = [0 0.01]; % [m/s rad] -ub = [10 pi/2]; % [m/s rad] - -% Initial conditions - -x1_0 = 0; % m -x2_0 = 0; % m -v0 = 15; % m/s -gamma0 = deg2rad(40); % degrees -t0 = 0; % s -tf = 2; % s -u0 = [tf;gamma0]; - - -cost = @(u) f_cost(u,g,t0,v0,x1_0,x2_0); -constraint = @(u) groundConstraint(u,g,t0,v0,x1_0,x2_0); - -%Check gradients -valid = checkGradients(cost,u0) -valid = checkGradients(constraint,u0) - -% Fmincon -options = optimoptions("fmincon","OutputFcn",@store_fmincon,"Algorithm","sqp",'DerivativeCheck','on'); -[u_opt, J_opt, exitflag] = fmincon(cost,u0, ... - [],[],[],[],lb,ub,@(u) nonlcon(u,g,t0,v0,x1_0,x2_0),options); - - -% Optimal solution - -y0 = [x1_0 x2_0 v0 u_opt(2)]; -t_span = linspace(t0,u_opt(1),100); - -[~,y] = ode45(@(t,y) dynamics(y,g), t_span, y0); - -x1_opt = y(:,1); -x2_opt = y(:,2); -tf_opt = u_opt(1); -gamma0_opt = u_opt(2); - -% Postprocess - -disp(["Maximum distance [m] = ",num2str(x1_opt(end))]) -disp(["Initial angle [°]: ",num2str(rad2deg(gamma0_opt))]) -disp(["Final Time [s]: ",num2str(tf_opt)]) - -% Trajectory - -figure -plot(x1_opt,x2_opt,'b-','LineWidth',2) -xlabel("Horizontal distance [m]") -ylabel("Vertical distance [m]") -grid on - -% Evolution of u - -figure; -plot(u_history(:,1), 'b-o', 'LineWidth', 2); -xlabel('Iteration'); -ylabel('Initial velocity u [m/s]'); -grid on - -figure -plot(u_history(:,2)*180/pi, 'r-o', 'LineWidth', 2); -xlabel('Iteration'); -ylabel('Initial angle \gamma '); -grid on; - -% Evolution of cost function - -figure; -plot(J_history,'o-','LineWidth',2) -xlabel('Iteration') -ylabel('Cost function J') -grid on - -% Save results - -vars = whos; - -nodrag_results = struct(); -for i = 1:length(vars) - var_name = vars(i).name; - nodrag_results.(var_name) = eval(var_name); + persistent u_history J_history; + clc; close all + + g = 9.81; + lb = [0 0.01]; + ub = [10 pi/2]; + + x1_0 = 0; x2_0 = 0; v0 = 15; + gamma0 = deg2rad(40); + t0 = 0; tf = 2; + u0 = [tf; gamma0]; + + cost = @(u) f_cost(u, g, t0, v0, x1_0, x2_0); + constraint = @(u) groundConstraint(u, g, t0, v0, x1_0, x2_0); + + checkGradients(cost, u0); + checkGradients(constraint, u0); + + options = optimoptions("fmincon", ... + "OutputFcn", @store_fmincon, ... + "Algorithm", "sqp", ... + "DerivativeCheck", "on"); + + [u_opt, ~] = fmincon(cost, u0, [], [], [], [], lb, ub, @(u) nonlcon(u,constraint), options); + + y0 = [x1_0 x2_0 v0 u_opt(2)]; + t_span = linspace(t0, u_opt(1), 100); + [~, y] = ode45(@(t, y) dynamics(y, g), t_span, y0); + + disp(["Maximum distance [m] = ", num2str(y(end, 1))]) + disp(["Initial angle [°]: ", num2str(rad2deg(u_opt(2)))]) + disp(["Final Time [s]: ", num2str(u_opt(1))]) + + figure; plot(y(:,1), y(:,2), 'b-', 'LineWidth', 2); + xlabel("Horizontal distance [m]"); ylabel("Vertical distance [m]"); grid on; + + figure; plot(u_history(:,1), 'b-o', 'LineWidth', 2); + xlabel('Iteration'); ylabel('Final time [s]'); grid on; + + figure; plot(rad2deg(u_history(:,2)), 'r-o', 'LineWidth', 2); + xlabel('Iteration'); ylabel('Initial angle [°]'); grid on; + + figure; plot(J_history, 'o-', 'LineWidth', 2); + xlabel('Iteration'); ylabel('Cost function J'); grid on; + + vars = whos; + nodrag_results = struct(); + for i = 1:length(vars) + nodrag_results.(vars(i).name) = eval(vars(i).name); + end + save('nodrag_data.mat', 'nodrag_results'); + + function stop = store_fmincon(u, optimValues, state) + if optimValues.iteration == 0 + u_history = []; + J_history = []; + end + if strcmp(state, 'iter') + u_history = [u_history; u(:)']; + J_history = [J_history; optimValues.fval]; + assignin('base', 'u_iterations', u_history); + assignin('base', 'J_iterations', J_history); + end + stop = false; + end end - -function stop = store_fmincon(u,optimValues,state) - - - -if isempty(u_history) - u_history = []; - J_history = []; -end - -if optimValues.iteration == 0 - u_history = []; - J_history = []; -end - - -switch state - case 'iter' - % Save value of u for every iteration - u_history = [u_history; u(:)']; - J_history = [J_history; optimValues.fval]; -end - -% Saving in a global variable -assignin('base','u_iterations',u_history); -assignin('base','J_iterations',J_history); - -stop = false; % Don't stop the optimization - +function [c, ceq, Dc, Dceq] = nonlcon(u,constraint) + c = []; + Dc = []; + [ceq, Dceq] = constraint(u); end +function [J, gradJ] = f_cost(u, g, t0, v0, x1_0, x2_0) + y0 = [x1_0 x2_0 v0 u(2)]; + t_span = linspace(t0, u(1), 1000); + [~, y] = ode45(@(t, y) dynamics(y, g), t_span, y0); -save('nodrag_data.mat', 'nodrag_results'); - -end + J = -y(end,1); + dydt_final = dynamics(y(end,:)', g); + pT = [1 0 0 0]; + [~, p] = ode45(@(t, p) p_ode(t, p, y, g, t_span), flip(t_span), pT); + q = p(end,:); -function [c,ceq,Dc,Dceq] = nonlcon(u,g,t0,v0,x1_0,x2_0) -c = []; -Dc = []; -[ceq,Dceq] = groundConstraint(u,g,t0,v0,x1_0,x2_0); + gradJ = [-dydt_final(1); -q(4)]; end +function [ceq, Dceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0) + y0 = [x1_0 x2_0 v0 u(2)]'; + t_span = linspace(t0, u(1), 1000); + [~, y] = ode45(@(t, y) dynamics(y, g), t_span, y0); -function [J,gradJ] = f_cost(u,g,t0,v0,x1_0,x2_0) - -y0 = [x1_0 x2_0 v0 u(2)]; -t_span = linspace(t0,u(1),1000); - -[~,y] = ode45(@(t,y) dynamics(y,g), t_span, y0); - -J = -y(end,1); - -% compute q - -pT = [1 0 0 0]; - -[~,p] = ode45(@(t,p) p_ode(t,p,y,g,t_span),flip(t_span),pT); - -q = p(end,:); + ceq = y(end,2); + dydt_final = dynamics(y(end,:)', g); -% gradient of cost function with respect to u - -dydt_final = dynamics(y(end,:)',g); - -gradJ(1,1) = -dydt_final(1); -gradJ(2,1) = -q(1,4); + pT = [0 -1 0 0]; + [~, p] = ode45(@(t, p) p_ode(t, p, y, g, t_span), flip(t_span), pT); + q = p(end,:); + Dceq = [dydt_final(2); -q(4)]; end - -function [ceq,Dceq] = groundConstraint(u,g,t0,v0,x1_0,x2_0) - -y0 = [x1_0 x2_0 v0 u(2)]'; -t_span = linspace(t0,u(1),1000); -[~,y] = ode45(@(t,y) dynamics(y,g), t_span, y0); - -% Constraint y2(T) = 0 - -ceq = y(end,2); - - -% Derivatives - -pT = [0 -1 0 0]; - -[~,p] = ode45(@(t,p) p_ode(t,p,y,g,t_span),flip(t_span),pT); - -q = p(end,:); - -dydt_final = dynamics(y(end,:)',g); - -Dceq(1,1) = dydt_final(2); -Dceq(2,1) = -q(4); - - - +function dpdt = p_ode(t, p, y, g, t_span) + v = interp1(t_span, y(:,3), t); + gamma = interp1(t_span, y(:,4), t); + J = [0 0 0 0; + 0 0 0 0; + cos(gamma) sin(gamma) 0 (g/v^2)*cos(gamma); + -v*sin(gamma) v*cos(gamma) -g*cos(gamma) (g/v)*sin(gamma)]; + dpdt = -J*p; end - -function dpdt = p_ode(t,p,y,g,t_span) - -v = interp1(t_span, y(:,3), t); % velocity at time t -gamma = interp1(t_span, y(:,4), t); - -J = [0 0 0 0; - 0 0 0 0; - cos(gamma) sin(gamma) 0 (g/v^2)*cos(gamma); - -v*sin(gamma) v*cos(gamma) -g*cos(gamma) (g/v)*sin(gamma)]; - -dpdt = -J*p; - - +function dydt = dynamics(y, g) + v = y(3); + gamma = y(4); + dydt = [ + v*cos(gamma); + v*sin(gamma); + -g*sin(gamma); + -(g/v)*cos(gamma) + ]; end - - -function dydt = dynamics(y,g) - -% State variables -v = y(3); -gamma = y(4); - -% Dynamics equation - -dydt = zeros(4,1); -dydt(1) = v*cos(gamma); -dydt(2) = v*sin(gamma); -dydt(3) = -g*sin(gamma); -dydt(4) = -(g/v)*cos(gamma); - -end \ No newline at end of file diff --git a/OptimalControl/nodrag_data.mat b/OptimalControl/nodrag_data.mat index aef283726ffc1e4c97085bcef735319bf38f1832..282df573b8999413411bae313ca1e2810afdbcf0 100644 GIT binary patch delta 26264 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 I;&zh#KbXeE$^ZZW delta 28503 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�e_WhFz-;y50mr2v$plFG0yb%qYdi-Z^wxxl8g2pQO z(E~I%e4{_wH;o3Hu10OW`#lYq`zth_4b$Lqas0`AIb|5LajP?3s|=_2);%rS-z{7L>Q~LlF(2V+#QJbp*MNiINyV9cq zC&wH#dzDn-lnt96;GhchMn$fFP3KghySb}>_fu6EptdNLORK?gX{j0u8#Pdyt+V0B zL^X)@L+TG&)nNE&lf)H8b$E1Q_KzuU>cCqWGkiW<9hw3hR-PGFhufkr+{2AEKw5pi z0P~0jXdc!TFnXi`9?kgyUDBGs7j!4V+eH(4j1!+%U)6-Xz>3!&KWf5%l7xzyG5Ky3 znto5j`C%7g)uvyU^6x@&*WHxK3SB7IHh^t%zY~Sj&{%2APQ*HDV4+LtM7HcINp@Zb zQlqWLzTVh@8V)Y@3mSNdd`Fpu_7N}9Jl~fqmMOnPJXn*g0@jXPgGxe&t=dsQ)juo? zy4sL0BXrm?pbeS5N~FAh=4(R_7W}}!J?;gv8&RB{rtktiFSWL~oB13SaVkX@>OM!! z1F;v66tGcFs@^P`5gS=kI8qn*wjyJbhTi+TpP|I(g$k6NEohKsBra~(j3|r70$bKT zMYqyoxcm*9(9u0n>qq4p(fbQtV@$3Fw0G-;@HcJsXc;B=ND@|mhfV~#J4VLUqLjl) z$uD-*peXB2RYi**qZ{Ts+f4bZQB85skyRO0NKWA4LCT^^G*{DH$F!sZ-Og(1UADX& z&FHLa-dB1TeH3crbwJ-Cg&A+wIOpF+k;`{`b6XW5k-U;HmVN=E%}g1cOSy_xtdx(Q zSD%5vq`twDI|;>q*El)VZ`p_1b?%2ljd zIDXlF{Q|7#(TBZ)Rz;Y4&4`~%{%x#D_}fH$U#xV<@j*c8U5ww0iw~BUW9Rl)8bV10 zwnbw=p1i0MV<%?QaUIyMda*Uj`Kz%whDJB86AS1yosa8(#yXby<(-JD#ZJHYfbhIv z%dX6?!1IJfhz9QUa}hiPsrZ^-2}Q z>yGVMWxdybHtq$+smN{l1790fs->%lbAoA^-AKsqYQrQ1BSwa-+A-6OVXg95JI2y< zcfmQsw!V14>k#o0iy6?njB|(;Qf8*&Tw*r*C(>K~_WqO?+c461IP_yuVdw~g)NThX~BoYrk@{-0!qH#~y z&Ul|O(TT=~cR5bdPi;uf^L}u8C0cUd0Uuk?;slE1MdJ?SgZ1EcKYDVrwm3I*5WSY| z!`I)UBg&gRqX*ximvJej!RbFDO6Fj=VKxb3463i?hH^mpF=mUZ6BqP83gx+I%mXs3 z=IBU&OYwrvIV-#9K|VMcuqT4QQUGK}peQ(92tw6lyT=ZRKu7hdFvDyzBri}n=bIo3 zX8QtjaziPwS#fzuzpog)wGXOMb(#euiou=qb>h$wW%nW3SOVJQ6C|FgNy723ljloI zNr9k{?efjsv%&I=&bH{m*)X$%$KzqEG<@BEZXCp4IR{)@uAf+OO9o6lA0!2*%fjnO z>%8LFxo|7isBG-eJOE=JMuLGHWHuVYRDj1OOK$f2Dngb0%DdrxiV*F#@4l*&67-u|-z#fWf*Vppcj)VX z@bAnHi&9SfJ7D)u^U7pn8Z42{dxoyjAYrxsNQ;^>qy^B$_9ZKWb6=6Bw3G_eNrx@D zaY6+|;mB8;xmDq~aJj}%peh_ZojEspP!-r#_hxImtAUGNhr&brJscG(`W0idIwVUT zwdb!?hqL73uuID{z=Z6Qv*MNpXe1qfyVI_%2?yNVi-XfOp*Y{{irn1!z+;z_QXD%U zu6u=Cuoch(U&Nm|c1R0!wsw6NKdJ>M?~+*w2HIfbbv(4kTN|FPH#=*Xtqm`p7G4bP z)`pTtrYTR9bl}Qk)nuB34wST)C;2AmfZ$2DQo

~;3 z#ER-26nv%Ci6I;!>f!D6wV2IPTCZIQeSa_qrHoT z!Ac%@zwf3>-szd}J#VGKnPy(twsea}w-i6{4;tT2SuFrm_tP5XEJ3I}l$N(SRtRL1 zT5T-95r$V;UD{XkMSzD~k&M}rp{G`NlT9NT*n;!4HP(xQmVyaYw^S6=*Vn0e=u#lK zwZ^C=fdWfp1~vqf#GurF{v6BJK@1uNxYKqOiouz1a(|BKEC|}@yp_1GMSL;CPjY5K zz^eX&!jV}p!{}^ut&uo%n%oOi@E3=EYN|)tRdEpH^KjYTDGoas4sPa>65yy+>d#mz z0YQ=Nso%LtfJmFzsO2#Um`Stn6HS+Z`rQ?hyqE+~4sEK`dn^HegY?tUv1|#jI410@ z)*}H4IkQcMU*YSo`qhb%?`DE3v2Iu|w3K*m<51TD!Y}u62zw?TM_Puujffkmd#an* zhrKrUII-{Lz+Fp;bI_A2_=$6^@b2lb#m{LQ^1dMzKX-`1vUYh~$J?N%f`qQ(EMrST zXGd1>B|>-Gfea~sA`cabc}YZG)(oT?6L~6p9x`Zy=Z&;#Yw;mGkJ*0O$<26PyBA3& zFz`I{-sa2F!Si0Y)2K!rufv|l^F)cd^aQ!N5OtDtnwg%9*KPiTrMVV(9hELP_in=L z8j4j}mEm<}1-SKH#Or?kRP2>5oP)$xpQL!4i?qVNn^$pvPKwj2W)R$r#H{lpIHHB? z&n37TIbZ(F7b9_{qmT;L~)6Ka1`&K6PR^`br)*mcz5w-IFn+3Iv(%K>p9NDf195fq+jnll@9JnItbg`-qVXk`m;R0 zMxUR5|I78uP4oO4e*aHAf6@WJql15v4#NIf0%^)Pe+}0Fe?*VSBt3-vsm}Ipj!b79 z@M*sPcliF?Zz>&JztF*jv+cv0=6Rauzbntb_ub|t{Za>E)BW68E(}N4zX#XT|39XA z{^RfG&;7{w%$4+a`M)vE@ifPO{JlIC2d<8P9v+U`(>zb}{7aty1pom5|LmFHO2aS| z#A<_)`j$R|;0u^+L1UKMe`AF81j2F# zUz+dq$KjA-vdF_FLRSc(dp5^xUWi{lY!Q#7$%iBU-;K`)uJDNq44y zdG4j8b49!ivn=!ivZ6@4kM8`Ia(-7jzwD!X9`1Zquk$lj{P1`|%2^uie00s@v2`Dk z&Z^0i%`)ML_?peQ#B-VujM8Wwr9TPW?)y}ezZ)fgJkG)d2Xlf8nzI!RumN1lI-L)h zN0&wE>`)w|Jr3LX_JHFG-4Hph@xfzOm|0c|BkJ;I^W`^r9}~sLMEJ<2!p-zC zOE7ym2>3oFzT4Jm>OsE&9Gk~+7Y=AptU`P!o}YX69q+(%g>HyEx30@E)Men0u0XzfGrt#diE|K^9yiYp&Js{Bh;+luoWLXF2$!5sMEl+DLm`)+Nj@v?r z0}0Nk5et*};N@mS1(^ghGP3}G3mbxBkk^K=t?M4`-dh>--u7>M=r%gqB`(sN+}?A} zJ>P%+?>k@r-ri6`$OP^bP$z$c;kfgd#)Na9iQFl|@esTdO5sHmUX1-zonbAjB!tIH zD14Z3FrHpth^_wuS3}{1L-3?=p_~$7*pJ}OG=nxpuhD4(aKYF+H8Fm*V4l zue`-n-gN$f^7qAKycZ9?&+1f~6a^dfGx`7cnZ^ypBjhd~AtZOETrxI%9IVShACJ5) z59I^S%eqW`pmli_L+9^*KmUTDpNGLchRYD z&qLUs%6%-9t2NnrU6zq=I-WTA!$Xj3X5%1H=4$k5EYFsxJW8s66d4%`3DtCjVb{7R za9wT#viYW7;vUt@vojT1XEV(+n&wWz;F)XiBx&#@Y49wOABFe7%xGBA zc^t>fpu+ZcYurcWc)tP`M4WCkJ$V}ERl+H0MBSv5RXG0~d~>kGI`66Th`RuFb6#l? z^!$PNi}1vmF3XAXzc9`vP^~tZjXVFwc$eWoBh=4&?JCB-2KpDW+Hxn=VEh{RBtO}< z+*ph2+<>EhXCti%*Kgo@|G>pZ%qLIa3 zZYj=bzyhCFPrC#pApv+BGJ`LsdFb89nC4har|yK= z94(L*?;?y-f5H?TI&wI!oiNUQ5HN+$r_VHhEfxg$oJjn})9W+$zzc`KQ}v3W>*n5j z#2HTp*S$fz z_UXL=zPEXX@%3E!F8}}l|Nrb*dst1``%gEObUEqj*6oz;H;G2}n-aMcDiftT>YO^9 z&dF&Xx)91xlaxd#5}GtFN$xdmnJAeg6{095DH$R)nc=q<895j;W}fH!`@?#k-P-Hj z>%D#6&%4)Y4-yd(8PtE_A&Tzsy&SrK#-mFTT~hrs9uocQK|*@c{qna1>(3VZw0^)x z^fkra=|9utU5w7IASPY(LvsT$F^#6W$F7wKrP|TDlem7mrYJAAi+DWpA(B5Q*6Dlj zlDmE*?xpT6iO&9mpdILnpKw?NHrrGk%Zn9-vhTSK2L9sEaV1uAkDVlpa2{@dp`j)P z7CYU2lDniKDPmcIOvMlw*#m{q*+U`LaO8u&HS*9}wIy!CVFkz>tG!c@rU=tkMCRtj z(qNv>l;Tc-5>nb%S<~JXx2(oxoxNl8-B<%)lgFd*`eN3 z=1Hi7>voF;$zAF&xK%Rv@*NF-_@TuvN~U5s1U4Ms=yYZT*z+!BL}!nL$BCZ#MJc1; zOp0x3-hNl^H*aG=SAx4~$CgGJr<+3+m=l=$m7_+R&>0fU@T zy`X|f+;Or%SFVBJlbqdZo9+=kjb{#&k`IX&3uv|S+n*3yzlpO=YI#OHo&NAy%ZOfr z+|2y8hx_@xj7>6T=kxt{b*5W4JqY+M8%82vLvqp`Xg~*__ADV zrb@z#6{pAKZygN3NLAQuua|-alfMmqpe6${U3O>p&KLr8_EzIEQWk2~WaZCG844pa z?s&QWC%qUDwc z*iYlEybajzp~xkZaU9Hyav2<#6TiLH8^!4z^Ww%n6nBh`LyH#5<9XCAS)5nVK|5ER zXY0X#=>0hF=2bar7>Dxo{0xlC%qRQoFir(cF>k+OG#;c}r z5YAF(r4L#l+zS@lRvV!@EW0{d5!a(^wQ)!7gR^x-2ojQsIIY8 zrF$u=GZ_)|a1W~ct}Q7?+7J)Y?}TP-L%hg;DtLJMDB?*`R^=efo1V?H!!VEZ;;lzv zUiIv{_7o7$u00v~TQK6C*29&AwUwY_|wE=`D0ZBl%|=){}ab)TW-iC9I=vDE!I(*Tu^1)wwSO z-1S`buLHE-f;S)it^%GmeYtbKZBCjcRwZQjMIUXrKd|C`_NL`%Q5{5_$mHSOU>VWK zvE+;EoFQ7?$Zq8teny8*sdoPsk z(elcucA%I9zKE)Qes~f)PL7jjf(P9UtT~un(h8vW(f)284=jVT)K74a`O6*5b5>#; zSqrCtxM3(TFNPG+DFf)G@FR&}jQjWCSWr4xO?Yo7SWpH$N^O03qxnHfHJeY5ABG04axYDe8O<|;cQsvVqI=ziPA-b&zRy(d&-p06_O ziFQ2Q9)51yc#4Ht`*jaYHtLd>^7NwOveoLt%f*S6=_#~N9z}?Cwjso+p8uP~gVUMM zwp_=8oVe1U>sUvL$Sllvxf@yvpdN3f#h(EevLdOKtDEt@zT5-O%*Utt!<`OO1{gF8 zRGFjnU)dr}jgeOhqWVNK5`;1$e0Q8Ow!@w&#T#F)tMuqOm}tpSR3H}N8t zQ_WEP65e28{w57#_a^*KnE#M%zbFIptA7}+r+YEqk`$sG!KhbfD>hErPJ6z?S9-+U zRVO(aZq7?hq00sjZdbdDIxaMA5U!Z0(3$?acXTPPdd4ksc9az7)*<{PeIZnFBHxpN zBziMYcks@E1VugjPfr8zO*ky?H9jF$*%|Lt_3e7|Foq1FT~+mkw)*c8h%Db!hivZn zIxD%@9(_a5TB%@nw&zgn7FD3(HObJ;W9LBup9u}A?c6z6`4@8w+MMLfFVYuAImy1> zio6Zu3q_4C`#SrJcf->OTsktInu|gwxk^&*V@FHP*91e1DW~s&gyEy1wNMN)Oznv% zNyyi8z0_O=V+_ai8=4^cW@OPkVwZi^WC1HClY#D}q}h)NG&SnDexZ>2ghDd9+){hG z#GZ8N;MZRywYbDXE%pHHZ1dO9m9wn+!*OkipS%y9fr6z5zZ!e}Qg^zvk&kYdWTIDU z<@b%_`uQi?rJy6=$W0$2HBsKd5a+qi>ZyHI=5d(8>^stiuj!Wm9R(*Ng2`%eCXE2^ zM_caG@F|`n>s^<2mD(TPAk;M=8=UW+w z1L1B0=3f$A3UTpiGH!>QH3qLzPT$GfJ4yMPt%l`%@_k(d9-j1D%PrS4k$~g@^@qOcX~YaA|Y)g zs%J~htqR$h{K;-@ke0a+Zf&m;zc!t9x=<8D>RPk59m9Gy6Tw`QI!M$^fj@HYUJ6 z6T0RMyAlq+JO_~;Bis#(7k(6yFoCNXnBEE4StWx2YU+2~L3Bx0VCXO0CyQB>!|OFm zje0biOkyEQUU~Xhs@)_&40hXJ@EuC_lS0Jh7>Q#LDbvm3d&;1wR91l5gQ1ThGC6;$ zrOSAbg_;9B1Ldb7!A}ZMyZ9hTEfp<^DE56Y4`P49#cym(8bjO3(Gq9m5niv~!iGD0 z5GOW(Qz8KpI%cw>E@x@_x?N2SrS&IXpiNbT1`4}LdHv0vrppT8OLWE^kZyIhEI3G6 z_4gW*k;;hZTF$vA7S*AG`KaE!{aK7sKpfR4gBLp(khe;B@Xefaj{|`ix(5?wrz(Y2 z*JjVds(ZKhxz+JoaSFQQLVmiuGk^Mcx)TnJjlMg)ky31d`A@l9Hhpd)GQ*TaccRo* zm^uz(44O8@`MEcAY#!dOl0Y(!j`O}VGLmCwgKc-l!etu`GqEB-uJ2sUzt^r|)pO3= zETa~lOGZNI(S3(-_V{nTMqB%)FX^Gqs$4J8TN+c;XiZ9rD@-i2XKsOfDf7GRtm$2V zTY!|_<_A&8nM%+Dyp;K&+XNTVNjFilvRUVA=hpEQv=0;Bk3MJ8Vk2X z`)_QiIGN>1;0C)0|98UuDYtzN1snF*aUZAH{db>z+RL9AGWNK5rsC>;43QX>)gC(&SzUH0k~P==txG05^1Q+QnUpAeXwFDSa`lm_jW=E*e`ZA<17$G99Jk2bk*)+IS)gA4e4bOk7()`d+zG{ zN}fS16v6V&c<8XR@tE_$VT2l!dvVpAatCRjiS22{HTr(%wKE7UviDY4LZ1=f!{gAg_eNrTLu` z_>1ug2c=wCBjFM(&)Wj`kC(GSpvSddez|WygobZEpndUV)$O*503k==%GP&fd(7Mf zw>Mr0%*a1w&Clw;#tl0!$XN*5NniVm1d(i>$nQpUZ1&K#$1p}s*aRU zW1JRmkY0BYG#hNmR7d}es8@-d~XQJMeS0m`h`w!^0_Nh5R!f!epT`J?ph^B0t;UaC#Z-YxOQ;-TFl*b7} zytLRQnO{D1!%qUJ2>dkhEsjAXnj0>Tk|U(0)4$0U)0J~wal)~1N~Iof)45pqk|TZ$ z^02_^Xf#blWy?xov&Na!G+Rp}YSrw~?>S(!(^r*9RVtlw^mrL<>W)c*$x96K@1+ksDQn-I7%`>9sw>!$# zm3$QVQ)v~ez0^c_M*o0l?Z6xv1@dY6(s4Iou!>=PbSuDb{UO`kBUjvW-q*}>rk<6~ zYT79EllTI#^|(wnd%ah5`5^%ySa(j7Pm}V2={vpD^}b#|)j7kumS)9-zYZ^qf$Oy~2{xY?CtfQp`^fbOqR4mV z-%WWlKe!nKEaDd+W2oJ}Y(Ch`F9nQOhL&z3R|>FqU;T`jf7@rQ(EoPjvVZs_761hn zJU{OVJX=gDK3g27*KU3yP3$^R+7@nLgoB|VtOd1;=Yz#wuA9Ykd7a5nKVOZH z1*})n;Q4{a9^Qtd`xUfyXr zRSAQ6p1yqr+OOJKjV$c3`)S-zgnScqJx(*7s@+2||c`X|!e11^1so zwak7eJWlKgeyX?3w7c^N3Y%#AzqbW`wkR&h*pJUQhgYS5>Dd#ySGQXPui^h ztPP2Xh4|Xif)a$P;o(+%8hzikxMhx--=_0=eDzdw)l25?Qb&?GO5-Dn2<#We$D$|x zjEF7vg-Py7J8hJ;=~V0v<4^0)op58tiZlcYU25nji2CBX4 z>xo#g*V~Ive4Tpq7iuF^W>KXtz%qK!(k}RO51~Do{LQKJs_ST`e4;e_O!B|rSq0=%|Ua-TMkIn=SjtwX$!8VPm>6%&>UEk z{3i!Iwm*={!)XcJ{)~7lC@nPo>ACHh{lqB#2l;_ka&1&FKw*A06N76PrLgp4g;o*?1QGQ+ z2Djq^>Y-We5(cYP_g5COW;bkYE4_eXQ^k}8RLPdL?6~rPyMHC#aFjix{CB6QP!)1z zD%;lETBNS4{P{Flz7>3t(O9nwB)N@gB}mLR%cEYhq#EMWj;YGltp*A|uiY<#Xrc|! zDO|(L*@NDlm!KYHb8Icf^cl^3BOCh0Ppk3T06%J1z_Iy$3yO($GgYh=JNzfrwxn&} zel(BqF(~K0jk2=fb&&VhkwQpK6Vq^-y<4-z?NI1N_$r2&; z8iy<09=7i=D8Am4`~~2Vdq8^91`BteH5wJ1acye55Nt61;GUK5N)Va@$!GWX?;H=@ z6AfLlxD9kP7H(|q^t}@G@C02^Y`%uB{cD{75z7_SY|XRc{}~;*_5Sz8)K_*UmBqdS zTlBx9rlH%XqLP>}Bf}kO5pY4#?{yp>iCyvCtlrK7^0(CdIvBP@@0}#}2XKan)i!q# z4c#Q7NG7sKq!^`M-q1Q3p5~8Usmx{u3eu-<&MO#b-|Fb->F6y@rNh0Mt^8^YANEzK zRJlUAF8X2Rt><)Al?Y<3$3&avr3lNj@Mzw_jO$5TkbsNag^Ej1dt|KH=zeKGzK>Yx zuO3xe05O8+@UrjTPhtg=3g-!uE+f*_J3E#~M1INwzDq;BQ!TqXKdGt+R3#7rsK74{ zD%$ir!9D8r7$k^CuiCUW%rrKrJe#Egs;?=;f+@l6SJ79n9IDrzHF*%7bX_Uo@k!n9 zzOR%$=iA>%zg|+OL!6Y1+a-*JX07+1_ilQDS}_#=d@tV`ssr9eK(b8eeb3XQ&x0$t z02|8l^15b%)%$cZ2LZ*$z^=a-;k=H2@WvSBiwu?)5h44E@n?Q>01Lmj12*Z zckgLShy5H~{#0`?)AECDXPge4Lf&?U+#$3(Es&PUW%f7=y$S37Osq+%;+_gO>SBKD zmYY!bL8Yz}vaA|npCm1X%_(p?PC0rygC&TD>hb57OoFMr1J{Jlp;%M}`ko&b(~YW^ z^|-qiJoRlZTg(yHAt_BQl1*gIcm4oDmZ2_xo?rvvTpcKzhv~+)~I{^AJAU|@Rg9#SKUypSDx<5K#kqtC~epe-67wCCAwRnb<-36 z=)Gqe9ZK2qH~34f=2=?Wb)8H;3ru;wq8YB@8OMt;UG;3C9~+s4Lahdqi;CytZn_BM zS4{Ug6ZBTb$?`?gq?tAb&mEMA5+}BN#;3evh5~T&?t_TG`4YI*6Sf&(P#=+i9_ROK zc~?zMoR{XPC`1>5rXzh{zigfWjo$(|`NPO&iQITDxq=Yexzl0lBrEwMLA8o*ETSvL z;4Y0H46gx#jfV{*(`uM2vo;nTmF!qb@FcknZ68n%tLAC-wMY>QwepsnxLpsvc>MU% zQe^Ccl+|m3wB}>Kj*8g&PP=4iU4MPY_)E+E`xC;QkkE(D)MPz)-4GZO(63{$`LSg0 z1!Ab8rv-f@;Wdg$nDVfKa{vj$x*SvYep>Zj`@3+&A(lzLx`pX4ku_+xfXgiPrw`2W zt7t-Steu(UhF3K?X)OBhrPzZiLY-aJu!v>F_F9W>7MTyTQP{7LBkSMwXYxs3I(vr5 z7p;uka-_PPHEel3rl#yL2$`jxn?*%K*x>VADh==bVk zktEP#xmtJX5;XSK&FP2V7tTXFziTDq^#q{=Ex0Uii>_LqfYZVIuRBIhzNw)6 zPhiS-n!lZMQ1L&T)*68d zM8n`B#&3hbx1NK>s#WZ>Z!7UL=Gyyjz^c-cdpaLtG-L9-Qnyevf?R@Q*LLL|na>*mFixAx?pq%uWB6ziJ&~L(ON(@) zrcYtPdX3f5UP0uE-LPwGmi&{;KP}Z8_KSl$2^SAvVt}V#<#m5ra`swNZ5wt{Az)2S z7{7^_VZifUkh3uqv^@akj1$jl)rx^Fg#kJSP!^oyOCFoeM$W5yT4&*3uDv8+tU~DC z5E68_n@RlmB@PP$uv_hz@Ls7OvpH_FaNm+|L=F++$4kNF5@6|jSYCM?g@37t(d&n* zBZX0cSWMq|M;{U-XPR(t5nO?M6X8hjmEDjnoHlu+qS4$(CF+4iyyz!H?zAz3WMBDB zT?pM3lUsxZ>tB1pF5XaNFBT1I4KTU#kdCG3MrtH}j_(%VOTQC}Y(x|;uh22Ra&bnV zka{aR`6@X0^u>iwx#^%}nBQoO;$U)erLrGDFaUj=m%dxH-l`>mnif2?#nTqzFDR1w z=H?(FU(gEym3IM@dOcP_d>AvwnRsO{f6(VBk>1Cn<)2uV#$JH}pK_H8jnRvC2Ekv( zms=0rPwu8qH@d*nr*r0KnqTrizv zi(_g^E3xgtOiD#m_VJ2fC``n^ulDu+H%%V>boY$tu~=EcDZ2|;1G`t{8i}WzaO#O0 zy?THbmS(BJx9TgQA_+BOx*1JifV1MG8bzMii~+?Ki~$z8&HnVuf%0_*cSu1>6F%GMWzE>oo&RdhpC_G3 zWQhtyviZs@zuAVzgbi_`2-y4YOO)qC;wh_|@AI5_UgUX}PR%%21J(;|l&+Fd2z4yE zNdhkWuBUKRPVcTM-s}fIASC%6OiW#^uH}J;?uAfgeP}nH1G#tHdz|n2d)~ZhD;C3} zB+lDGGZhND`mMKkq65z2JZI=UAGxu3ghd8qe(!Y{pUwJ(#}q^yC)T{B-XqkIv%E8T zwUAV%c?3ZBJswe%fuQlT-3#kH$w+$lhh%7<)ZW`la42?9n?mQaOPj9yE*Q(IqtVZW|@oH6zwN$&)MlBxQ#=a%5>VV z4~WAd1T(QWC4h_u8sCOZL57Q6TVSA_R~z)~&<4`gGm@-b!lU zy7Xqb9^~AAu!NvsFlKI%Z8J)MUai^x3GISfD}%9l&Hs|aol%#%150s4P?S&LZeMMZ zuf`h0L%vGyO-(Gks#wt_qfD~;+mD}+Fs4cQ_bj}SfBX-o>A>HaE~)v| zSB|B|j%G`B*o;dCZ~s*;T!+KAjVu(Ur>dy(;dC6vlYPp0geth5LSQOb?H&|UAA-2@ zySTFh$N}K)MtG~$J>tH>uOYO5CQ)D6cws+j(icA_oa&{`_H?d!_Cb2A8?f4$k($}A zn^6GiF^J0^#Vn3S0;13tP(e@Nt6frE$ii&^ndQ0ELL4=xdeM)craybJ1S3!((Rxm$ z=WKbiYvT*A**xk+V1rJPcbIL~!$qe#{7$ULzyNW7fk)5+q}dqCY5-*&g|Z_3ZIh1> z&SjR3Ocv6kliNSSbPtzZjP-|hoeL7HI~BVik6Wnc^qm;ph})pz{9wFXi&c;EgvgalFDY+rp*3sk zfvX8klr&mRPbUbw?2E=<4%YyV4-Tkw|L8ElK8=FpcS;rEF7JeyRwxfjKNZJ z`uQrHJatRUsO+h)icuz->m1so z4t}`unu8%6xU=bbqcw;_p8w>u-q}4Zn;RQc4C;fZAHoZ-)5U!PUiSG{f>;{?@lU*K zl)iq;G0F==G;|bvCGc+&zl%r7ZM3%526bPb6nUfVP(++2DpQgqmLi027LUu%xtG}H z!TcIlUk`X8u;$%fKiC8EfAE6Os_J->MC=5J>_Ma=w&rpC9Q5B9u;fCdLJ*6!Bx)C~ z9E1h(^lhv|@?Q|15bh4ee*OjiKsd!nI7M5ES42luDpjek&A4QXU?b@CmRos~@n%7)&2e z&Qn0Wyu*hFSIJ1v*PLc|9Upq?7;E2rNYux3^;a?0+jl15w~T#)Ds(Y?0NJBDs~o6~ zJ~9S%lf|33{B!d950nerKS#YGy(L8YTgKL7f6K2j)fYUQUzDJDE?9Y~?S+^L(ObTx z_PO`-ls2imdO@Egu?B!HnD5Og!|Q#j+Zc{Pr*rK$;BB;b~@+n1EzVn&M4R* zf*ToaPZkg(@HzRsW^xwHx3Xba2Q%vKVSV=bE!Ji;onwFdh6B@PzIE`z;iUZ;A>V(; zuhzb`?|SM*nnHVG^F+)~BnNCv0)7q9g^pq|_lSWWa>j2TbA(-=?Kp>bX!nT7Fd9e` zqyH?+OS597hFL^76raTSML8yZcM13&a(F`c_$Ye?l(~s76=XdB1U9gYT5i$0x0^i| zcKCkb5^;F1B z7$W$99820I-;)sjZQO_ik*ES3omQZ};z8FB9m!D7-nfv@3_XS$?B6f#p9DJTcU@xp z$e7>g9wR5q#aa4^okTIAwCC|*hv?`!v*W0rWRAIw33bX)ttC`_SpLS?8%2^zHFvT7 zd(^-SThP-^p+%cF5#~X=-N%%hs{M<7UVp&>uxuD1qaCckJV?7-o43G!o%9t10ei3i z!~Z0m7dY@o7ivgUel(D^x$H*?#FG$ew0aq_I5t;rtu86%jtu^y*&zP3&qCP)&oAJ% z7uI&gLOB$o-j~JVl~b;^UtP^cl4H)Kwb=`R)=&6f#H8>llO!?b;PiG)KGA^0-VSzezfTK>nfrph%K9+^5k6-l}T3Lj?%S# z53=!!bYmbqM}Zy1yqdN|dUQtgM}~*SrIH5)*LYzIr~bav>o4CoyKRG*F`V}GO#4Vu zHFQhD(2%fk25B7OMzAd%fj$WsrAtU~GD;N^u@D@5USB0vUdFP|BK9AgiMMWTX{5Y| zzBko66iMV$%uz%H&tzE*-GW{8Rod=Js`z8r9|@XlxupJ zAeT(_TUdT~@w^ok;d4C$Ruh&Xegaoo?a6f%3y*N|eC<`HObLgd19r*0?=~OjtgZa- zAE!&4*sA;Enduoxrlk=a=H4>cZIDYP8K4EG5_K$Lg^z{JC0!~8K0+3jsa5f9@RHM?X zecHd8%#Dml7JN1b}!;Z372L{E`THU-GQRZw*g>5OguGx~4 zpl*|rXG3gHY~V-D!Z|~cXF=0Cmr6G2q~ne(>S!)Tga?C89IYLW(kJhnPSH}Y1l{aN za#U=Qn(N^H)jlVT;=3X{oqEXxIKVIWSUz54CbFxd&E&Qczv9DfGd*XSYcOpsch@9A zp(*pgJxxNN<@st@BCqhqrqHxiTnQfc)c31Q*nHt3{3MA^wH_wu85 z^22ja>)PmE2{uM`XXwRxUe4zRdx6)z&=bj?y||WJ5;Y`j=r+@4U9|2uxrATrYtmfB?x;X59^gtcfrD>TzO?;2oQNj|-!Vo*? zdTT|$1d3a@xj%9pedRZie!iw3bB>>bcn+#bMEbJfdB^?~^SAh`ghc*(rPgvTeV?BM z0&nC-Fh{nU(E2i5G}zkH`w$xsWaeASUffl3vj3=1&JbDD?ZBo01CuX^LC=qnA=V(qt_1(%aN)StlmF?cQ$U`#*MsR`#Vi{jfi&pf1+O7@t5qhxgOVKOsAw!3w$IIkjObwzD@9(tT zg%iEtIniI9oop&Pw{a8Yt0`D`609kJ6+As+0sqC?GPayI_^|s<3&+<>nVyoZ$HjsJ ze_Sp{ns41}n0{2w?Z8N4HO{RKEU{X*mQR6~wep0m^nhkp^XT-s=%%y1`?x3(5f43j z3KAf)rNcxUVP(VLJ%!W!)xvD#P$oSoC3@b@&i<|b=b+86It8t0wWmQ#$0Q$%VSp~8 zT7E2zU~(<-N$IF$JE03*$MRiTW_<+I5F)?`sz`2_k7qdbKio8)6|6y>(cKe;Lf5{7 zf(`=-j}VB%W7KW#KW40geC`>&i__Ie$M!Tn!!h;0+#UMQg|!}Cw=nzIENEChpR?~> z`iZ3a|9p4ovd$;umacqh{8=nX3h0#D)LrwQ$ji`-Fye(VG@x0mpm_Ax>D;X8Sj*Wp z*7@g)PB8pT!K*FKdEZ&BpL^vak}BK~@j%qA@O7l>=A*jhTCdf0$MLmB#MAfR1J2op zj)P6|k2OmXGqG%#hiV*NCcfjnv??X_k%KXkz(=k zZVXrTpP$`-u102@3>>xpH7P*LaDOqMxwguMop<}DL5b9gG2__ROe*S~2`*N4(PW7) zVVkcu_XWi_bAGYF)f4ICDDWOyZkhW?u4poBJ8n7QdYHoP|Xl#q%iS+ zSEF$;COe%KPvgxjr{PwHT`I7~ebKlP6f*n=K;~WUs?qpX3i;YPQTp{QdUe0pO6ZE) z?nwLbr*fJK*;%B6Kv95koz))GTo@!&&iIZbpb{V9ckl{9f0muK@ygfxC*ux)Q`BZ) z&`jRdyF8KuIDRI+Rmin@gQ$Iy512xBz`ln6Ma9PR#Fx|-dsZRr;`Gcygi48E>3pkX5nr`3y3t6H` z_5Lm{ZpifKFHl?+)`eldJ-rwa)2eu}Q}aoFc=C$vQy1I*>$XkvYQrCAgDcuj0n|jWjTfQZXYk~Gyj>rAn50ssH7W!4PFKXHhh9qS|qUMev zByz%77nbS(>Hp~wX zmx>aP(H<~GzG-)am+;)Q%2;F`Dhrp~UQPvcY6EX}mEXPzKS0NkFUDSpA~Gj#fX|n0 zr@%80em2;?G<=-FsR9IgEy$a8a}q%KIFEw?jpx%h5UcAF9A(_cWjctnwp;hc_eU?u zE0NXYsn$dVr9AnGFHI zXc1;Tl?dZgCh&TwCNlkSzi~l$)K{F!FxqP>BPHE-OaT0%P{^A zc#>h7!?6rhT)NxOTC@P>Nx^=+9B{l`_;D}Lm+(MpxtAj9Hb4VaR^0dn5K%KJ U+Vrj)HmumcZM( Date: Sat, 26 Apr 2025 05:22:31 +0200 Subject: [PATCH 03/22] Ejemplo Drag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Creación de otro script para probar un ejemplo en el que se añade un Drag en función del ángulo de ataque, que será el control. --- OptimalControl/drag/drag_data.mat | Bin 0 -> 42849 bytes OptimalControl/drag/main_constraint_drag.m | 150 +++++++++++ OptimalControl/drag/nodrag_data.mat | Bin 0 -> 43037 bytes .../{ => nodrag}/main_constraint_nodrag.m | 248 +++++++++--------- OptimalControl/nodrag/nodrag_data.mat | Bin 0 -> 42863 bytes OptimalControl/nodrag_data.mat | Bin 42467 -> 0 bytes 6 files changed, 274 insertions(+), 124 deletions(-) create mode 100644 OptimalControl/drag/drag_data.mat create mode 100644 OptimalControl/drag/main_constraint_drag.m create mode 100644 OptimalControl/drag/nodrag_data.mat rename OptimalControl/{ => nodrag}/main_constraint_nodrag.m (96%) create mode 100644 OptimalControl/nodrag/nodrag_data.mat delete mode 100644 OptimalControl/nodrag_data.mat diff --git a/OptimalControl/drag/drag_data.mat b/OptimalControl/drag/drag_data.mat new file mode 100644 index 0000000000000000000000000000000000000000..cb06a5c2390552258a057bde209f54c2f82b836a GIT binary patch literal 42849 zcma&MWmFwJur5r|0!53v6?b=vLvbtaR@@yn#ogWAt+>0pySwWKHoEtH&v)+q|7B%n zCHaw+C&`+bXA%Wbb$L-SGA?FTG6hj}CJQTDb4D^{TVq!X2WLBeGG%d1Sw(J6Mlx|{ zb7NO?GcpHzelj&VL}@Sp~HJTA3J7 zP@dV>T3);wHk*bgVxdgp$x{QrzYb^RcA}>gD5{o4HZTVa?g&J%9qX+taW0r#R z7T=iw_pfq|2+=MnD3b!I=~ENk_RJ*^*N^HgI`Bx9y(``+34>|yt&c;tPjHJ9^ZG2w z0pLc~-@E7|=Jc~$B$o~B88I(YoBYz7o74ve6SemS-R7MedFDVG6`WBeOxs;DZfu}= zi6XCmviO6bJSY&?#7Ni zQeho^p|`YuA>+x{{iNCSLgfaY2z(mlTN<@l;HB;GTs?fuFr%FW`|a}O&*U6`f;^Lp zPbQ`B*$2LlpxlE7q(pXLr*@fajU4^(Z8e>@mv?h6qwMxztAEsnkDl3?>Dll06$ykI zI+L8$*uyRcHu*yHirOjxSwNmT=-Xj4%SCmoMM;|BiUuT16KKAJvoCCbv37y1K~!U> zK&fBwRx}TU?nI+&5eHb(Svz>y6!v(0G^K*^Im-qKsle**|F*;8*$o z#4I+T+}P6i6b}5`%7A6IhYC9%qR4LtF#WC_T(;-G-1Nrtk{aa*JRB=`Ni==FM^Ck# zzD`R3%C3>#gj}xaB|cY6uV=ARql#XE-Y8C;2M3W1{%a9de0PRe_(l>aBpO8-K1&UPqDJ`IDK( z%MP%UkpOqR#xrW<;&^rj7|SOz!1QXHoo=u3z2mbn=MxfdX=VGeoWzym{UxX8@34`N zZ;vg64)9ve{hMd^AS{i*uQtfn-+#vC8_O?WLoZSNEW)a6f3d+&t7QD-t(&Ag+3C7M z8r#!MY$2YCC%q*e7l){e{?4V-S6cQYjl6sfnQNbLGdDYi5_^%-XWSx7RCc@6$Fik% zOBvB$|1!#M`P{%i9vIK9#@gQ_8`L5fp1GDnuNaE1xUEr0ab;gTDPJjdejuhP0L!pNwpd zV#cTw#gy}C_U?bYQPbyIP(fU*^#*B9hcsDuH>HNxW8Kqb ze^*3w7ajP8snSSm+&S;6IeFxdOyhM1t&0xt1_WxmXlbYk&=KXxtnsD4zF5(Olp+7v z&@;$tEQ%Uf4zZXzzY`F7hY7ib>8KG0$^H5Kxql@kLi@sAnAAzvwOuayQtU9cK!W6f zwlQaTd^ou)w|^^nsDtJETko>O^Cdhswf4?n50r3lNLh$W^1z?=py(_WbYTOTcN$@ zp&QM}QNx7TL&jEJ!Cn<#aHumQj6RDVIOf0&eI4Jtjq2^2>IZ6}b@T62yjSwbQ*ta; zl|{a$Kj8<2FgssAUB&y1(mlSBgbL0Jk;e72Lhy!aP4$&O|MokQc=lzG7iJj^!tA<` zdew^n>SBaOqdx0rVk*^GJ9a)lc-({kiL3}fRNNz5>-dd)Q*kTT0}PCb@v;|__$ph& z5l(t&+W?_`H2k`c95WbQlmOhBv}-~BTI`5AjP!@e1M1|4yKdtcF%HZd3A#l3>9cs{ zw?V+MMN{(a#3|V4KKA9a%pKg*Qx%Y18#4I!f#y-j>-#9!;|b(5YaR)H;%l$~#`Sk< zJR%!iMPin*9>`-1AZ>^DK*uQMkLR-bM18x*G1-Zo+4Tf4Ff<@)qg9;@xC;1RM zg$t6L=)5p20pi=I9VYS%Y+utgocS0Mac3kO8JYxN3fg#8?}9VP?wHl*($WYKFlAAh z5jsbLY|h?<1|%tz*OAvTEUEkSuIZ*f_YWM)jvSL^J78_O)Mb%=#lvD9L6x(@LJFCc^Kz-C^@L-~8+axk*8I$u`#v8_0gjWqjLK57@@JEk zVdiH%Qqy#nPmz!ewvJxS&2Ur20LrdHhz^N$zG*u<1W-W`u5{6J*epT(hs52>7qm=% zyDBL;I?cKF@1x|Gt2WF84xwN5+)8klGE0TRC|7?gldh(LJ%M0iT&9oTE$3Wt4#XL2 zF7Q`9v^PkK36C_b)bpPla$(x3(t_z9nCZKki9>ojb z%jt76vi+R;JzV}|8tL7N)kQd6!;zYBj*h>E%`@t%*{Gq+_;jr%WrO*Umb@GZi#{f* z>=jaBnBSjkt{|D+Z{a;O{R-(N2vXoqN?qtjGN+0sl_b|fe;1&HStE%pQ;UpONhw;t zQgf_L+xcMsTcD{Z;+t~kEXZ?5&TmbR=Q0{=8mh(lx?yFF;BWb)mzXBJkA&*JcoHIMRc4d?PkdaJb#XqkxpDsT>`X4A0WuMwu%>^KU{yYD*L6~tw9m)=Du z2hq75)`ifsZNDP#@Bwj?2?oAD=OQ*NNX0`gBAP&$l&t3t8f}=Su)hs_l3#BL`|q*g zGbcS``sX@w00UEa&jP#LXWzI(QCA|?9oO;7A>&3z0A8@C?M$PFB(3lH3$nEd_Sr>I zPS`OjCmGtghAgPv?u^Usjq?6Q(Uqswe+2wyUu>MUs4miu#^$oDOM||v2I|awk|cu1 z@CVc&3t$J~NVH#8SA4TiIU7oVkMhvXIJ{(U2Uy{AW;CnfzxYEI~PbjTT;jY`^oq zB|y<$^=Btz=D+7sEKlm@WeXX_U{^J5pNAa<*7S`xdQ%EBdgfk7;GqP1=I`#y_6p9e zuC0?gObV2772K8V4qB8`WX(Ev`(*fj1JhH<2KKuOKY=VhLwMmH0d)UWO?cO9j?Jqg zb27cQY&tI~_?C=~@Yq4~eCnRF=czJwWlQ=dh87)oyiPGq>(;TK47MB>UNkTTx|*~J zpVw7lkw^TyudJrdhO@99%wDxDqI)6e#%08vX3`r>N-K3#pH%veh%}$V93`_9hkq9N zg`48T<%a(~#(c*(J)s7V(nPdHE#j3-z{U>Snj2uQ8V%7QV_HIx>&-AhZlpA9i3pp~ zeqpi(AF;W4vJXe~r&5d7fvpuJFUO97(tf{<_4xWPr~5)-5M?%6*FzDwkO&!g7JC3`T~ zILcU%I3ttJ2k&8s;re(0iw&t<*&&O$2Bu;>+dyZn;@FQ><~*5;2}=5IxUV@(ZEp2J zl4mz7Z&$+u!Kg)pgMW&dSu$Jj!Aa7n_=#xigg3sxQm zC7u-vZ(J1)hSKLnf9n~m_{O1@-{j5ZW!J*+F$^oBA<(CQJ2YApi*WUEoB2!IorT8*`4xb6v1#5f%eJq9wD91uk z*4V6kuyBy)*rDez+U@-eNH&Wt1;{6Ei+=r{Bu|I zz>^rmc2R22BpXGJ!in7{XIpmbM@f(x5h4j@J;MbRi-t%cZ(^D4IkaUWPp{gOH&q-z z587yA7e8|Y{SU8LWW&0yki8rln{79CG%4+V-i$QD95K0Z!HTOJ;a?{T8-d!gC-dH# zXkk+}uu(2CQ^5JlL~pa5_SuY{VpL`8=sjmK+-*xYewiFsnn#=X4#YEbf6)tC+2q^C zT9a#?^Wqu2LVM@pnd zyHPy}ORwj@A|zBnZrPn&M?$pgFZrf_WI&VeXPwj9V!3fy%Hw+l$j;;ne`HLD)e%#u zmuMz^h3ev8a@IIAydt;5q0KCrS@XFlMyT92l)x-ZUVN` z^gx{XpKJ$XdW~OR|5>rqdkUGfMI+xjl}nqeVE$B$laLtAM}#sPeJm8e`U_Jt-AM(WyXB`v=tFI;eHY&NtSHVQljOuz#x* zlcDWyaMb_dJXw)i`l>+|dQ;-Gz`TrNUzL=E$*KiXMq=ed$kzdsoyxMQ%D$#1YdnbTje=HqT46N&fyxYZP%T#Mam zxsr34UW*Nq`yJfV$JS-KiPmAwqUMzOx^73%6y=#R+o_!uQ@dZl9EVqky5451-p~tL z))VBn+#u(1#dT;ENF>bkKyzsSj}SI6_7yeEEbc$U_)cVeql;LVb%L*<_I2#rb~1F==Vu-MC?WSP`lrMg}bD`AJ_O5$`Mp~C*>3s zc2T(DjIJyuPR$zH8v`r`A2|HId_ z5W3*IV3-ocv$Y!W%p&;8uT@;AcEIC3h20=-HH*}l+%Bvw+N%`utv4O+n87U36|; zR5El}xx6&=;k*~*oBNT57j|i=ttd3}KHH!U`L<%t2a;9PJ)~XXom4)DT71WJOT)Bd z1ZG~A;ps0e*h|<>b7pQ}QC3zdOv>9>QPfJPSH^X|Nd(#HTv*s!05Q2t)D+}7C`#*P znlWP&J_M@9UB!kf#^^L@G{17I)nn@vpIuuA zTHs&T!|6L|6vyxt6~L9&>O^9wB%z|%MFKryaTc$FIikXMa_9JoLe?uKvAR_nH!W=D z%dI)rQZ1UO6WXuYmKP|#7;KkHrSgxlFIRG#I_aF@$TVnvXG^q~jl-{rw4kyjG3nke z)sZdgbg$X+h}LP+S$6Y)AGc}~cf>XzS~bxwJ)H`Yf6kGo%ViBvh+?Z+%rH>buhy|Z zi&BGgsY0S|f*UpJsaCLv8NRMH%Y4)fjc?4q6-I6+Lvz%Lh(|#3ijPM?_G*ilMr;=w zGYt_`96JorqdSsqdi^n5GAGhx7?MqQ^o`sSnNMykMXVO{!HirwWQ*d+p4^b>$R_wB zI^GcTfk6zQId+Tus!Lv{)VR}jqkCa0WKp_LgXI4xigStg+30gOd)`laX&5`Y`_5P} zYnHWSS9Uqe`PjZy>`(H3g5)P$(u3<~2th*Jb$t__OY?eXr8!+rv-1+$ zMYHw9cAUh0W9491B;R~P^269P%Qk6|_498TcVjRntc5ud^AkCnbi13K28fBo+o>8( zv_KcI98$0LX5+V`2CY#)1+7z$@&(&D8-_Y3fd|tOkv|<<_TTpOlu2(y4cA~U4Jg~j z-SEcSO8{7#NBq$iS&wx_S$bh?wn=X6sdl_zinF4gHUvNav&ol3UWB(pAG{}+e3naJ z!BKjww_h#BM80)JJy>rKUfF&1M|^wdSGUA<5++ z<0-1jZ)gVIyT55RbL_?Hyz12(q|vcr4`rphhb z+>ISQcy2wdZ~G*sC|jmBHeCObYby=Zrf0eN3+y6e(s!F{AqA4GeX zp2B0(aJ3|DUVYO_jYUx2-EbZdeg0kg?1k<34V7|kQR$ZNOM`NuV@>!JYlM~AwLx3UNhhG2M^XpdWP`*CtgT1jkvVsA-HtB zvj(Mmf<7s$aKK*pSHrLmho9i)c!28sARg(_ zj6mq_^1eX$?hN~0dV{qL`(JuP@BPL58y|_`W*0z$fa+0FG6?(_gz^Xy!T0g;&H246CK13i4ZxQBdu(apcT1*8H$k%RqX?>vs3>pB%jkes@1(CwBXx?8uH zsK+uY` zgWu!-C|knaoY&iDgkH!fmab+d(_)j5k5~*ts!0~kYlE>(XyyAW7#<1=0=d%OwlS5& z$}1+-nKzdlszK}c_tnl$PUkmzf&E6470l-tx81oonPOu5`PGhqivUNf-OoGOIfN$- zzj#03GOn?t?~@@q#yuLk@viTa{7v_HchZ(ZQs@nZkYke1%$CbZHizZRr-F%Bbt$c7 z3gy%Vwth@bbg@T!vjhBOqS4mfA zx^|bYBvWSwiMtwGC!M-f(78EGx5=9x%eJ_~H^yFqyLU%zQ3GX}%5zMtAIJmIh>8{b zh1G?}*tk`ct`o!J=Lb5EY}c#Cah^ALughIcJMCFH52ZD~V&u4vr@1XOES{-2d|H$P z;)Z`&bl8b(4uXS?4T0%SE3R!clmNiW;7owAG*B7gJ@Koy@F2|+(=BTQ{TU)%-9zRn zdTASDom%t0#$<`w)Pz87A!>_DHeLU9LlAiY*Gw^{V;Oz)DxCe4K=&nCak+>w5g|sm z=C^JqtU8$K-3JGVy!6PxX;ZguLdP%s=Y`O2<7v{7(rdq*i@MrTXaHtyC=Pwj`1j9( zDunY3L}1xYTQlWwa}H8hZ0vvGJG&_d-Y=Kc*! zD<@l0J|$eo>O$iuyq(KRCE1j^5u;Lsep)#hidTaaYqtR}9;+o3%B*(DLbKDNXK^QI z@$c@E#ND`xJ>fUNRAJfbsT{2VTIT4#PNlJIs*3}6dpvhev}IY?W0RRAt1p*f34C{EjVBAq{h#W?DgFwkuB?e2ls>2a(jRy>{^uDxr<2$K%6cJc zlUHI*JB6>=G9ue`u8tnW%6r|UKc^L`BGm86PrpbB3m z?klSr9jyiRRMIBgh7Mr+wI%Go9@Ag0m(hSi6Y8pNa4lItVM#mRURb0toiKj||DwfU zDv;<4#$@~cD_DURgRem1E*SIvzm763hGc;RSqNr5)~_K2u*{ypsEmhl2&NPEui)Rb z82SYge?uP0AFz0i;Vt#DA#HQ2yJV{FlQAMorSW?tqhB{U#G|52lQ<}%G>073xvJIHy5bm8z%i|ztVJ4e!T-d0~8 z2n-DlC&~9FuQb!%{Rck*MxS~9uh*bnVX)~r#k(!hFtFm)8X4c97S-oEZGNq*sN9Ld%Jukc&PMc&ixfZ*RzpNqV3PZf?%}2kt|RINWo{y1j110 za0f8)XMgHFEYt4Sk`yc`CG*=CXnp)nqU-WbFW`-+(2qijVh{CFXE9#CN&2UtNPr90 zifnnU^Ss~Ofm4?WagibQkEQ}BDCp{xP>P0R41 zJ+S8+`1r{U|MoA@{P|cfg<)>Ux0*>ft*~JN*V|F=Ov(ITw76r(vG$E)ptOFAdUzS^ z%&!!`gAwpJi55>VRGKuxC!yhS%xWRerx$4U^x#+&w$9SR9+Llg7)%ckLAwyi>RtK$#m}>U_$>2 zj{DkD^cXf=s6GQ1(l-TjAvxI}^{CreCcP)z{mgTu!lFv4M0S7ULuBqLYE}a$rGtlZY2*yGz3qi#3Gu`Sp{`*}N2rha>g6 zowX_4IxF^97gUOe`x^<@-`?n6@a|+^^wwgE_+zWsJ5b;Os>N;oke$X|pO^z%IMF+G z1C&G6mV#UNV>hxoJ0SI|n1J4KI!osySgIMjw`a%hN8gWB|&|3!tKv&x5XQLErmc;PniQ;%xO zAWIc~zu9!T^0Wg(yD9V3y6MDlObk}Pe4;DSic>JrjQP7}b^NNt&frg@U}z1d(-CMDFre=UAdap+ z$8?ZXNMi^iucOmsHdM_pm!TdjFmNpIz%dPH8lFkDLVGp1;G6ZjnRV(H>6saA5c&U( zT6Y*O&MfCgn%(Y=;HO@kh9FSgBDZ2nE&27gVBD$}xVxy}mT=@FwVq|wBT(NIoJ;bZ z-XMT+@S#MPMDXJEHRTq?n0+4&-@oy|k|ST%x$GSRnCt@m9@=g_sJ!0{3gV&43ynuf zl--h=_`9fg- z*YPPi5OHC7Br5!h(t%4z4SZ26CgCn9kzEoGQSW%olR?yOusSm?851~MZ+qHM+e|V; z#w6l(go?PZAY|ML%`?fY_G`srMJN=VAMbJ z!7$qG2*GCzEeP6ka1IR_YKk(}qhP4>k39mP$Ir59Q>`+2nX9jJ+b8v>HT|FM#4?w( zQoPEyjcpQ>+D~)1BY6)T7RH!^GSsqJ@aNZ8g%BE^m~(i z{$%Fo?5F!)`fdlMzG)_bpHL|8lKch1G1?1Jad8xtsx^_F2aaAG6;X8Pp!{pKOtK@# z5$z_9J9#~dCQfm5!REL1AcguV+Cy?*bhUL%Ln*Oh$MV=MTTfFl!IhpA(n>oTTYdUP8d%vfvddqsT_gVfQU(r! z@l`E}CUeeULKJxw2QIiROD#kRK*y!GV(Yn;$XJ!4I2c%Mp@^x|TqmLO*hJ=>Hj=b| z-|S-H)Za^;7{n_K?9{p7>7atMCq|DsXQZnsGI|e~FljZ*%NQegkBMpL_$9OC#R>}s zn(TRr_@X-+<2&+N==A#RJBB}@#t|`r^StXuEYaMUCnWd zLX+JY@{I^(R4tTw#PQ3|mN?Q}XGY&m(~sD@g6{`zRbhU(OkK<^2f^npi#t}WbS`|= zh8Xm!e>QE5E`sqnC*KI_A8j%z$P)-B{FlW6lZmTMk!Aeejw;(>oojWK-6jUaSSoJ0 ze4^shu8O&x}DqtCB}@mikbR!oGf3hNf^p zn^`o0I4P!F=|x9BlG)GhmGjGdf!a(9YZEN1xpMNJ8#~e1Cvr)>%*az9Z!Qf2TC2@m z*HddAm)vug4Dhu2IIgsenuZ4R=Fxao^nSeK#`=QlG!lGbUNPEcS?$E7kkJL@msf5h zp;dC;l%jTB%4|DoKp<{b*z>tIbtiRtcfATL83pxp-8Ws* zT7idV6^cUb%L&UkJ&&dZyiUF9K3-$Z>q?hvXW{5e%jWNGflvB!b)|%ky}WMYl+pLa zI}D45_a9fFIsfg2y7P*0L?H=wptKMJR`Fhi4RhNkmE3_cUvt=dH8-19{2|jpw}vhMSs&7n!Cunl zo>`Z;n2Sv9hgUB-gT<(HlL*(0?@kiL#WwlazATGiR*Q2&xp`b{C15TtgRt|z)vF~~ zH@NRr$Unce3IYhbub~Z!xgGQeYWGiK$|_zg9xgTho9Bcg*xV%vW2gX0)FOM~`Mv!2 zS`AZH59d37fc!?9B_x)9Rr}z%;YXcSXHSmgtd(3`sRCD*8&%{Cr2CG~@|+K$aHCx# z7yI>k;gT=bb?4P?Rap0)-^mjYRo998dMyd?S@};3dkX_q2o!7lkt`MJDT{K|Qb`oD zAn2Rl1qROj|6iD+wD~__4m9yUlrNijo95Uw%=yF~!8NXA{pITMZ5`(}_eX2Fhfv22 zm%;y=Bc#>({&!ecQMeVocG(4R$K~kS>@Jm&WMedDcF)H9 zOBiSVMhtN1AYUJZ7?g>L0v})l$<-!mx>ON=rtPd|!dgBJIGvD-TJwo7cKJx4=V|3-0#xM3eEY02zcbJlY`Vns-MH{Y z7hH-|t`(tQDDHEku=jc+c0sUO96ce19Lh|}pe^u%JXg}sR3A>Z>zAZ*9L4g!!bhf) zJI1OJIN-fxbyb6>bp@NIee2>InCcUvQk5&kSZT$4=J^z4` z{FAwtH^Zu1y&k+1pAn*P9Gu1o_oF*&XCG{Ic$8K{AWr(}7cXWPo;arkE7RkzYQOfe zFtbBm0Jm#vuZ_<;iaSrXb8*gJb<}oH!#?pf^%`6snukR=Y1ADgE+r&8%ZRSH^)^YuE9@8zO`T7IjP zw_-IZyk+L$T$(GTfw+TsI0mxr2UyrW{7g6O+5UX*JtRrvL_P25HK#t0=OB(7Cx~;p zR7$n)`VZLXZqX#Bh)fWEr}NS$y*~Fy`=6aE5<9TD(A$0t$j|CYfvjyVP+)o1>M2!y zuDFLA@d&vDstz73=n4T|(S$x(YSSPqALW?easPM8cutSYXjvnVZ@DUJRgI>NKc1sn zM+Lk@9J-zrxD5%FzHXW~O$UKzMkG%yq&*u+f>Pb_L5ar*8{6z`CH4wcRf#}ba*JpZ zk=~P-(SkPEWw(>R?~F()z{P`l<*sqL6(32LWy7L}7bp7TwU4t_xsheJUbTYaY02^m zQht|(XY6~AK=z=ho0)TAw@)9booL-vp4;>?k7)*y%YFSz)OqV;Z&I$wf0w+F|Cc4oDg`N6-c-r!j33D&Emnt%1_|HjU zngni47-*h)TIfd*1WK#h0-w@-Pd)Mj7Bg^TD z*=&~M7xo&GbK?UjN3PzYz&4TAk0xSKS)<8IV-_QIXQ?ijnGS?%C5|nS5&tcrQ8vi! z0TLvUAoC#rcgUB&;px>CRE!pOU@_uj|5B$7u5h@hyRLb85FhkxNr<*PJRWvgjg;Pe zKT39D6i8r*PfpK`v;|0df*1wuM2h}N#uHM|IwF5(46`5F_!HXYyCK?NMPnO3?DeJc zzM)c>q$r?k!rK-n8kBHcb`3LhkDvVVEdoPPMM${OvB@vIBJoda%pkgx1k4dqL`RbE z?BHhOU6YVDn*1_OzQpXJ8}*JubT6hpUcT&q9}U6XiqvJm6I~C#Vy=15Q+NYP%bwEN z#0i;7r8hPAf9d9W{CNzBJ1YyW;7s4@PG-Zeu7AbWD4h+7Ff?*eDeZ=6RtBw2y$uL1 z=%+1-yZMGB=8rYU>Q@k*@X|lDsz=Z`>^o82w%L#zeY?p*>p z;>E{#W$Y@|u@Z)0jpN`kIlLDFniM9^_i%sjG<`nS`wy+tg(Xy}h6h6y!S`|RN*{*L z?jVwuiSta3&`T&0nmF^1%!u7dsb)by;u=eISFsng^O|IzpcvP5J)vK-g0XkuZJukv z)n5QT*GQVHUN7#{DIr7e2G0I!T;`@_W$FjkB60Ut_s?6-BA+_a-gUaN(<+>vmICXG zFpNt?%9$wW?7o5dXIGM!M79MJ7?IM7*$zx;`sMZE&&jHnAeH^yIQ6Ov$X3)6;5$(j zf#*DJPsjT<<0ISguWjMWZ*XZ*3$?4xvAyf0)dVi%vAsK~^RnN|3Yci{{rA0Hul%%kjTkE>MiS3nV!D?8L?lw3! z5vPsYJuLyiP-;9m9{MDD6Nzc%iDi=G91?V~z!?-!oc~|zE-hKxPg%#{lJpvq0Go?6 z=9A9_dDr8!)Mq)#ONiQkoACQ{!QRE^AIFQZ#q)Ek0A-iOmz^$=jt=IM-WtxGygduI z`K{53yN%e>TbqlxnNxo5@5DX;Ik#$U*1Wiy4{P1?HSrqLM3Ay}b~`{{Ut~e(`1wNW1^*mW_8qLm`c|-wshU$dLEVCsd=vZuTeS}@i<+2YbP1} zObRcl7P6Z;b?I>#udvje*TGnYb6Vf1(z7|JjI6@*@5y$Apj?BWv}zZi{0f3$^!m#c z1Z7^(9R%PUyuLZC5BwW0*;&NuE;J5H2E~W*Mm;mxybZ&C2A1{`m`2wn)iplUOLwy3 z;Q=$-c+JkfQa{w|@Wxo$c*5P!v{=MVBJ3Kb6aP{=n zA#pf0!C}eM{3d*EvJxn1`|n$4lbn>VUjq%WYSiyHz|iH44xm&${?3H|uCQroM%#Gj zKmAW_f=L2BOjlvax*rM?cjmk`R})gTdyMs2{gj*vY5fmhmG^_#R6^YQV7~5V{sQLW*8+JKQDoiMGTN|jACJt)lAbU3B z)NV$dA&&!Bz%mwCc{rsOXT@s+ADe706p3KLnm(avakJ2H96y3qUQh4PqSxX^Pb zyFzGm!7=gTRsWE~^*9|5+tna!#jAQSY4_g7AS{#kmqThBE3OebBR8|v^CfS{T2Mb& z&T=&fP?|K92Bs6rlf>pg}e*~a%fk?(<7Y_8z-4ju7;KS=tC4%*fb&|p6 z8gJ-0?Z=7w9UdQk5>3_0d|%>y5dD-=dAi zfcNFhix<9weF@H3)MXeHQ>}BZkXe}tn2V^2Mk+|8Q~i-B>Jm&TH<{`I_+M!i<#wI+ ztTvMk=i$ZuL?UjfP%l`8^ra;k6d?H+aFP6}os4Iz}8VMHspRuVYd&lI6l=35lT~&EiZg8#)DOvkId!qhqmOk+v@*Z zr`SfciWw>K;#55Xf;xzHH|+GCd_~BW><9tdWEY$zpxChCGCj_+RtY>*ib?6e*gMr) zXCSPS?vg@v=-&^BY2OPA2v5ddEhCD(b?g&v-xXqlwTTG8om?Qq5v2{2=CLec-jOWo zNM7|{&Ef6a39&GddNS5WmZCbTXZ#D2L%q!%gb`3Y^Ojik>u<)g6&hb}MQG-}s^I>=i8Fp}E5)_l zq>Ycp@{&2@P08If%FGLoPmPK_>E_mqR<<)#c2@K5gzPUJ$b4RPSqwXkN5EX!MRw}Z zD)?!n1A_*?`0y+k7hg&rw~zU{P455wynewa_PRn}d%x-Otx^5$Z!v7>MKQq_o>q=Bv8c}(4 zC7f{%b4CESfB_cWUT*Ext8iDAa)v^#V|}g(CHx&-QVvzLl0R&iOPgAU7!Lf0CRNfO zXi6a(t=G3-B;WiNz#Eh>ewp5LV_t?QZ|heH@1+CJ<9|N0(|R{i5w21W+De9?@kXSewaylRT`p5C0ha_$E!uT4dDZCTO~@lD;%vXlJ7iNn!LsT6GE+ zWV<&c0n25r%Gz`dRM8IE$ri_W#z}819j#O-B_wdlAm-p#2hnFem;F>=C4jO-yG!9Lv6?y96h?`OD5~w&bG{l&mw@XZ-JwqjG2 z-tY0vp+g19spS3u%O5(e92DFUP_ygp^r4GuyS`*vj*KpO-Wxx(toEPiN8*F8R`N^_ zhefpy>17T?%;bl9U5eS|Cg5dQQ#9}~P(&#Ua}$%Maf;mnr7Ek^7<=hH&T>0R8vbL7 zk*?$iH^7t_O9r&r(`D$p&LIZK@sYX_l-Nb0~)dx7}%+m z_{A+3W4Rjz)@}7w9vE63BZdTmL+as6{R!V%9k50^PwiI4O!Ki$sDk{dMu&g_vKOiM zs_^!^ph#x!tkyGjX!5*Wp5)eEdzQ&);}xx-AgW$JUPXN@VOYf^bb#Oa1$bNx#3;-< zu??q~O*qN4GC5WIZW@8k^AyuFVw#*#Qm=!B;|>1?9Chzhhp zVfvUv?*Y^)ZvJ>IY9%=19bMs8KQcU4c+V!Hik62}4i4}RFoA+jWAA-+MqO>Zwe|d% zSEl{IW$e4SXQ9p{KPBdl27m-e$m-R9=AmxDdACtL=W@z}WGF$%!==ZvF4M%JVfNKW zzXSEHgL8g3f?3g3rFC$1SXW=atIo~It1ybXx0pDYnK`hB+59-cZA;V-lulfD+roTu zzkMh$2J#BpX(V3{+!PcrjNG98P2E zNlW7L19G6vHS+)Hg_6T}J}i#~PPyScluiVC)N--Ta3nWa4P5jxtX~>b?ivLRlg7oh z9QT|!BtB+78&G1tAtZdxN0fIeZFj`H&M*RpRz#M`8NukO8d3z)AK6|G0Ko05rH?Ai zd42he+C_Cau&Mo`$oLND;067cZ@5I=XEuM)c8sF=n;OWW% zhi#0g6g@w?1%56%el(7tB(UWr*b5kyoDr|*`7Y~%6MnBPzm*)nRjXY;f4zW5ZGcA& z?4hnKvda#ef0_4v3%lvWd5g1niyhIv-&2+G;(WV+$D+eS;|CH&0(_gi+Rrx>Vzivy z!hqcZU}5+}@Y}KM&N_B=W0Towyqw;Cs9L}2wk5;AQ_x@A-=z5`t?(er|Nmv&G^(>5 zH*X5YX&rpux*S)3bxD+&ht4^1(Ky6(t&PKQO;1H)I(1pZLt4 zW6NJPr@yw%qKZhCcYT!|ET+k8L!Cbvf6I%b$ERKY?)&rdb^#3LP2* zqSDi0q>cDc{VY{S$EB+7vUnEp_{HI&@ir!^T>gd}!xlkeJFx4cHeP+$yxlywyz42$ z58CeS!gzJiFt`b_`sa+v^ml<`$f0B$WSB}!5it;i2@ND>biV^>o1jwj|0O4G8sEF) z?{cO@D_T(@M8f}bbMN8iUH{Sg_4SQbIsL5+_^kjxCyr(8n#S(m>UeQHZ}4L)E?Jy_ zd=?{MAED~zK*JGMgOKj)_Wc;j4mirB#(GHedQ#AzD^7eh7UAzVn^zB2F8Kkbt9rP5 zf!+b0w7t0VaUkc9qUNu>7U!Jf*27oG5%bY7W;KK=pvx?MCs+v}Hx!72b8cZc&;&#|}H zGfP%q0QmUXTwj&ZN!w3VD`myJe_=Md_I}LqIM=m&T|2If7sqV8|7OLduV*JZ77!@1 z;a{q*?Rse#j73`6WppU-yIYThz)@^Sm6^wv9X}eUXqyxwE_03dtVCO%&zG)Wp=Zq6yjn(?*M)PWS zRq_Ot^)p|`e7%0$1bzLO>(^Yr=K3|Uer?S4Yxeqe3-tA4*54{!oF)Ib!T7FgNf4~!l>nT^o|Lfio1pd^?@Bf(@fgh1k< z37IWjm^htj+NppSuN*o0r}(FM;eYVx(V2E;J3CamTNVV;NxJRZ_IrKv^}VmtHvs^c zv`h zNH-=fLzL|7L$Zs#B<>Ax{&RW?`k#}q-z_^EA>9k1-&jM~i=2-m6j3UL~AbG9l%e1snlxDV> z*LnCU13#sLh>#!PtS*b{{E6X5*y&?xbYg_rOGFxK-evQE1`PR4@k>e6^gRZfpJLw& zk-L=;Df~`a!_|>KFSCwnz^tQmUVNOIzLX9fgW>Yxj`df`D+#Us~i4=4GASjK8=+?CV5xj$2I&2`~2tbFiLTU9y)1SI*ICVYO{m6 zV3zTZV`4S9H1X`>N{4tavS=Nj}3l>&A-0kHtPAe-chcbWVRnmF7&ZGmasbp709NSi}Xt4!{zZ*MBj+zrJW~GEe}I{ zI6BM(V~?mE!fqS>Z4ap(*yG}^^iVDSnDOgcpLkAN`8Bk3-h4YZ)0}NyqQoUi&MeM$ z?B)8{o3`v38ZpjVF85{3uLphX)GRxOK6u?LigQ}!%}Q97749kG>eTMvTnO&M3um%& z!Nm$yHhdQgQrp%!pLaX{9aIPH5%;fGzF)NTrXX1dhJGcyeKa1EU5>7!_>onwUq8NP z=@~jq_`FZ%Yn&;;>HJ!qr~<*X-myCqvpZ(lwf!;A|M=-}{d6{>PwTH`+TcPrh`WJY zEcflhDt3@hRY%?tbU4uyvP)28b=-`ZDr2?Mx*@RuYiw|q*Ttm}Q<1SC5fX~h;-_mw z({F}#YR{lGe0P;dkD`|KNN;X?n7n>6mc9;S(S3X!a&T}xJP*lwFf`J;**!cbu^QaY z3CoV52~)Z=xtQ~~z8!3To=Di40J-Z8v=6>)&2MNWe5vLHZs=s{i$ie`SmwNFU*;%o zpjzwj^Wx19x31@=hwHC)er}GNHWK6>GO5V#;M(2jDP4T1!MIeUmZ-c{;yCN5nb$x1 z4Q#Oq>t+WP4Av+RW)!wCEi3HV>}~7!vf#6uh$fsfzu+6**IPWF)8hyGH6GoK)^Dxc zAUNQR6_24WE-aky3TFg=;`#OZ__JjBvlRGq-bKwG8E$im4Db4SUsVLl3vK2K_gOvY z`KMja;dpZ8F!J@Z_lxEW!{MY?Bl?SpRGb8itj zsSpZMQ52*CDM-aqkcyi^N#tIaq&KL7R9pqA&H zzlNpkm77pPP?}^tc6{6)MMl&L5`ti1;&PLcZF8F03Jx<{s7|7{F*=@-;CJ#@yW-XB z8J>5po0mXwiNS1GYw115O{hTGuX-WhK4a_bg!6QH-H|L;t(3-Nx#883>XhmlGaFt( zBT7;wdY@~p^Li*OMDNnf3i$y#&Fg(HjO_?tcIzME%OiYwgf9;PU*^8djim2=n_2(o zUw;4d?+^c48l=yrAem1?R|8}?S{?T5m&wGulTdXU@@d!o*I$|O)0M361A~37tL|n4 ze{S`$H)Gi|^y2w$YjbVRS_i?;W{o%Z*~8}R-=Fz4%la_gWP{}C6eQy^G_BJ)2i24Y z0QXVskFBh6eDKnDS0CU1IP>{onEp5p$#@LyYUHM(d}Q5Mvex+@$FiM2E~USxg`@L_ z8HarSc;=^!!SVWk00030|Lj=HP82~DZAKol@v(5Bi81cLkO;0^7zGAKNJK^kkZsL$ z^-N(+Ra;e!%*r3o573o=pc@wM4I6*JpD=Of)~f05nyP-xzzmT<`X&wBd-~MtUizMt zRu2FUfcmRU10o>nqSxdzFP};IT$Rsw#F~iwG5K7Hek;2nJ?eQQ@g5tz z$qe3@!JCfaq5XM38sACHpSA7@Yu%ymAp&s3UmU=nPVkk_-!d@+eLj1NbxbA3QNBmn zJHXs?$=g}*lKG0w%vXFq!}5lykB`5PzWhD@_Vg_H)dA;p+p+Vid`cjnAwjzi*`~J( z7y@++`P_n8FXnknm-?@(6#X^Y|4V04@z)0I=T>4r%3qkDe~{YF2x)vygX-X3;@p(aeZV-J$u5W4+3vV|1IE3d z7+3jia5%Ft=V3}&dfbPPX7j#lqkf-H%K!XH+4pB%eKU1BeRC)BpOiB6jkc7~F_47f zu@O`H7)U|`X-kQrB+^qwJtQfQw54>Cg;;_~TS_@;OGzkgDJ^9pwub5kULRr{W0V1N?aFzjM2r|{T+B?1rgl^L3uPIiE zs+S4`9MusvzKtP@Y>Hb(MQO&?{~0vv7< zxJ?DXO8g+wjF4Q-m%3uoCd=ssBCy69t!3hx92;2)Shq?PlCQXGLER7IOSnlH60P`! zKH9R2$fL_b@|CK6{bwRk0cUVBZq;I>o6~$`sm@bKj#3>)D<@COv{Cxs|Kg2ZkaZTk zf>-eR^Zo$<0RR8&n6YjXF&M`$ZCa>6r9)Ym7!gz1SU_o$ris*&(4?iSbLUH39Q$PZ z3XvFi0mLh?!N|gdSo;bHG4KS;tk}t&;@sIOO+rG^S+aD_-#>r$=dab>e{IR>w-wp1 z%bwG^YD>}6y6juBuSWCMGH&i%?uzU)<1#Me7RSZ^C+_8jT&%}jKEbK^54AY?#C$dH znl^tU8do6a2#`KsxPZTr;MMp5yex-g_Y7b@)js4pRRLKlUnV|3!sneP#V3lZ+!}IA z22Rh{isbG@<8!&-Hhuwmyg~_OMM}6}01?qY(hgt@K~@J0bdLfL2pBEllpsTAK%g^N z>_GRqGi)UU+Jtg}T<(mv67qd{)?x>cHcTss7!@91&~wslmw*b~|E@CFG>?oBDR)~R9F zs^-cru_y;27G|XmgbbPF;tEc;DnUZOy-}sfLM{$rTOQ^Rcqkm)RI;9jEw0dXlS;j~ zXA+gd=&3=JO5NWoMQ$zv*oL6;J52N3TW@<5`T4!8))_X#=2*AFV5zkP2g&c z^;a#Ptld|$`}yPDXS0)R_oXNFm@Tfb-Ql&lsJ{UK0RR8&SEoli7 zA4Te6leTmd^-v*|Zg!JRA|+($rlE(GqFH;KOc~EO<8iVZkhpN*01{U?^)CP}Js`vl z@h<>E74Qcj^~RN%^?2hQd$W!grGPS$Wj~MKZ{EB&?>8SdjGEtY8Es(b%;Rm!5Z`f( zplncFW%OZr$5JtSUMy;T-;uDi2 zN*4D3_JMpVQ=f3ijAiI~Rlvm~(JWX4&1!jRMSc{osl8iGs(FXjICWR-3I=?I*us*q zrn&<>xK7{(|LxtY|ykH48p#_euG! zOo=cr$)myzo5BGwUQg6=OaBPL|^>)rBv=jY)EU@H>)XPWO8S0}qD)c6l zTojiBI0g+yDG%yB=n87$G$aQP5-xHTE77nO7j5l`jK{ETceRgyUNgGmDdqB8b-|F^ zf(5Ts5QbiTZGK~QzErg)_;upi$h>+J>>;-<=86S|_F#R1n!Y2(5cTRyh%ft%dTk$& z`nt=J10>mVMsYp4cW*j@J*GV`(Xd2$G|8`N`S-Iw zA3yr*$8X;LH|Y1v)0d6zxJsFdfsrS^(|~N<-UJNEMT&QQHp=Hwe~u3wZP$=`8f-pm z74>nE)SpXQf22HHD9psVGk`t4;*&P-8e%19d4rA1VxM-;Ywb#zP<{otE=H#Gz{%&u zmtV;8?cFqSd`Yuk%I$SUERfTw_%*NLNqKH2j&>t_v$*SvB`-&!fvo*4e)_oi>erWk zNHaf;7*YF1M63u*v}FrQ4L)9J?R8yc>Z9nj3rUbiu& zERK6~ZaT`(ZXf(R8orcg3p28bIP-^ZRtW55#kKHdsm*5734T6__4c6qqm$&npghf- zN6&g)5#{gW#>?AvW8*%l-ROQ)wwv$xtxyc^x7B@C-EVbdiT~)8-uo{dUw;4d$kE?V zXy0eq$1Whx#h?{i*Cy#tY5G#GAc8ntK(-ATBqpqJ=+@9ds`+73!<$UN+fcigtn0;^ z3r%FV%AK|R5(5?z8-R%4vh-Wwt~VY+vCrCrA#B!jiFKd5KChU)=EJn{tYX?mNz<QHA_S@Zlr-OmXNBEp>F|>5I}BvpzAW>%7++$^i65ki+w+>fl*J}f zo}FT>jwI6HoYQcmyat-`2(-N<3fKSr{Bv2uxg6lck7vE?cFBB>dOGX)*3UlM@j7!f zzeV%zl;2MI?OF5NDIfhe`6$Ux%VOWgO6ss9CC*t5N6PY#7XqX+u(R@l!kKqnMw?=U zhFjw_co#Lii-&k?KIX{9tuFie^)u;wrb7g)$U!_E&I=ljl;zJlSPlMPrtM!+-u3zm zn$=&u{)1*c*X#B7^q-tRr$&#SKcnlh)A{rNF@OFI00960>{ba>6IT}w$Yx{>5D?s0 zl(H#77UdV;MFkN>uqs*=FoXc1Nywjt0xlJ-3RtyLtwjWj*kYAUMXOa2D;20k5o#@# zO$6BjWfKu9{xdQNNwsj$bNcrj=bYhj-^~5qz2E)rop4D5mnwG8!EOcYR>E#MVqc!H zWw2Y3Sn*4puszu!LKg=2g}>_v{+d$$xb49cvN&`$OBlW?gw5pBxeVsZc*cUaFoY`* z^64zD@UM6y<)dc`OEX^s!}+(?co>9#G(pi zE@N?6!qMRk1-{YllaNCI;7{X@>gE+)Kj-#$Hgd_6`9Iavd zW9_F!ECG*A4yh-GoIKVxD4UV{7EnTdjeiRpJk=|rS+jA^}d4C`?#$;@Nb1Q)?m%T zhMg}vLj3X=(`tn6hW!!w2C)Rf5PtZ;V>d}NkR)-j{Ul70q!~u@wHj_(OPHZn5-$hR zIUM@XmQeDkFhKGk$)}7Efl$I694#-*5Z+)f4*2?F8$&OLOC97Z;L*85PbD6bLg{?L zFq0eN&!-3a@|gncSBQYbBE90m>+u!o^?Jf*^I#qE3)d5G$Q_D5S-0Qrge+8Z1FFZx@%Fro9>!NXvqSd_QOieNX<`v^7l&{ zP|A`&Y#!)0B62%Q(J*X8pDSkE>@{daE5@CBvEp$CjS#1_?(sf}Uz&DyPM=+_flYav z=Un^T3kx-ACFAXLC-dyqU2L<`1j^-5?l8iul zUcAa*npgE^H`oZ^KIcNzGXZ-|8bo+J%l++SHsn96X^9$ksEAqedxbDjJdjw7y zI<>E^CVbz00`GU!>3+A$c6|kbTZyLZ^lJ^%tS0cQkrVU2*em=2aZU|lE_%P&rmBWG z?;(mc`l*rPTuYo=i_&EmG_;+pBhG(>?mW2o=$3jt5l21h&ZX6*g*FiJG$OsPzI_;5 z-blpNgd9IMs0muoOvKlW=sxk)E+@o9oGoaFqehjnYAX?MEBba)OogoQ4V#OwP5&3qZI`Z+L@D-1VydR^FdaDA1DkW+Ui;B<+f1J$f&B!({ixcw*?YI%bAspRh_7Yh9Z~e0;F|=pQM3#jAi)6dB)A!V z+cGVl1Oxn&;J|-5=|-I-7^uV0?*zQBvXo!nSN^Z)*KNu}eRXbHNMTfJ5h4|C#MTNl zK7pch%<&Pjx!Q!;Ehz2cFFB{9JJ6-cVr;(~xtXjEiR*ZZjvq?Ni%NZlx=wcNo|{1e zzWtr-)6ueUGL~Cm%8-NN;%J3qjtU^VM4zUos|4zat9;@*#)EG}=pJ&>1gPwW%TcK+ zFyCx)V{fDy{BY-B%-jrh*k)sxC`!-(tIeA-Pe)T=iIMZQ7Lg`&`)(~YWoSX4QB*zC zQyZ%G`}8L}QlY>gfm&&%13up*&(zb^g<|Cm&R+5pK`WlNF0NxD{932LxmBeHyK5b{ zl8f{qpyJ$Km+vRR+K`(^qf#e>#%F8K<{X#;Wd|Jcdn2cUtD^!t!G0Q~|7Ikdn=uU% zCsl2}XKVl`s`Gb>5)7cdR4Y!CVhA&~q$Hh=HiTG*o>Lyr4MFTQ|6+^C2%3Bs|F~Oh z1Q&xg7n(AR!Q6T6jr=lWP@CBG1JiRlP#DYe#^q0kyg%KFk{xHjLA|q;D0>FnUuyfL z!psEnBAA++lT9EzW)LL1B zdk`xpD%BFMo_EcfHf1K*_++N!9GD6HyzO6Ym@o@+5cyPZTzeHz`ww}K-pTo2F9z}DX{9gA+Xf^Ef%QtlbkAgshRdB#Q>#MKrY6(!K1W?xWp z-mf&+^3Xn2lVT0qgv(F+xm$y>Pa38xYjAaPC?e%q!#d}}GLPrh@LgGIb&|tuU|le) zZ4u3eu$Y2J^G?r(xn@5#?iSC6rciS0eG?lv<<{M4%CLbgAAi~xmSh7it=@74Wj1h| zyGKPw+ZJxzyR9AIX$y0EoAuA_wuQyaJqB|5wvfEW+GM4y9oV?GSR8Y-gU`ILS+|GT zK^y1T9LTl<;&&|!_J`L8N9UEUD?*Vg#-|&rR-p4g?>wlxzYa09*Cpl)#ppN6%%9cb z+tKyh-dUg3cA**WR~l+3^&occ^kx-oj^uYV(k86xM{+l6e7N6|ph@P6o6}TTxawK& zw{`b8P?%qkHN901g3cH(v|p?MmhQJEo&7=)o>)4X$CoR?#selB8+FN0?kYHwvUCER zKVmzjK&TA*!Do+q9Z&%|E&4K#ld7$JfMS zg$6jOE}mqarvat0DFz&C3gnfrX%z_+Ft%N@B#NX7tI4Io8#ZbJC0jY+!%LdrpD3=$ z)X;(q2OST*?^LX(Hs8zCf~+a4(=R>I0>$^Lcm3j^4VSXTJi~BpNQz1K`}&MFq!q4T z?_IAA3f*?zZaP$W+VTmPy?_c&TKC6a52AvlN0!(lmI{&Na<)b)6}CGpQ&zf4g$MCP z*JhVc;h}@#t^?InVC{-nYt}@CX4r1~xRnYK+ty6O*K6k$r{MeJ(ze>+?>$zb3vs`m z1o^v)7)}f6>~b8pJc(9`pOcvG6N#T&>R@4y$00UNe!c{Y%h0Cm_YGK_TN>nU9mnD> zKE*0C!17qiHIT*g>W}(*5uRu7UDYH!?+bw&RB;~MGxr_Dc?mw8HXG-OvFBpLdW^TJ zjH}s^7>_hg;h}Pj*Gq!B{cMb9y>zt{8peC4DB>q`tPa-#k0{}Fp^=S!@H&M%${ae4 z)oq?rUh;CRj^D-b%U5G{4eR2%9)gk)8%x9gX@U*;c6{hSB#j9Cct#&l5?hwgXu0O^zu?Nro-6CtrT3BXB@=V zxK5XMnx5Q;={7I3I|A3S*NsjOT-QNLVt-ucH9L}maotxdnD>`peK61!4VV8100960 z?3fEwQ%4%dFYjk1rUeyHd6@7D;EOG=x-%_7To2NvMbs972r&dh0!grlibbsp;)6Y4 zQH!#>0xL_)Ls!u)oIw%g;VX(R@(Kt@s#1al7omlnX|P3#OSL_xw#_|f&dhhY^WE?N z|9%;ALQ&*$fe&04DP_l<;qU9a^2F<$p{7T3lET~>))*B|_q@h}cf7xRO}LWQ+pn12lX6qxOKq4)9?9xux-;4zOTLp~L+-4zOC&xVq?` zJ)FmmPpT`nhdLvB6(R9B&Xy$wvF+ieRi$=yCiXD5;o**JO?FV6Ys-5t-wyhOJJu#_ zvV(Dve(CJxc5t3ZwCj|W9gI!VdAFsX31_pc(uNY7s8v|N)2A*@f$bdl$W*+4iGT^fP zXZ98yWI)M`0z})%fFQeKaG#U`OGNtn7H}D`(Ie7^TE&2F&H0}`_Qm%hJZ#HmK(Fmn z3O-oOfO$hP-E6r1BA&t>4)^LhhgEHe4jnt+A~BQ0!UpKRu;TZ>a_jm<62U;mk#SgqN9FWobLmy zi+?QPFwrS^w1z`;%We%fV>pl6_|^@V@^uKN#DnVOu~&=X>yZrbl6zy8?Ms*?z0GIeB;pR zggZuh-0)G%;RUBlj|i8ZQ^iXOr#=;zA_=!ETYHTN$Nr92jR@D;T-GMSd2S0WlW^ZI zs%Rsh1KFk;<;aLL^w&CBJ81nm_+m@3UicLSkPWAOI(?%8j4)Turr9XKz%)Vq8`WLl zk-}1tBkTg=X$zLjr*{Ewi|Zz>C+>oO`K~C*edjI^cDxmx(Ax=i5A8k?vZoWIrkDUP zyH3Cp(#>p82jBESNY}``P`cjabn zf2-*UQnwOto|oJ+i+&skX3qF<_N_dioX@I$OD79N$a+@YDBJ-;x9-aiDcpfzaPhWz zI$21${cYztxAG9(>)3WC{Wy~IzIc6$TM3E}zQi{UC`Hqfk3_FKRgQL**{6kq3e@d) zpgjJ3CAwE>^fmCVLdnISu;AGmH1i*YuhQHvBlu=OAl88fcr9MuhB8!cCTYbwk(;YA z1M5a+73cHzX4Iis@7{F7zM$dWG=zOZe;SquMB4SJJVN&`*hh3J^>GpQ714ZWY;9WJ zhzu`eSG^kCglc*`5^0gm=<&7vZ&t;$AWON`!UeH%)Mdi1Wq7ut_315bxR1z?wrN`F z{5Eu@Iq*2{GrIg&e;wR+#A0`gf->$P-`m@LdJNjpCyALBm=jc{MN2=WXh#~|H+uR4 zI*^Ul+5cFh4%Fe57K}MVtj^D=&^?`KD8MHNbBLrKQ!_D_s3AHvOMc=m(!HE>ZXUf0 zv6-tW%rUA__8r1pBkNgx{U$aF-iIgwok!3VjEa6L}T%lC8m(&TV@9NYZS0|~*U`(B~(Rf)% z1WqFoZ=@#9qdP$!%`tflMsukyOQ@QafaGzXB#*|pJo?|}@rC2}Pozh8oE{Q~i(=Ob zxGEiU$Lu%I{QvLQ99{h!`&y}I^EG}S;p<5s>3FP*6^2RqA|WNOHSn9fODFNq zY@B~2j^glzAz>n+L@LHBX^2o1F6Qu5`Ch!ADjuHKAB_oook)k)Q#!OLj!^O=IaY$P zb^lo1lX0v^J>3Tq3q(AA7(NWt9RKn;exd_TqQh{U4ibMSftoPS&%-r@KSYnoI6WkO z(&vx}jxZb_)M~zeJ$z4gPHR7A_PEeT39gZ_Tmv4TM67-$L9KvytWz`WC(RoqFga^bxw7Y?3t} zXtE*|Conp*=0EI=Kf<^Ii0k+HmcLruy4-r)Oe6XLIx=o4CN4vILieQT+ECPW6(D%JQ^wd3tG{kAnW#I;J!jd$YKXru{p&?nluX z2l~|EoiJs5$88>v30qMD-fTDX(gsF(Uk>zdkn5j_*Y1iq6H0uxT!KW&AQKJp~ljHVY9c_4jbS&f;Ilg#~hsZHU5;(!xI%Z09Dfe#_2)*$-`rla^JSO#$$qi| zx$85zy2#qMaMx?sid=7;uF{QYb(Do!>1y&9xp3#{YLMNaoN*_|f?_qxyUXqsvwh+Y zQ#XV^00030|IAqlJXGuZAA2Or$Pz7f*$Sb!>3zzU61qvd#1J9ZV)!LMUc?Z`uW9%dKljwxX#?iDYNq8KE*4XBFImeOKMk37+=FF|@SU&BbN5r%%pm4zL%jDh;m>H8KXJj&{R!~-6U09Wka5l)rZzN*kCeblwCvC91y^kF`R zGJ}%aee*NP^#ydF=L#v$MSW9tv}o+PLEg_tk(mMY3A%;kzB@?Ka9*X{wR`0L zV)W2eq0QFd0jc*8smO^o3-moA^`9W`lAeZ~8&63)r6_G@Lv6^;GSc32^m^XoDzl{( zq}@t1e#?rN!E)84{c1FmUe@LoQbYQwMRc1VTTQEKNq==HTH|&z)wZ7WTaQi)&T8s7 z*+BY#fl6vFzqlvUNXF5KdUK5%POWYt<7r09zoynjmp7AfwIHkYYPEi|TFLlY5zQmM z+U`Uf8D~4%Y$aQzDfN&_7x~!vzajB>gA5Ay(#^*8 zk+}4stC#M3YZmvB_`F3fCq{b9ZG21O^cK~|*?S3^_mg<_Bi`1HD>|F{N!$jI=+79f zI$?msZve&n40zsm`kln_cckw&)$^*rI}*=#D94t&{PekZB(8(V$t=So(RYxSigbcee2i1up>tKvTp?rvs1ij$!_x#f>6!k(!)9^ zaMDQOfYBTQnDMya(s4Xb$!U`B^Zl6jN52lU6gv-$XhqU1M8^F#w+W>;GN)dZy%` z>k~a)m`{I$c zD~$k|Bv+3;UE;7jboF+LqLEP93)vCJN5Krean1eV(r~?GUzA0<3~Vq}PYOzq1*5fV zGO{A6;Gki9tvyH%dY6Yi)b$z-0~!&HbQgK3+U+rT$VveU)Djdb^%TM5*r7?vN=i^H zxy;s0WDJasH(s)*YYaST5DmCjr3^9kR$&rFD&SLbeuv#}V_`A-&cTS|<3M)T;pihdyodSEVsWI)20EJ{ni%hdTD~b?c)4frJ5i;ru#bGMGL52 zPI*GNv>@;IIYo!8v|*p}*-CUy8_MRIy{XXCfxJ+<+}cAr;MbOIsH`**?kY#kxU^#; z=)jgA+(dMtQmVk9dyOuL$EA(m)1?d13-iYqG4z0H`a=C)l^&=>$^O7}(}$OeTbD}| z=|hst)uPKBe6a$V+}n(k)&adPbdeS315E-N@~qysN$&Y0t}Psvp~jn7LZ5qww#s zTV2h@BV7lPaDJ@^E0qE*0y%SLP7nmlrEx`Aj1Y*ZIiQ}COjvnE4!o1vYBOX_Guxb_6(C%qoGE);0XAAXN{+x3peDZP+LQ+hP-iK&HMUv-7+XUZ>$NCAD{M6D zd8q)Q8y2Y&^R)|N;|aOYsW5Y5U(YBSkI?H&5P2+y+i9nqbt3GRCmUB1ev(dmgcE)r zS{h6x;%L)7G~|HCrEXgKd>J0+x+dX!NAS3d(-@^{cph_EYJx;wgAqqK6vu6X7j`Zj$I&>TFs>ZO^$NFPHxtKM`LuM3 zF^>D|pwQd;cpa|!CXOKLVl1KQLDVV4N+2!^uiNyQd54_vI$n(8lrO~V8r;pYyM@;| z@j+7MVZ838P2MR@I1h3}>i6u&d9h=gK>8V+C$rve?={DH(>*gMfZ$Q!%7vo|UU@~O zw*byFyQ^n90&w14U7bBw0_S0Lco>!7t(0BUVtk7jMb`%c#wc8rw)C`zl$iSN+|ja{SqlhgGf$6H7Eh@U<@=H-mf)X;~> zL)ON3@IIz-)6w-^B0isuE^%6_2U4+NV+)k^AUrJK$*SkNpfL59I@cs!h)=sdJJeGb z(${6^wrc7^p`c`8X3In{wh4`Vlr<4VhITY955?C&AZxAHF;%v z&{1tbg_=Tr>$TzFcAb)i%e3K0jH`r zt4KTj))AKjBx%@af%QhI^bJ;8kUFrcooa#4(=0DPH`jtLN*YGYY75p55%N5G*)3w9 zyT;8+gr4$j|u~f*srNycj3Kl88K+z3wz3?~>BNac(#ciInqN1TIxSp*RAkZ21Cr z0yqDo^+p7a`d9YF61cj}u`eZXjtgI{wjRe_AZyhnq7G(R!5C4O%bjBLi8`ro>pno# zP2PrCNz`%n)*d!d*N6c2MWW6JF3B1Zb>}@|`Vl-psWGApab9$v(C;94(w)$+P4I@( zA^n)(QIe$4dtSvlwHgpSV@P@`5xmoi4IWIvd6=(%x0m3hr7UMQ!BhJicl`<8E~@Sv zN$_~S-u;mTuZ8IbYY3hntCUG3cwfi9QA3=Ak~OzGhK3CPcusw}E=$b&UK1)A+k1{*i?reWp}mHLhF!V zipt0i@jAqwv`NT4t`<=zmdGAeuSNNjRqb!4)gY&Av6w3+HE6L)T*8)%)rhysZIrfU zHL~Gt|HU+@3L&xd%EDEZ$TO!}p6XwL7=~v@$a|Edqet$rE9N~%Kc-&q3$`djsr~A9 zeX6DC{w~HVmhdxFnJ5zey6y>Ti(I_+Aodvj{^tCmopFy)*-fAQwJRT@Sb@a+?CB5C z%yQG`HWDSMV1?$-4ypH1&4z6p>a-%X_a|LVn`^hxj)D3rYuf_kXC?VyZQf0^E5~VQ zIl6(0e~Y*AzL1Od)y(h~am_~aRh7bcW*1SOZ`7;t)H8@VZp`KhPf}5bi9w;W$U)>+ z@@nzJj7`XM{m!)I8JjTh$ciu)If!*^{LxVJNh(IQKCw}odIqcVeK~cV*+neW<1Rze zH5*fmN)Gh7kc&mVR;W%L~gIp$C z_!*Y#C%PNQ5xcwVZ6=N@CgV6}efhlSm_+`O0y&Rz?Di{*a2fv!>}~PBSp};qv9VRE zrc;8dutsT{J6e|2*vi<-8oZ8}gv=VnY?B)7UWMBkyv|tBuk%Ilx?=`5?d)Z7wU}e+ zM*COdb=ax!L=~JTSdNfP?1iQ}OrZVYt8UkNOkL>OQ#Gs}tGC|kf%6PAXlSN*Zg0Q_ zT!EI;Jn7v#&`Eft2bdz zlaixw-eXOZ#p=B7HDQvu(ns)ffxZ7d>TlkA_}^PpDStL5efD1X?e9~j@89PxMSap2 z{2P4{JjyZTS`Pm+lj+OmFnE3ePP70zcUXuvbRSv}llRB{KW_XXA$M@UxZ%L^rUwr* zwSdl>6|#^^=kUYe#AaEuSzI2C#UqW`G3ZQhF2#Y%C;xK|(!FyakAdI#5^ATQ02>B3 zkVy;S+wyhk$3fs4Dewu`PxyUWiwu+VzuyagWxvF*{W9d5=EY;IrWAp0tknfL6;G}<7S5@(UcfLO2<0eQPBMxIVjex@1kM6aS+=Y{m=F4Jp zc?_@5m}kTA@tH>pw)Ug3eCd2*2J1`ldj?bZh8=@NDEvrgF5uAv`Nggwf%MOI2eI5} z%+G=&hCPSo{r;qVerO4?^9p}{m(D@Fz#yKT7wdDe3zJO<`45*Xn~8hnw?T^WV1np; zVmy#9cZUQrylBkDd}6%KxX?H>CX>z_F2+H1;C9xvAq98Y!k$x5sijS2emTBL z`ox;Mio=^o59I3pi#Wvi>=0`oHs@y=$NT@JZr?+Xzg{25@Opj3=Uer@g&*77&;R-+ zKXb{-2U6EPG&N?Te9A&@`_B!t+S0;282Kp}1VDN%i$WmHsMF%Msq?-YTkQ`tbV1Qx%b3f1hto43+znyhHopbitXRq^H z`*&SJj^o2eyFul>btG&0)Nd_6?OH`d#}gSmC$*I4dO#0-P8xznM#Fi%!Lq*5A$*8U zEqz&};~(sQJv}}BDAj>TvmyGc(M_pjUIvK@iX)6T4V%9VyaKiTnQpu(xuuV~g%H7J zl9E2{>#7=XiBlyplquBBpO$pbB|RDqdP0t4he04|8K;L0R=*)~zafBRziy*67DIMf z%Y;DCqw6PT&3U?WF z1>9(K=dk+Sdre2mBYGl4R zGx+_konnEDUEu4B7M2g`ls?*AoI+G=07;*xGt8Du4HzrfC@s*adz?+37YlZ8L8*zx zWXg+Liq|5iqiFVq+d5yA4kru*Ly5Q;B`wO^isJs-{PmRGc|{hb^@03Z7X}pniv!NH zc;^738D_V51{*>q@+=)a!T%{`|*WmJk^_8;;6 zM}j#2dh%u%vrQ!kPmQmg!uz4(M83I{2ULX;Um21*YrPTt4W#GiEdduDE6u*48oIW*K}&wvrRcfKKe0ET9`0U!qD}ni_UplC3F%5s0-d*2@^3~j676Z zRLQz#*|+g>oJ%I=;50>BKY!gi>D|$WJUmIK@#P26H`mMHRNe-~nJuJd;)9c5CZoR& z=zVNDLb47IH)Y~JuOSM-Epc41JKF`17PGU(@wMX{nfY<#hpzibV5!e<^|1*ErZM;? zpbO@rh~JHAg!`FTiPlXd?{m+5XdXH*rZ^54;RuzR%bz^lOSeMCsjg5D^f`=h>`wf@ z6rCMm2g2vJcGNLShhYX*DV8U)RqSp*1p>+5+>_NU{6_9$=k~P+5gw2r$|yCItIeA=$JYH!fdyWpI)*xw|uwz5cWjt0a8q4C_~ z*n@DQY4lH6^P|Cyg;f!6o2{F8k&ioe-AlKF-?ioQG*BJ6;q1>9j361T^aXSVK!!f) z8xF}Hi``vgx~JdhWY?eZ@v&!XqIt72v!UtZ*4~(DU%xp2jcUnVxu?t?KI@D6l+aIe6rPT5)9Io7&l@t{E;Ro2sb4=+@V#LY(UCdMa|>2rbRfJc7>Y=Pg; zcSu~yr`}yxm?hCQ(QWx#l*;%pNV#U%$iLlu?{>`+nLg9JLnE-?P(7)* zVw{;d?Kx-IlluDAm-Wn9PVPK$Py{6x3M1@=2$ zApm4+OCGNzZZYEgzL1R-IHNo&sNI`9s9sgcb=9`}7WzeCaxGDFgLGrhyw z#8{@~^kgxNm-vNBl=?KFy}>@6EfaO>r|tWA;W@{otO$b zpD%y!h|jbm1{mPIDXSipBgF!*2U8tWR`YW%w4%wEdqy&zt#ijX)YZ@Ji52H*WtZwL z>T_;9TS2u>}stF8m%!ylY#2#on0Hdo#((I zPU8^s%%z0gQs+l=izH{ zN;BsvNr~#JCP!h)g^SmLnYH9ToJ73Ti?Q{!J4I0ungtq^O%k_y!Z7iw-F9%;wq`Nq z);}V#zkbAi_zx9fsKW`Ozgr_H$j($H=?Z$>L{SkY0$rCH$nykB7GOo~_;soYPlV>6 zo<~L>mpp$~1#P)|k_nIBIo z!GhoymJK4A&5nc74nIR(JFDn%^lO%K5AA`$67n=L*c?)LBd1bRLPhnAM;j#c6y)Q> zIBe8`x7YPFStOZ>7dUO(f1kY#&<>!umOQ&Ok{@!iMuz)1a0MMgFV4Y7GOQ2ExAzU* z5CCEtLBIKu5;-^B{dhf$+uaQ_Ka^2_P&|mNkl>BD0(iG_M1cY97t$OpiQY6<@3H$? zZR9LfLwCz8hBdv**TWm5>uEoDiuEzo64e*Rlt-L0Xr+&gZws!zRIv(bCs1Cslv)&R z9FM~voeL1OTkA}<>TTwgGS}n&wLOnFcQZ$fmTgoSH}bSZY%G*XG~fS)`kFR&iT*|) zIO46)2qR-uk?6$~L;vA5$qNDxufKI4h%JmO1;+fgq@&7Ddc5s^9AsKg|JeHsSFjbM zp%|we5qob^Gp^=Ay-wwUEA$4nPjv_wwWtj~(evkSFr(D4KAh}`HqH8@r+=n^Upy9? z85-K|8qkZdnYE@J*SiY6RL^6x@=kB~Tw+3PK29_pQQx7fUtTS%i-j%xrnkOp@FcW6 zyfDr-8xQ_*dTgRJzF@IB`iii(Cw z1gk~GOr&xN4u7*U(sd)h@Oy#>u?x4U# zAXxEB88dnm(y#br$*Z(x1j{2h@4@K9=-k!pUS(s&O!k5V(9xeo5C6TX>)~8rBrhOj zJ6#hPspXA_dokBg?(OhvdG|Law=V1XhD)Z@`}Iv3Un@vI~{Z&qi6QgV_1 z1<3qVL)DfkhD#ljn}ZaJQ+_K|8l)z?(cFn6r8a_H(1k}rU;myIBK0p5rSy>gZ7zJD0(-)obSE7FoweBNT|aK28QW84d!`GfN~nEg~{_aTl16k?X~fQY#O z2)ej~&Af(gD3|XC$SGiVkEvKlqJH`l{!a?qfZ0QfXhQ-Kif2TZ)TP^1FFKo^Z)$36 zxdp+nHl4rV`p9oRJG{#A*nb_3r#;Q=NIs#%>|!`X=jJr2-&#B(MqJm!$#R}X^m19q z{E2z0G1qJj7u2w{Q$tyxIx|9MStvh>fPYnDheEZel)*d8<+)_-xb)n`_UEj$?^H|O zGYXH(-9>)fFC=SWcdxh=G-fB(bWxXPMY5EnkYXu*qDXeo-izK5(;lgkfNQx|95>zG zYe?_bmq?$*bQIZBi3mr~#(OQox>U_Ql;_K7Iw8|bJJx{MGl>dUJy1!Nt6qYwcEZk% z&UV~*FAQ}B)z4{bIhUb$mi^zdb*V6>s!4zN!tlTG74KD1cP>1wInsWIbs7)jb;!d0 zf_wcDFNZw6%qzkm%rNNIoL5LTsAq#(&7M6n9-xL<`yil~*DiiRCxqV3( zk%*nA!m>j_)-Z&2NNvZsQ{NEFT&b0t%{!SgX_3m3rcd5IAzm@2^(C)IKG=5;-!3ee zcw*iHsgyCkJZ=hyv^gAVsVY0(%wF4O9#SJ{`&Gg|N zPnZB)jvj8Obr~BGp%$&7smUPLneCKDr)Fi^pK)P1GH=yqOk-ikV`WDimCRROiXJd+ zeC&i0IE}ngL92xjY?LN-Xk7$Kj88fEePRUyG`D1{*0g;yi&rAsR*L z!N}>G8Bfr7PN%@n;Flp+Pzitw715~`%o4XBmVm8lKDYCAoP{E0@9BfzYJH(Y?nPu` zAaVp~`ZcG^d?RTS^=yU~XiBA}AD|ZpA&9HfV$rA&)UgaPGEqtj2! z7MpMR`Q?`16HSUX+C}on>@lx1J68YH&I8mIirWUUZBYyWroVx;;J|H}p?vHp4 z%-R`$4eUe7u zl!;sS?;aX*@~Dv~Pym)w@X;hy9vOap25q)K!mjBPHtFsk`NrU_81)zS;vYxUeg(y? z=}%QayZ`;ljsLTXXQy2?ZP)$9Kt+YcWn|o(&+t}DYLvL2s2R0;^XCi<*5R(r33CRc zNu%jKpnq<+NNC^2y(3pTS+=xeJ@h+KUMb{X&mR_MsEcQXWX5bP#|`BGazFZ%bH}%dSFcWxf=m0WB37OFVc~y zRrrYil|Bk4{w9&X#8I*hefBrSI0F~2b`)VxOd~)C*AJxNBgTb^${0k$MgTnc_FSwA z)>uxFXl(t-PYw1zvM!MvAJw*eB#0K(N($@cFBBp)7FSe%^}10&8*RP@g9rs*ObsEJ z@_*cWr6-AW5j%kU>Ick2-|t8zT(EL?`T?gE!1)L`A2sOBe#@X#{vh4m%U5WM55?#Y zKe5c=4^rg*f1z!v18-7M$_=Tp?`WPid+XKV>5?_oE5KM34rw$&qgw;`D1~^u(Nv@`pTz-bkx=>chF+ zvdpt?_=+cjAaiz}4xlE@?rEyM5P0Rua7ATEzVTxB$Q_lTRO*7Z2ukjKlwTQ=l$Ox! z85`m{#MCYEX9X$Izkpln!8m@4*9d22N%>ZfPx_Ru*AP99aU{j1$p=6cm7`=HqE`1_ z2UscJqe=9Md39}`s7>G4xyT93=N&Zz`$JkKTfk^!r6AwPqdFaf6@7bnsFaFra?%rF zGC}O7Nt&Y*&@|H`HxnpG-S;;P<(b`6TN(0K;|#xh=SqjE$($p(#`D8$;i~-PS7<+3 zm@WsJ-XO`Vcs%7Qc-%AXX=`z3Mhwo%O%q0!tU{&=^keI2xmnKYf7FZ@HtTtW(Y7~X z(oHtFNyc{avz)qJ2r9(_tY$YZ(#SbFn`VbdY{+TPUQF%_mQQ3ZWcER^xyiN3a^cwrs1tqC@7}5J@tOKhx zp`@6(p+6}l+O&gwzpEtAYVEQaiXT8gf!Be&DpQoh?$zUU?YnW#EI-p5^FP1#H%hjW z{~m*iTExZ;|A}6*Xm3=tc^0&*v%vFribh!;E?q{xYR26;6aTy>BN;V0eV~yGMlW*+tDq{SGZ%iDBw~>ZRlXfH74{0v zK5WdWsEefLf5<7s78Y)#@V7k!-?SqMiNfB>8xZ8*^!+rV3zN<_VMvfLtSDqiw5$3S zdi6+Ql$Z_(sj;N=y`lKiRb|lfC=X9%}36CrQ zRNfo;0QRJih?e*l&MiU+OMf|;qt@JHgkK}dn3E59EEtJSTE)=iFKDO3EkC4?NnR* zQMZg5(Y=ZH~tzqx#M;<#vSPn;xPw zxs=umF+2Fc@yW)G`m|%;X@fe)LrV9!mZDTytTWx=r<8gV z*$a!F8T`1duSdnAfOId?uH>|~*Y4y`6keC$*x}O6Q>qgQY}s!JLzo;ns)a`WVy;pH zLhn2>1$Z!^jD0D*!1&^cdbJ)#dkVYZLXOFDfr8&kc;VP_73sStPc(j;c4~;Oy%WB$ z7R)Kx@?C1t0xvuc(7ihY(-bL^bu~4L)ulOVud7BGaMzsTK$iYWQz>{Ck~DgU2WuIT zh&nm<7hTk?dpQ^32KCLq*g|OLSGc zyr7hvZF@1BOqU{ZyOGGt8|ct0n=<(#Q%Ue z<>6yk@OSbr?fo^%$b4+zA%ES+deB$5chJeM>uyh#M}9uW7_FNp0b<4|qZ4?M{#WN9 z^N`yuheTH+@aaQDY8*kHSbzOMrx{IbgeSoh3}qcNv-n}-^_*C?;bU+9pkIzaUEuEz zERbMhgU8a`kb7{A2C_5FE{FU1HCB6-{xf5Bs>tO1agzd&SjFkdc;WYZS75|7*gFxF zlLtAD$PT@R8gZPB0i}Iew^9iu^J+{~3b_?sg(3a{qq+*dAH6zLd0*0X!VqxtnA^xh z<+Ne-8fq}cuT`%VS-N7Xo&H{anQtIz!#kH_NdI&V{osSBGs`fhmj=X7*FK@Zzt}!Y zV=Tdy<_?3~l$n{wrgYQ;Rf-z!!ETQvR;fs*8*5Vn1AU8WQIikr!3jtDPX%XsUaXgG z!sh&omlH9*h3UF7fvEx~4_*++_uvhZRd65lZ|e=w#e-?x(EV{-Y8-FglLwinJZYxY z^i}hcBeP6E85}7UOo?ip@cV^xAoV7Q{!b|Ke3CKvs{lSd5D9R3xUq|e#GX`$M0veF zGWNf`M~%>5>Y48C=VLqu7K^cmS#u0P%G<@A>%m`Vy`i_j7 z-YhLxUap$3oE?zkWH)j4hCrw3|MWClME-?14zSWE` z7o5gJ4YK7Px>+i}fOAVjY~jvnpzjjhlb16MKNIRtc5_X1`YjdJv#5w@^ZEtiWi6;C z2^gn-9peY*F$v!3PJQv6>X8r`_##iaGaD?|tqh)6<;`Sc^LH~7b_*4rHjJ6-&@APD zcPeyb!b-B~k4f@Zvs6sO1JNle6O4$14BH+bd`1MlT%7)Q?N3*Ar4bGpAzbF>)`+j%ANeVzTw1l{ zCYRRSd@zWors2ohoP;g>i{;=>gWeSq(R;Dd%tO34)75Qb_*?Bhuqvf$OYF2mrAA4R zOHVI+a4Qw9qI&RWmde_9Pu{JqPLf_SDRPpOjAqzPcIX!D z73ku{jfVcoyN{F&Cxs6D{d-a9MW z7g@9WCJ?MU(Qc*6EDx5`iJE$!-~iHdH!}((e-&NL6p%kr_g)WvTmqWCTJt`-`=+El z3e)_NaVuo~{MVq-*phRfG$EO6Tb znhU}1CU!mhmKnI+4Wx3pyUkn~)^~rbf$V!9SqY|!$9TU(>cu}sly*Onxb>Vz9-o5_ zyCM5_#tYCCa0U(2w_dJn;D?CyXBy>0MjRb}-jZ{)CLl`5RLp1_z)KR(s*Q#1kaDL z$I-&)u(3#g(8*#6r3dEd5&&KY;pTi}NgVh%$tB&nAJ%4_BhyVUb zbK&m+?{w^(5Ho6nsf)hg!&@{Gw zWReT{WplLuO%^ewYveM}l&x@w67q~=^W}v<$fogP*|)oNr)&5!t7M0cY%S8Y&slC0 zmn(!<`$C#|A247Kg5z3Rw$ir2D1=@b`~=Jr6& zm`Ro?NZerMZQq6IM}@Qu4X-Y-YalyNFe+RBMK5CQsR<;<0*FZ}L2``^rPE}_zGRU- z@!xzl;oEo7rNSh=GRy|QEx4Mu%`nerCoMD;a--@U!EZKOq$iq{8@O5=o90z&YUJTq zS)LU)khgBst6oyGCffA86gxPI9hW&^YUto|CyO2TaIbp}8(wL5LabX}#4e0OXo_fh zT3sX)$U#}!H&{@O*OxKhsBsR_buv|kb&+OHPK$3Z3aTyFipGeq+x9QxuuhV|%TGb7QL>I*-+f)+0k+w^l>J;sUSDT&^FK+& z2InGSwAK5Ikclc?^YHu2sbTCBq~NoII|fQsGf5=UFAezqC&WY*?y&%NKcR8*BJ%n_ DH$6aU literal 0 HcmV?d00001 diff --git a/OptimalControl/drag/main_constraint_drag.m b/OptimalControl/drag/main_constraint_drag.m new file mode 100644 index 0000000000..0c611c28a7 --- /dev/null +++ b/OptimalControl/drag/main_constraint_drag.m @@ -0,0 +1,150 @@ +function main_constraint_drag + persistent u_history J_history; + clc; close all + + g = 9.81; % Gravity [m/s^2] + aerodata.rho = 1.225; % Air density [kg/m^3] + aerodata.Sw = 2; % Wing/Aerodynamic surface [m^2] + aerodata.CD0 = 0.01; % Drag coefficient + aerodata.m = 1; % Object mass [kg] + + N = 100; % Discretization + + x1_0 = 0; x2_0 = 0; v0 = 15; + gamma0 = deg2rad(40); + t0 = 0; tf = 2; + alpha0 = deg2rad(10); + u0 = [tf; alpha0]; + lb = [0 0.01]; % Lower bounds for the control + ub = [10 pi/2]; % Upper bounds for the control + + u0 = [u0(1) ones(1,N)*u0(2)]; + lb = [lb(1) ones(1,N)*lb(2)]; + ub = [ub(1) ones(1,N)*ub(2)]; + + cost = @(u) f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, aerodata, N); + constraint = @(u) groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, aerodata, N); + + checkGradients(cost, u0); + checkGradients(constraint, u0); + + options = optimoptions("fmincon", ... + "OutputFcn", @store_fmincon, ... + "Algorithm", "sqp", ... + "DerivativeCheck", "on"); + + [u_opt, ~] = fmincon(cost, u0, [], [], [], [], lb, ub, @(u) nonlcon(u,constraint), options); + + y0 = [x1_0 x2_0 v0 u_opt(2)]; + t_span = linspace(t0, u_opt(1), 100); + [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, aerodata, N), t_span, y0); + + disp(["Maximum distance [m] = ", num2str(y(end, 1))]) + disp(["Initial angle [°]: ", num2str(rad2deg(u_opt(2)))]) + disp(["Final Time [s]: ", num2str(u_opt(1))]) + + figure; plot(y(:,1), y(:,2), 'b-', 'LineWidth', 2); + xlabel("Horizontal distance [m]"); ylabel("Vertical distance [m]"); grid on; + + figure; plot(u_history(:,1), 'b-o', 'LineWidth', 2); + xlabel('Iteration'); ylabel('Final time [s]'); grid on; + + figure; plot(rad2deg(u_history(:,2)), 'r-o', 'LineWidth', 2); + xlabel('Iteration'); ylabel('Initial angle [°]'); grid on; + + figure; plot(J_history, 'o-', 'LineWidth', 2); + xlabel('Iteration'); ylabel('Cost function J'); grid on; + + vars = whos; + nodrag_results = struct(); + for i = 1:length(vars) + nodrag_results.(vars(i).name) = eval(vars(i).name); + end + save('nodrag_data.mat', 'nodrag_results'); + + function stop = store_fmincon(u, optimValues, state) + if optimValues.iteration == 0 + u_history = []; + J_history = []; + end + if strcmp(state, 'iter') + u_history = [u_history; u(:)']; + J_history = [J_history; optimValues.fval]; + assignin('base', 'u_iterations', u_history); + assignin('base', 'J_iterations', J_history); + end + stop = false; + end +end + +function [c, ceq, Dc, Dceq] = nonlcon(u,constraint) + c = []; + Dc = []; + [ceq, Dceq] = constraint(u); +end + +function [J, gradJ,q] = f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, aerodata, N) + y0 = [x1_0 x2_0 v0 gamma0]; + tf = u(1); + alpha = u(2:N+1); + t_span = linspace(t0, u(1), N); + [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, aerodata, N), t_span, y0); + + J = -y(end,1); + dydt_final = dynamics(t_span(end), y(end,:)', tf, alpha, g, aerodata, N); + + pT = [1 0 0 0]; + [~, p] = ode45(@(t, p) p_ode(t, p, y, g, t_span, alpha, aerodata), flip(t_span), pT); + q = p(end,:); + + gradJ = [-dydt_final(1); -q(4)*ones(100,1)]; +end + +function [ceq, Dceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, aerodata, N) + y0 = [x1_0 x2_0 v0 gamma0]'; + tf = u(1); + t_span = linspace(t0, tf, 100); + alpha = u(2:101); + [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, aerodata, N), t_span, y0); + + ceq = y(end,2); + dydt_final = dynamics(t_span(end), y(end,:)', tf, alpha, g, aerodata, N); + + pT = [0 -1 0 0]; + [~, p] = ode45(@(t, p) p_ode(t, p, y, g, t_span, alpha, aerodata), flip(t_span), pT); + q = p(end,:); + + Dceq = [dydt_final(2); -q(4)*ones(100,1)]; +end + +function dpdt = p_ode(t, p, y, g, t_span, alpha, aerodata) + v = interp1(t_span, y(:,3), t); + gamma = interp1(t_span, y(:,4), t); + alpha = interp1(t_span, alpha, t); + + CL = 2*pi*alpha; + CD = aerodata.CD0 + 0.05*CL^2; + + J = [0 0 0 0; + 0 0 0 0; + cos(gamma) sin(gamma) -aerodata.rho*aerodata.Sw*CD/aerodata.m*v (g/v^2)*cos(gamma); + -v*sin(gamma) v*cos(gamma) -g*cos(gamma) (g/v)*sin(gamma)]; + dpdt = -J*p; +end + +function dydt = dynamics(t, y, tf, alpha, g, aerodata, N) + v = y(3); + gamma = y(4); + + t_span = linspace(0, tf, N); + alpha = interp1(t_span, alpha, t); + CL = 2*pi*alpha; + CD = aerodata.CD0 + 0.05*CL^2; + + dydt = [ + v*cos(gamma); + v*sin(gamma); + -g*sin(gamma)-0.5*aerodata.rho*CD*aerodata.Sw*v^2/aerodata.m; + -(g/v)*cos(gamma) + ]; +end diff --git a/OptimalControl/drag/nodrag_data.mat b/OptimalControl/drag/nodrag_data.mat new file mode 100644 index 0000000000000000000000000000000000000000..11c37f998cc898ff4109459894cade001d68521a GIT binary patch literal 43037 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 literal 0 HcmV?d00001 diff --git a/OptimalControl/main_constraint_nodrag.m b/OptimalControl/nodrag/main_constraint_nodrag.m similarity index 96% rename from OptimalControl/main_constraint_nodrag.m rename to OptimalControl/nodrag/main_constraint_nodrag.m index 6daf4a198a..1bb9241214 100644 --- a/OptimalControl/main_constraint_nodrag.m +++ b/OptimalControl/nodrag/main_constraint_nodrag.m @@ -1,124 +1,124 @@ -function main_constraint_nodrag - persistent u_history J_history; - clc; close all - - g = 9.81; - lb = [0 0.01]; - ub = [10 pi/2]; - - x1_0 = 0; x2_0 = 0; v0 = 15; - gamma0 = deg2rad(40); - t0 = 0; tf = 2; - u0 = [tf; gamma0]; - - cost = @(u) f_cost(u, g, t0, v0, x1_0, x2_0); - constraint = @(u) groundConstraint(u, g, t0, v0, x1_0, x2_0); - - checkGradients(cost, u0); - checkGradients(constraint, u0); - - options = optimoptions("fmincon", ... - "OutputFcn", @store_fmincon, ... - "Algorithm", "sqp", ... - "DerivativeCheck", "on"); - - [u_opt, ~] = fmincon(cost, u0, [], [], [], [], lb, ub, @(u) nonlcon(u,constraint), options); - - y0 = [x1_0 x2_0 v0 u_opt(2)]; - t_span = linspace(t0, u_opt(1), 100); - [~, y] = ode45(@(t, y) dynamics(y, g), t_span, y0); - - disp(["Maximum distance [m] = ", num2str(y(end, 1))]) - disp(["Initial angle [°]: ", num2str(rad2deg(u_opt(2)))]) - disp(["Final Time [s]: ", num2str(u_opt(1))]) - - figure; plot(y(:,1), y(:,2), 'b-', 'LineWidth', 2); - xlabel("Horizontal distance [m]"); ylabel("Vertical distance [m]"); grid on; - - figure; plot(u_history(:,1), 'b-o', 'LineWidth', 2); - xlabel('Iteration'); ylabel('Final time [s]'); grid on; - - figure; plot(rad2deg(u_history(:,2)), 'r-o', 'LineWidth', 2); - xlabel('Iteration'); ylabel('Initial angle [°]'); grid on; - - figure; plot(J_history, 'o-', 'LineWidth', 2); - xlabel('Iteration'); ylabel('Cost function J'); grid on; - - vars = whos; - nodrag_results = struct(); - for i = 1:length(vars) - nodrag_results.(vars(i).name) = eval(vars(i).name); - end - save('nodrag_data.mat', 'nodrag_results'); - - function stop = store_fmincon(u, optimValues, state) - if optimValues.iteration == 0 - u_history = []; - J_history = []; - end - if strcmp(state, 'iter') - u_history = [u_history; u(:)']; - J_history = [J_history; optimValues.fval]; - assignin('base', 'u_iterations', u_history); - assignin('base', 'J_iterations', J_history); - end - stop = false; - end -end - -function [c, ceq, Dc, Dceq] = nonlcon(u,constraint) - c = []; - Dc = []; - [ceq, Dceq] = constraint(u); -end - -function [J, gradJ] = f_cost(u, g, t0, v0, x1_0, x2_0) - y0 = [x1_0 x2_0 v0 u(2)]; - t_span = linspace(t0, u(1), 1000); - [~, y] = ode45(@(t, y) dynamics(y, g), t_span, y0); - - J = -y(end,1); - dydt_final = dynamics(y(end,:)', g); - - pT = [1 0 0 0]; - [~, p] = ode45(@(t, p) p_ode(t, p, y, g, t_span), flip(t_span), pT); - q = p(end,:); - - gradJ = [-dydt_final(1); -q(4)]; -end - -function [ceq, Dceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0) - y0 = [x1_0 x2_0 v0 u(2)]'; - t_span = linspace(t0, u(1), 1000); - [~, y] = ode45(@(t, y) dynamics(y, g), t_span, y0); - - ceq = y(end,2); - dydt_final = dynamics(y(end,:)', g); - - pT = [0 -1 0 0]; - [~, p] = ode45(@(t, p) p_ode(t, p, y, g, t_span), flip(t_span), pT); - q = p(end,:); - - Dceq = [dydt_final(2); -q(4)]; -end - -function dpdt = p_ode(t, p, y, g, t_span) - v = interp1(t_span, y(:,3), t); - gamma = interp1(t_span, y(:,4), t); - J = [0 0 0 0; - 0 0 0 0; - cos(gamma) sin(gamma) 0 (g/v^2)*cos(gamma); - -v*sin(gamma) v*cos(gamma) -g*cos(gamma) (g/v)*sin(gamma)]; - dpdt = -J*p; -end - -function dydt = dynamics(y, g) - v = y(3); - gamma = y(4); - dydt = [ - v*cos(gamma); - v*sin(gamma); - -g*sin(gamma); - -(g/v)*cos(gamma) - ]; -end +function main_constraint_nodrag + persistent u_history J_history; + clc; close all + + g = 9.81; + lb = [0 0.01]; + ub = [10 pi/2]; + + x1_0 = 0; x2_0 = 0; v0 = 15; + gamma0 = deg2rad(40); + t0 = 0; tf = 2; + u0 = [tf; gamma0]; + + cost = @(u) f_cost(u, g, t0, v0, x1_0, x2_0); + constraint = @(u) groundConstraint(u, g, t0, v0, x1_0, x2_0); + + checkGradients(cost, u0); + checkGradients(constraint, u0); + + options = optimoptions("fmincon", ... + "OutputFcn", @store_fmincon, ... + "Algorithm", "sqp", ... + "DerivativeCheck", "on"); + + [u_opt, ~] = fmincon(cost, u0, [], [], [], [], lb, ub, @(u) nonlcon(u,constraint), options); + + y0 = [x1_0 x2_0 v0 u_opt(2)]; + t_span = linspace(t0, u_opt(1), 100); + [~, y] = ode45(@(t, y) dynamics(y, g), t_span, y0); + + disp(["Maximum distance [m] = ", num2str(y(end, 1))]) + disp(["Initial angle [°]: ", num2str(rad2deg(u_opt(2)))]) + disp(["Final Time [s]: ", num2str(u_opt(1))]) + + figure; plot(y(:,1), y(:,2), 'b-', 'LineWidth', 2); + xlabel("Horizontal distance [m]"); ylabel("Vertical distance [m]"); grid on; + + figure; plot(u_history(:,1), 'b-o', 'LineWidth', 2); + xlabel('Iteration'); ylabel('Final time [s]'); grid on; + + figure; plot(rad2deg(u_history(:,2)), 'r-o', 'LineWidth', 2); + xlabel('Iteration'); ylabel('Initial angle [°]'); grid on; + + figure; plot(J_history, 'o-', 'LineWidth', 2); + xlabel('Iteration'); ylabel('Cost function J'); grid on; + + vars = whos; + nodrag_results = struct(); + for i = 1:length(vars) + nodrag_results.(vars(i).name) = eval(vars(i).name); + end + save('nodrag_data.mat', 'nodrag_results'); + + function stop = store_fmincon(u, optimValues, state) + if optimValues.iteration == 0 + u_history = []; + J_history = []; + end + if strcmp(state, 'iter') + u_history = [u_history; u(:)']; + J_history = [J_history; optimValues.fval]; + assignin('base', 'u_iterations', u_history); + assignin('base', 'J_iterations', J_history); + end + stop = false; + end +end + +function [c, ceq, Dc, Dceq] = nonlcon(u,constraint) + c = []; + Dc = []; + [ceq, Dceq] = constraint(u); +end + +function [J, gradJ] = f_cost(u, g, t0, v0, x1_0, x2_0) + y0 = [x1_0 x2_0 v0 u(2)]; + t_span = linspace(t0, u(1), 1000); + [~, y] = ode45(@(t, y) dynamics(y, g), t_span, y0); + + J = -y(end,1); + dydt_final = dynamics(y(end,:)', g); + + pT = [1 0 0 0]; + [~, p] = ode45(@(t, p) p_ode(t, p, y, g, t_span), flip(t_span), pT); + q = p(end,:); + + gradJ = [-dydt_final(1); -q(4)]; +end + +function [ceq, Dceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0) + y0 = [x1_0 x2_0 v0 u(2)]'; + t_span = linspace(t0, u(1), 1000); + [~, y] = ode45(@(t, y) dynamics(y, g), t_span, y0); + + ceq = y(end,2); + dydt_final = dynamics(y(end,:)', g); + + pT = [0 -1 0 0]; + [~, p] = ode45(@(t, p) p_ode(t, p, y, g, t_span), flip(t_span), pT); + q = p(end,:); + + Dceq = [dydt_final(2); -q(4)]; +end + +function dpdt = p_ode(t, p, y, g, t_span) + v = interp1(t_span, y(:,3), t); + gamma = interp1(t_span, y(:,4), t); + J = [0 0 0 0; + 0 0 0 0; + cos(gamma) sin(gamma) 0 (g/v^2)*cos(gamma); + -v*sin(gamma) v*cos(gamma) -g*cos(gamma) (g/v)*sin(gamma)]; + dpdt = -J*p; +end + +function dydt = dynamics(y, g) + v = y(3); + gamma = y(4); + dydt = [ + v*cos(gamma); + v*sin(gamma); + -g*sin(gamma); + -(g/v)*cos(gamma) + ]; +end diff --git a/OptimalControl/nodrag/nodrag_data.mat b/OptimalControl/nodrag/nodrag_data.mat new file mode 100644 index 0000000000000000000000000000000000000000..db3fd08fdddadac5ae6c3a269062be22fe962189 GIT binary patch literal 42863 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 From b20c5c76d4c67d7a5a5aef0b524372369745fdd7 Mon Sep 17 00:00:00 2001 From: XaviPozo <168111392+XaviPozo@users.noreply.github.com> Date: Tue, 29 Apr 2025 23:59:39 +0200 Subject: [PATCH 04/22] Gradientes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se añaden los gradientes al ejemplo de control de alpha condrag, pero no converge. --- OptimalControl/drag/main_constraint_drag.m | 26 +++++++++++++-------- OptimalControl/drag/nodrag_data.mat | Bin 43037 -> 46206 bytes OptimalControl/nodrag/nodrag_data.mat | Bin 42863 -> 42863 bytes 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/OptimalControl/drag/main_constraint_drag.m b/OptimalControl/drag/main_constraint_drag.m index 0c611c28a7..11a318848a 100644 --- a/OptimalControl/drag/main_constraint_drag.m +++ b/OptimalControl/drag/main_constraint_drag.m @@ -12,11 +12,11 @@ x1_0 = 0; x2_0 = 0; v0 = 15; gamma0 = deg2rad(40); - t0 = 0; tf = 2; + t0 = 0; tf = 30; alpha0 = deg2rad(10); u0 = [tf; alpha0]; lb = [0 0.01]; % Lower bounds for the control - ub = [10 pi/2]; % Upper bounds for the control + ub = [50 deg2rad(10)]; % Upper bounds for the control u0 = [u0(1) ones(1,N)*u0(2)]; lb = [lb(1) ones(1,N)*lb(2)]; @@ -35,9 +35,9 @@ [u_opt, ~] = fmincon(cost, u0, [], [], [], [], lb, ub, @(u) nonlcon(u,constraint), options); - y0 = [x1_0 x2_0 v0 u_opt(2)]; + y0 = [x1_0 x2_0 v0 gamma0]; t_span = linspace(t0, u_opt(1), 100); - [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, aerodata, N), t_span, y0); + [~, y] = ode45(@(t, y) dynamics(t, y, tf, u_opt(2:N+1), g, aerodata, N), t_span, y0); disp(["Maximum distance [m] = ", num2str(y(end, 1))]) disp(["Initial angle [°]: ", num2str(rad2deg(u_opt(2)))]) @@ -83,12 +83,12 @@ [ceq, Dceq] = constraint(u); end -function [J, gradJ,q] = f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, aerodata, N) +function [J, gradJ] = f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, aerodata, N) y0 = [x1_0 x2_0 v0 gamma0]; tf = u(1); alpha = u(2:N+1); t_span = linspace(t0, u(1), N); - [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, aerodata, N), t_span, y0); + [t, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, aerodata, N), t_span, y0); J = -y(end,1); dydt_final = dynamics(t_span(end), y(end,:)', tf, alpha, g, aerodata, N); @@ -97,15 +97,18 @@ [~, p] = ode45(@(t, p) p_ode(t, p, y, g, t_span, alpha, aerodata), flip(t_span), pT); q = p(end,:); - gradJ = [-dydt_final(1); -q(4)*ones(100,1)]; + v = interp1(t_span, y(:,3), t); + DFdu = -0.1*aerodata.rho*v.^2*aerodata.Sw*pi^2/aerodata.m.*alpha'; + + gradJ = [-dydt_final(1); DFdu*q(3)]; end function [ceq, Dceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, aerodata, N) y0 = [x1_0 x2_0 v0 gamma0]'; tf = u(1); t_span = linspace(t0, tf, 100); - alpha = u(2:101); - [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, aerodata, N), t_span, y0); + alpha = u(2:N+1); + [t, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, aerodata, N), t_span, y0); ceq = y(end,2); dydt_final = dynamics(t_span(end), y(end,:)', tf, alpha, g, aerodata, N); @@ -114,7 +117,10 @@ [~, p] = ode45(@(t, p) p_ode(t, p, y, g, t_span, alpha, aerodata), flip(t_span), pT); q = p(end,:); - Dceq = [dydt_final(2); -q(4)*ones(100,1)]; + v = interp1(t_span, y(:,3), t); + DFdu = -0.1*aerodata.rho*v.^2*aerodata.Sw*pi.^2./aerodata.m.*alpha'; + + Dceq = [dydt_final(2); DFdu*q(3)]; end function dpdt = p_ode(t, p, y, g, t_span, alpha, aerodata) diff --git a/OptimalControl/drag/nodrag_data.mat b/OptimalControl/drag/nodrag_data.mat index 11c37f998cc898ff4109459894cade001d68521a..e8630c266b9623a0493ba16c31c5c0712f43d883 100644 GIT binary patch literal 46206 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

Z4K@AlP8A;GZNpV7k}I0=Ub# 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 literal 43037 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 diff --git a/OptimalControl/nodrag/nodrag_data.mat b/OptimalControl/nodrag/nodrag_data.mat index db3fd08fdddadac5ae6c3a269062be22fe962189..a8808a1670b6b4ab204d8b412d5273427af0f8d6 100644 GIT binary patch delta 43 zcmaEVj_Lh5rU@nzA*HDbjs-;uMwSXj##Y8=R;FeOMg~Tv69bheCa`WS`MnGPPF@bq delta 43 zcmaEVj_Lh5rU@nz!HFdbjs-;uMrH~ICRT< Date: Fri, 2 May 2025 11:07:44 +0200 Subject: [PATCH 05/22] Drag 02/05/2025 --- OptimalControl/drag/main_constraint_drag.m | 18 +++++++++--------- OptimalControl/drag/nodrag_data.mat | Bin 46206 -> 46208 bytes 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/OptimalControl/drag/main_constraint_drag.m b/OptimalControl/drag/main_constraint_drag.m index 11a318848a..c2fe134baf 100644 --- a/OptimalControl/drag/main_constraint_drag.m +++ b/OptimalControl/drag/main_constraint_drag.m @@ -8,7 +8,7 @@ aerodata.CD0 = 0.01; % Drag coefficient aerodata.m = 1; % Object mass [kg] - N = 100; % Discretization + N = 500; % Discretization x1_0 = 0; x2_0 = 0; v0 = 15; gamma0 = deg2rad(40); @@ -25,18 +25,18 @@ cost = @(u) f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, aerodata, N); constraint = @(u) groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, aerodata, N); - checkGradients(cost, u0); - checkGradients(constraint, u0); + [valid,err] = checkGradients(cost, u0, "Display","on") + [valid2,err2] = checkGradients(constraint, u0, "Display","on") options = optimoptions("fmincon", ... "OutputFcn", @store_fmincon, ... - "Algorithm", "sqp", ... - "DerivativeCheck", "on"); + "Algorithm", "sqp", ... + "DerivativeCheck", "on","Display","iter"); [u_opt, ~] = fmincon(cost, u0, [], [], [], [], lb, ub, @(u) nonlcon(u,constraint), options); y0 = [x1_0 x2_0 v0 gamma0]; - t_span = linspace(t0, u_opt(1), 100); + t_span = linspace(t0, u_opt(1), N); [~, y] = ode45(@(t, y) dynamics(t, y, tf, u_opt(2:N+1), g, aerodata, N), t_span, y0); disp(["Maximum distance [m] = ", num2str(y(end, 1))]) @@ -100,13 +100,13 @@ v = interp1(t_span, y(:,3), t); DFdu = -0.1*aerodata.rho*v.^2*aerodata.Sw*pi^2/aerodata.m.*alpha'; - gradJ = [-dydt_final(1); DFdu*q(3)]; + gradJ = [-dydt_final(1); -DFdu.*p(:,3)*((tf-t0)/N)]; end function [ceq, Dceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, aerodata, N) y0 = [x1_0 x2_0 v0 gamma0]'; tf = u(1); - t_span = linspace(t0, tf, 100); + t_span = linspace(t0, tf, N); alpha = u(2:N+1); [t, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, aerodata, N), t_span, y0); @@ -120,7 +120,7 @@ v = interp1(t_span, y(:,3), t); DFdu = -0.1*aerodata.rho*v.^2*aerodata.Sw*pi.^2./aerodata.m.*alpha'; - Dceq = [dydt_final(2); DFdu*q(3)]; + Dceq = [dydt_final(2); -DFdu.*p(:,3)*((tf-t0)/N)]; end function dpdt = p_ode(t, p, y, g, t_span, alpha, aerodata) diff --git a/OptimalControl/drag/nodrag_data.mat b/OptimalControl/drag/nodrag_data.mat index e8630c266b9623a0493ba16c31c5c0712f43d883..0bb8bd9ca73b6d5dbedb9cb0ad56950fce42af2c 100644 GIT binary patch delta 38663 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 %YendT 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 IpN{N@jN&vA;Q#;t delta 38736 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 From f571aea956aa47ab93b800d152daf8879cb367ac Mon Sep 17 00:00:00 2001 From: AlexFerrer <32134913+FerrerFerreAlex@users.noreply.github.com> Date: Fri, 2 May 2025 12:13:54 +0200 Subject: [PATCH 06/22] "chang" --- OptimalControl/drag/main_constraint_drag.m | 98 +++++++++++------- .../nodrag/main_constraint_nodrag.m | 16 +-- nodrag_data.mat | Bin 0 -> 42546 bytes 3 files changed, 69 insertions(+), 45 deletions(-) create mode 100644 nodrag_data.mat diff --git a/OptimalControl/drag/main_constraint_drag.m b/OptimalControl/drag/main_constraint_drag.m index c2fe134baf..4ab0ed3349 100644 --- a/OptimalControl/drag/main_constraint_drag.m +++ b/OptimalControl/drag/main_constraint_drag.m @@ -3,10 +3,13 @@ clc; close all g = 9.81; % Gravity [m/s^2] - aerodata.rho = 1.225; % Air density [kg/m^3] - aerodata.Sw = 2; % Wing/Aerodynamic surface [m^2] - aerodata.CD0 = 0.01; % Drag coefficient - aerodata.m = 1; % Object mass [kg] + rho = 1.225; % Air density [kg/m^3] + Sw = 2; % Wing/Aerodynamic surface [m^2] + Cd0 = 0.01; % Drag coefficient + m = 1; % Object mass [kg] + k = 0.05; + Clalpha = 2*pi; + Cl0 = 0; N = 500; % Discretization @@ -22,8 +25,19 @@ lb = [lb(1) ones(1,N)*lb(2)]; ub = [ub(1) ones(1,N)*ub(2)]; - cost = @(u) f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, aerodata, N); - constraint = @(u) groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, aerodata, N); + Cl = @(alpha) Cl0 + Clalpha*alpha; + Cd = @(alpha) Cd0 + k*Cl(alpha).^2; + D = @(V,alpha) 0.5*rho*Sw*V.^2.*Cd(alpha)/m; + + dCl = Clalpha; + dCd = @(alpha) 2*k*Cl(alpha)*dCl; + dDda = @(V,alpha) 0.5*rho*Sw*V.^2.*dCd(alpha)/m; + + dDragdv = @(V,alpha) rho*Sw*V.*Cd(alpha)/m; + + + cost = @(u) f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D,dDda,dDragdv, N); + constraint = @(u) groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D,dDda,dDragdv, N); [valid,err] = checkGradients(cost, u0, "Display","on") [valid2,err2] = checkGradients(constraint, u0, "Display","on") @@ -37,7 +51,7 @@ y0 = [x1_0 x2_0 v0 gamma0]; t_span = linspace(t0, u_opt(1), N); - [~, y] = ode45(@(t, y) dynamics(t, y, tf, u_opt(2:N+1), g, aerodata, N), t_span, y0); + [~, y] = ode45(@(t, y) dynamics(t, y, tf, u_opt(2:N+1), g, D, N), t_span, y0); disp(["Maximum distance [m] = ", num2str(y(end, 1))]) disp(["Initial angle [°]: ", num2str(rad2deg(u_opt(2)))]) @@ -83,74 +97,82 @@ [ceq, Dceq] = constraint(u); end -function [J, gradJ] = f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, aerodata, N) +function [J, gradJ] = f_cost(u, g, t0, v0, gamma0, x1_0, x2_0,Drag,dDragdv,dDragda, N) y0 = [x1_0 x2_0 v0 gamma0]; tf = u(1); alpha = u(2:N+1); - t_span = linspace(t0, u(1), N); - [t, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, aerodata, N), t_span, y0); + t_span = linspace(t0, u(1), N); + [t, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, Drag, N), t_span, y0); J = -y(end,1); - dydt_final = dynamics(t_span(end), y(end,:)', tf, alpha, g, aerodata, N); + dydt_final = dynamics(t_span(end), y(end,:)', tf, alpha, g, Drag, N); pT = [1 0 0 0]; - [~, p] = ode45(@(t, p) p_ode(t, p, y, g, t_span, alpha, aerodata), flip(t_span), pT); - q = p(end,:); + [~, p] = ode45(@(t, p) adjoint(t, p, y, g, t_span, alpha, dDragdv), flip(t_span), pT); + - v = interp1(t_span, y(:,3), t); - DFdu = -0.1*aerodata.rho*v.^2*aerodata.Sw*pi^2/aerodata.m.*alpha'; + ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; + v = y(ind,3); + %v = interp1(t_span, y(:,3), t); + DFdu = -dDragda(v,alpha'); - gradJ = [-dydt_final(1); -DFdu.*p(:,3)*((tf-t0)/N)]; + gradJ = [-dydt_final(1); -DFdu.*p(:,3)]; end -function [ceq, Dceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, aerodata, N) +function [ceq, Dceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, Drag,dDragdv,dDragda, N) y0 = [x1_0 x2_0 v0 gamma0]'; tf = u(1); t_span = linspace(t0, tf, N); alpha = u(2:N+1); - [t, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, aerodata, N), t_span, y0); + [t, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, Drag, N), t_span, y0); ceq = y(end,2); - dydt_final = dynamics(t_span(end), y(end,:)', tf, alpha, g, aerodata, N); + dydt_final = dynamics(t_span(end), y(end,:)', tf, alpha, g, Drag, N); pT = [0 -1 0 0]; - [~, p] = ode45(@(t, p) p_ode(t, p, y, g, t_span, alpha, aerodata), flip(t_span), pT); - q = p(end,:); + [~, p] = ode45(@(t, p) adjoint(t, p, y, g, t_span, alpha, dDragdv), flip(t_span), pT); + - v = interp1(t_span, y(:,3), t); - DFdu = -0.1*aerodata.rho*v.^2*aerodata.Sw*pi.^2./aerodata.m.*alpha'; + %v = interp1(t_span, y(:,3), t); + ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; + v = y(ind,3); + DFdu = dDragda(v,alpha'); - Dceq = [dydt_final(2); -DFdu.*p(:,3)*((tf-t0)/N)]; + Dceq = [dydt_final(2); -DFdu.*p(:,3)]; end -function dpdt = p_ode(t, p, y, g, t_span, alpha, aerodata) - v = interp1(t_span, y(:,3), t); - gamma = interp1(t_span, y(:,4), t); - alpha = interp1(t_span, alpha, t); - - CL = 2*pi*alpha; - CD = aerodata.CD0 + 0.05*CL^2; +function dpdt = adjoint(t, p, y, g, t_span, alpha, dDragdv) + %v = interp1(t_span, y(:,3), t); + %gamma = interp1(t_span, y(:,4), t); + %alpha = interp1(t_span, alpha, t); + + ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; + v = y(ind,3); + gamma = y(ind,4); + alpha = alpha(ind); J = [0 0 0 0; 0 0 0 0; - cos(gamma) sin(gamma) -aerodata.rho*aerodata.Sw*CD/aerodata.m*v (g/v^2)*cos(gamma); + cos(gamma) sin(gamma) -dDragdv(v,alpha') (g/v^2)*cos(gamma); -v*sin(gamma) v*cos(gamma) -g*cos(gamma) (g/v)*sin(gamma)]; dpdt = -J*p; end -function dydt = dynamics(t, y, tf, alpha, g, aerodata, N) +function dydt = dynamics(t, y, tf, alpha, g, Drag, N) v = y(3); gamma = y(4); - t_span = linspace(0, tf, N); - alpha = interp1(t_span, alpha, t); - CL = 2*pi*alpha; - CD = aerodata.CD0 + 0.05*CL^2; + t_span = linspace(0, tf, N); + ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; + alpha = alpha(ind); + + + %alpha = interp1(t_span, alpha, t); dydt = [ v*cos(gamma); v*sin(gamma); - -g*sin(gamma)-0.5*aerodata.rho*CD*aerodata.Sw*v^2/aerodata.m; + -g*sin(gamma)-Drag(v,alpha); -(g/v)*cos(gamma) ]; end diff --git a/OptimalControl/nodrag/main_constraint_nodrag.m b/OptimalControl/nodrag/main_constraint_nodrag.m index 1bb9241214..c37dd9e5e6 100644 --- a/OptimalControl/nodrag/main_constraint_nodrag.m +++ b/OptimalControl/nodrag/main_constraint_nodrag.m @@ -14,8 +14,8 @@ cost = @(u) f_cost(u, g, t0, v0, x1_0, x2_0); constraint = @(u) groundConstraint(u, g, t0, v0, x1_0, x2_0); - checkGradients(cost, u0); - checkGradients(constraint, u0); + checkGradients(cost, u0,'Tolerance',1e-3) + checkGradients(constraint,u0,'Tolerance',1e-3) options = optimoptions("fmincon", ... "OutputFcn", @store_fmincon, ... @@ -81,7 +81,7 @@ dydt_final = dynamics(y(end,:)', g); pT = [1 0 0 0]; - [~, p] = ode45(@(t, p) p_ode(t, p, y, g, t_span), flip(t_span), pT); + [~, p] = ode45(@(t, p) adjoint(t, p, y, g, t_span), flip(t_span), pT); q = p(end,:); gradJ = [-dydt_final(1); -q(4)]; @@ -96,15 +96,17 @@ dydt_final = dynamics(y(end,:)', g); pT = [0 -1 0 0]; - [~, p] = ode45(@(t, p) p_ode(t, p, y, g, t_span), flip(t_span), pT); + [~, p] = ode45(@(t, p) adjoint(t, p, y, g, t_span), flip(t_span), pT); q = p(end,:); Dceq = [dydt_final(2); -q(4)]; end -function dpdt = p_ode(t, p, y, g, t_span) - v = interp1(t_span, y(:,3), t); - gamma = interp1(t_span, y(:,4), t); +function dpdt = adjoint(t, p, y, g, t_span) + ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; + v = y(ind,3); + gamma = y(ind,4); + J = [0 0 0 0; 0 0 0 0; cos(gamma) sin(gamma) 0 (g/v^2)*cos(gamma); diff --git a/nodrag_data.mat b/nodrag_data.mat new file mode 100644 index 0000000000000000000000000000000000000000..e41e4d3f5169f84275fe649d15353c469eaeb615 GIT binary patch literal 42546 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

%Q2KsW@Ao7dt;k83L2>gW3 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 Date: Mon, 12 May 2025 23:53:54 +0200 Subject: [PATCH 07/22] Update main_constraint_drag.m --- OptimalControl/drag/main_constraint_drag.m | 101 +++++++++++---------- 1 file changed, 54 insertions(+), 47 deletions(-) diff --git a/OptimalControl/drag/main_constraint_drag.m b/OptimalControl/drag/main_constraint_drag.m index 4ab0ed3349..3e7825d9ca 100644 --- a/OptimalControl/drag/main_constraint_drag.m +++ b/OptimalControl/drag/main_constraint_drag.m @@ -11,7 +11,7 @@ Clalpha = 2*pi; Cl0 = 0; - N = 500; % Discretization + N = 50; % Discretization x1_0 = 0; x2_0 = 0; v0 = 15; gamma0 = deg2rad(40); @@ -25,22 +25,25 @@ lb = [lb(1) ones(1,N)*lb(2)]; ub = [ub(1) ones(1,N)*ub(2)]; + % Previous calculations (Derivatives) + Cl = @(alpha) Cl0 + Clalpha*alpha; Cd = @(alpha) Cd0 + k*Cl(alpha).^2; - D = @(V,alpha) 0.5*rho*Sw*V.^2.*Cd(alpha)/m; + D = @(V,alpha) 0.5*rho*Sw*V.^2.*Cd(alpha); - dCl = Clalpha; - dCd = @(alpha) 2*k*Cl(alpha)*dCl; - dDda = @(V,alpha) 0.5*rho*Sw*V.^2.*dCd(alpha)/m; - - dDragdv = @(V,alpha) rho*Sw*V.*Cd(alpha)/m; + dCl = Clalpha; % Derivative respecto to alpha + dCd = @(alpha) 2*k*Cl(alpha)*dCl; % Derivative respect to alpha + dDda = @(V,alpha) 0.5*rho*Sw*V.^2.*dCd(alpha); % Derivative respect to alpha + dDdv = @(V,alpha) rho*Sw*V.*Cd(alpha); % Derivative respect to velocity - cost = @(u) f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D,dDda,dDragdv, N); - constraint = @(u) groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D,dDda,dDragdv, N); + cost = @(u) f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D, dDda, dDdv, N, m); + constraint = @(u) groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, dDda, dDdv, N, m); - [valid,err] = checkGradients(cost, u0, "Display","on") - [valid2,err2] = checkGradients(constraint, u0, "Display","on") + [valid,err] = checkGradients(cost, u0, 'Tolerance', 1e-3, 'Display', 'on'); + assignin('base', 'err', err); + [valid2,err2] = checkGradients(constraint, u0, 'Tolerance', 1e-3, 'Display', 'on') + assignin('base', 'err2', err2); options = optimoptions("fmincon", ... "OutputFcn", @store_fmincon, ... @@ -51,7 +54,7 @@ y0 = [x1_0 x2_0 v0 gamma0]; t_span = linspace(t0, u_opt(1), N); - [~, y] = ode45(@(t, y) dynamics(t, y, tf, u_opt(2:N+1), g, D, N), t_span, y0); + [~, y] = ode45(@(t, y) dynamics(t, y, tf, u_opt(2:N+1), g, D, N, m), t_span, y0); disp(["Maximum distance [m] = ", num2str(y(end, 1))]) disp(["Initial angle [°]: ", num2str(rad2deg(u_opt(2)))]) @@ -74,7 +77,6 @@ for i = 1:length(vars) nodrag_results.(vars(i).name) = eval(vars(i).name); end - save('nodrag_data.mat', 'nodrag_results'); function stop = store_fmincon(u, optimValues, state) if optimValues.iteration == 0 @@ -97,82 +99,87 @@ [ceq, Dceq] = constraint(u); end -function [J, gradJ] = f_cost(u, g, t0, v0, gamma0, x1_0, x2_0,Drag,dDragdv,dDragda, N) +function [J, gradJ] = f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D, dDdv, dDda, N, m) y0 = [x1_0 x2_0 v0 gamma0]; tf = u(1); alpha = u(2:N+1); t_span = linspace(t0, u(1), N); - [t, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, Drag, N), t_span, y0); + [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, D, N, m), t_span, y0); J = -y(end,1); - dydt_final = dynamics(t_span(end), y(end,:)', tf, alpha, g, Drag, N); + dydt_final = dynamics(t_span(end), y(end,:)', tf, alpha, g, D, N, m); pT = [1 0 0 0]; - [~, p] = ode45(@(t, p) adjoint(t, p, y, g, t_span, alpha, dDragdv), flip(t_span), pT); + [~, p] = ode45(@(t, p) adjoint(t, p, y, g, t_span, alpha, dDdv, m), flip(t_span), pT); - ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; - v = y(ind,3); + % ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; + % v = y(ind,3); %v = interp1(t_span, y(:,3), t); - DFdu = -dDragda(v,alpha'); - - gradJ = [-dydt_final(1); -DFdu.*p(:,3)]; + v = y(:,3); + DFdu = -dDda(v,alpha')./m; + + % gradJ = [-dydt_final(1); DFdu.*p(:,3)]; + gradJ = zeros(N+1,1); + gradJ(1) = -dydt_final(1); + for i = 1:N + gradJ(i+1) = DFdu(i) * p(i,3); + end end -function [ceq, Dceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, Drag,dDragdv,dDragda, N) +function [ceq, Dceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, dDdv, dDda, N, m) y0 = [x1_0 x2_0 v0 gamma0]'; tf = u(1); t_span = linspace(t0, tf, N); alpha = u(2:N+1); - [t, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, Drag, N), t_span, y0); + [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, D, N, m), t_span, y0); ceq = y(end,2); - dydt_final = dynamics(t_span(end), y(end,:)', tf, alpha, g, Drag, N); + dydt_final = dynamics(t_span(end), y(end,:)', tf, alpha, g, D, N, m); pT = [0 -1 0 0]; - [~, p] = ode45(@(t, p) adjoint(t, p, y, g, t_span, alpha, dDragdv), flip(t_span), pT); + [~, p] = ode45(@(t, p) adjoint(t, p, y, g, t_span, alpha, dDdv, m), flip(t_span), pT); + % v = interp1(t_span, y(:,3), t); + % ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; + % v = y(ind,3); + v = y(:,3); + DFdu = -dDda(v,alpha'); - %v = interp1(t_span, y(:,3), t); - ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; - v = y(ind,3); - DFdu = dDragda(v,alpha'); - - Dceq = [dydt_final(2); -DFdu.*p(:,3)]; + Dceq = [dydt_final(2); DFdu.*p(:,3)]; end -function dpdt = adjoint(t, p, y, g, t_span, alpha, dDragdv) - %v = interp1(t_span, y(:,3), t); - %gamma = interp1(t_span, y(:,4), t); - %alpha = interp1(t_span, alpha, t); +function dpdt = adjoint(t, p, y, g, t_span, alpha, dDdv, m) + v = interp1(t_span, y(:,3), t); + gamma = interp1(t_span, y(:,4), t); + alpha = interp1(t_span, alpha, t); - ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; - v = y(ind,3); - gamma = y(ind,4); - alpha = alpha(ind); + % ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; + % v = y(ind,3); + % gamma = y(ind,4); + % alpha = alpha(ind); J = [0 0 0 0; 0 0 0 0; - cos(gamma) sin(gamma) -dDragdv(v,alpha') (g/v^2)*cos(gamma); + cos(gamma) sin(gamma) -dDdv(v,alpha')./m (g/v^2)*cos(gamma); -v*sin(gamma) v*cos(gamma) -g*cos(gamma) (g/v)*sin(gamma)]; dpdt = -J*p; end -function dydt = dynamics(t, y, tf, alpha, g, Drag, N) +function dydt = dynamics(t, y, tf, alpha, g, D, N, m) v = y(3); gamma = y(4); t_span = linspace(0, tf, N); - ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; - alpha = alpha(ind); - + % ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; + % alpha = alpha(ind); - %alpha = interp1(t_span, alpha, t); + alpha = interp1(t_span, alpha, t); dydt = [ v*cos(gamma); v*sin(gamma); - -g*sin(gamma)-Drag(v,alpha); + -g*sin(gamma)-D(v,alpha)/m; -(g/v)*cos(gamma) ]; end From 6d034ffd730ad1720902573d12933bf6ed7f840b Mon Sep 17 00:00:00 2001 From: FerrerFerreAlex <32134913+FerrerFerreAlex@users.noreply.github.com> Date: Thu, 29 May 2025 20:21:17 +0200 Subject: [PATCH 08/22] Update main_constraint_drag.m --- OptimalControl/drag/main_constraint_drag.m | 26 +++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/OptimalControl/drag/main_constraint_drag.m b/OptimalControl/drag/main_constraint_drag.m index 3e7825d9ca..396b597437 100644 --- a/OptimalControl/drag/main_constraint_drag.m +++ b/OptimalControl/drag/main_constraint_drag.m @@ -40,10 +40,10 @@ cost = @(u) f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D, dDda, dDdv, N, m); constraint = @(u) groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, dDda, dDdv, N, m); - [valid,err] = checkGradients(cost, u0, 'Tolerance', 1e-3, 'Display', 'on'); - assignin('base', 'err', err); - [valid2,err2] = checkGradients(constraint, u0, 'Tolerance', 1e-3, 'Display', 'on') - assignin('base', 'err2', err2); + %[valid,err] = checkGradients(cost, u0, 'Tolerance', 1e-3, 'Display', 'on'); + %assignin('base', 'err', err); + %[valid2,err2] = checkGradients(constraint, u0, 'Tolerance', 1e-3, 'Display', 'on') + %assignin('base', 'err2', err2); options = optimoptions("fmincon", ... "OutputFcn", @store_fmincon, ... @@ -103,7 +103,7 @@ y0 = [x1_0 x2_0 v0 gamma0]; tf = u(1); alpha = u(2:N+1); - t_span = linspace(t0, u(1), N); + t_span = linspace(t0, tf, N); [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, D, N, m), t_span, y0); J = -y(end,1); @@ -119,12 +119,12 @@ v = y(:,3); DFdu = -dDda(v,alpha')./m; - % gradJ = [-dydt_final(1); DFdu.*p(:,3)]; - gradJ = zeros(N+1,1); - gradJ(1) = -dydt_final(1); - for i = 1:N - gradJ(i+1) = DFdu(i) * p(i,3); - end + gradJ = [-dydt_final(1); -DFdu.*p(:,3)]; + %gradJ = zeros(N+1,1); + %gradJ(1) = -dydt_final(1); + %for i = 1:N + %gradJ(i+1) = DFdu(i) * p(i,3); + %end end function [ceq, Dceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, dDdv, dDda, N, m) @@ -146,7 +146,7 @@ v = y(:,3); DFdu = -dDda(v,alpha'); - Dceq = [dydt_final(2); DFdu.*p(:,3)]; + Dceq = [dydt_final(2); -DFdu.*p(:,3)]; end function dpdt = adjoint(t, p, y, g, t_span, alpha, dDdv, m) @@ -161,7 +161,7 @@ J = [0 0 0 0; 0 0 0 0; - cos(gamma) sin(gamma) -dDdv(v,alpha')./m (g/v^2)*cos(gamma); + cos(gamma) sin(gamma) -dDdv(v,alpha)./m (g/v^2)*cos(gamma); -v*sin(gamma) v*cos(gamma) -g*cos(gamma) (g/v)*sin(gamma)]; dpdt = -J*p; end From 06e95ca3e890a41b82bca6e96d4557ee2ced8632 Mon Sep 17 00:00:00 2001 From: XaviPozo <168111392+XaviPozo@users.noreply.github.com> Date: Thu, 29 May 2025 20:23:56 +0200 Subject: [PATCH 09/22] pruebas --- OptimalControl/cesc/Shooting.m | 131 ++++++ OptimalControl/cesc/Trapezoidal_direct.m | 119 ++++++ .../cesc/fm_mex_source_zermelo.mexw64 | Bin 0 -> 108544 bytes .../fm_mex_source_zermelo/cpp/_clang-format | 27 ++ .../fm_mex_source_zermelo/cpp/buildInfo.mat | Bin 0 -> 7488 bytes .../fm_mex_source_zermelo/cpp/codeInfo.mat | Bin 0 -> 12136 bytes .../cpp/codedescriptor.dmr | Bin 0 -> 580608 bytes .../fm_mex_source_zermelo/cpp/compileInfo.mat | Bin 0 -> 3020 bytes .../cpp/examples/main.cpp | 86 ++++ .../fm_mex_source_zermelo/cpp/examples/main.h | 54 +++ .../_coder_mb_fm_mex_source_zermelo_api.cpp | 214 ++++++++++ .../_coder_mb_fm_mex_source_zermelo_api.h | 42 ++ .../_coder_mb_fm_mex_source_zermelo_info.cpp | 84 ++++ .../_coder_mb_fm_mex_source_zermelo_info.h | 21 + .../_coder_mb_fm_mex_source_zermelo_mex.cpp | 70 ++++ .../_coder_mb_fm_mex_source_zermelo_mex.h | 30 ++ .../cpp/mb_fm_mex_source_zermelo.cpp | 98 +++++ .../cpp/mb_fm_mex_source_zermelo.h | 33 ++ .../cpp/mb_fm_mex_source_zermelo_CALL.cpp | 211 ++++++++++ .../cpp/mb_fm_mex_source_zermelo_rtw.bat | 16 + .../cpp/mb_fm_mex_source_zermelo_rtw.mk | 391 ++++++++++++++++++ .../cpp/mb_fm_mex_source_zermelo_rtw.rsp | 1 + .../cpp/mb_fm_mex_source_zermelo_rtw_comp.rsp | 4 + .../cpp/mb_fm_mex_source_zermelo_rtw_ref.rsp | 0 .../cpp/mb_fm_mex_source_zermelo_types.h | 22 + .../fm_mex_source_zermelo/cpp/rtw_proj.tmw | 1 + .../fm_mex_source_zermelo/cpp/rtwtypes.h | 44 ++ .../fm_mex_source_zermelo/cpp/setup_mingw.bat | 2 + .../diff/mb_fm_mex_source_zermelo.m | 41 ++ ...398ef064917340965807c0c11f1a7ead-meta.json | 1 + ...sys_398ef064917340965807c0c11f1a7ead_jac.m | 22 + OptimalControl/cesc/main.m | 122 ++++++ OptimalControl/cesc/source_zermelo.m | 24 ++ OptimalControl/drag pruebas/drag_data.mat | Bin 0 -> 42849 bytes .../drag pruebas/main_constraint_drag.m | 183 ++++++++ OptimalControl/drag pruebas/nodrag_data.mat | Bin 0 -> 46208 bytes OptimalControl/drag/main_constraint_drag.m | 12 +- .../nodrag/main_constraint_nodrag.m | 41 +- OptimalControl/nodrag/nodrag_data.mat | Bin 42863 -> 65257 bytes 39 files changed, 2133 insertions(+), 14 deletions(-) create mode 100644 OptimalControl/cesc/Shooting.m create mode 100644 OptimalControl/cesc/Trapezoidal_direct.m create mode 100644 OptimalControl/cesc/fm_mex_source_zermelo.mexw64 create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/_clang-format create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/buildInfo.mat create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/codeInfo.mat create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/codedescriptor.dmr create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/compileInfo.mat create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/examples/main.cpp create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/examples/main.h create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_api.cpp create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_api.h create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_info.cpp create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_info.h create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_mex.cpp create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_mex.h create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo.cpp create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo.h create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_CALL.cpp create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.bat create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.mk create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.rsp create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw_comp.rsp create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw_ref.rsp create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_types.h create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/rtw_proj.tmw create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/rtwtypes.h create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/setup_mingw.bat create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/diff/mb_fm_mex_source_zermelo.m create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/diff/sys_398ef064917340965807c0c11f1a7ead-meta.json create mode 100644 OptimalControl/cesc/fm_models/fm_mex_source_zermelo/diff/sys_398ef064917340965807c0c11f1a7ead_jac.m create mode 100644 OptimalControl/cesc/main.m create mode 100644 OptimalControl/cesc/source_zermelo.m create mode 100644 OptimalControl/drag pruebas/drag_data.mat create mode 100644 OptimalControl/drag pruebas/main_constraint_drag.m create mode 100644 OptimalControl/drag pruebas/nodrag_data.mat diff --git a/OptimalControl/cesc/Shooting.m b/OptimalControl/cesc/Shooting.m new file mode 100644 index 0000000000..ab5391fd15 --- /dev/null +++ b/OptimalControl/cesc/Shooting.m @@ -0,0 +1,131 @@ +% INDIRECT METHOD => Shooting technique to solve boundary problem +% Solver for root finding -> fsolve + + +clc; +clear; + +global error_x_history error_y_history +error_x_history = []; +error_y_history = []; + +% Initial guess for [k, tf] + +guess = [0, 40]; % k is c3 in the notes. tf is the final time + +% Root-finding (using fsolve) to compute optimal values of k and tf + +options = optimoptions('fsolve', 'Display', 'iter', 'FunctionTolerance', 1e-6); + +solution = fsolve(@residual_function, guess, options); + +k_sol = solution(1); +tf_sol = solution(2); + +fprintf('\nSolution found:\n'); +fprintf('k = %.6f\n', k_sol); +fprintf('tf = %.6f\n', tf_sol); + +% Integrate final trajectory once optimal k and tf are obtained + +[x_sol, y_sol, t_sol] = integrate_trajectory(k_sol, tf_sol); + +% Results plot + +set(groot, 'defaultTextInterpreter', 'latex'); +set(groot, 'defaultAxesTickLabelInterpreter', 'latex'); +set(groot, 'defaultLegendInterpreter', 'latex'); + +figure; +plot(x_sol, y_sol, 'b-', 'LineWidth', 2); +hold on; +plot(0, 0, 'go', 'MarkerSize', 8, 'MarkerFaceColor', 'g'); % Start +plot(1000, 200, 'ro', 'MarkerSize', 8, 'MarkerFaceColor', 'r'); % Target +grid on; +xlabel('x'); +ylabel('y'); +title('Optimal Trajectory Found Using Shooting Method'); +legend('Trajectory', 'Start', 'Target'); +ylim([0 250]) +xlim([0 1000]) + +t_plot = linspace(0, tf_sol, 1000); +alpha_plot = atan(-0.5 * t_plot + k_sol); + +figure; +plot(t_plot, rad2deg(alpha_plot), 'r', 'LineWidth', 2); +grid on; +xlabel('Time [s]'); +ylabel('$\alpha$ [deg]'); +title('Control Angle $\alpha$ Over Time'); + +V = 30; +xdot = V * cos(alpha_plot); +ydot = V * sin(alpha_plot); + +figure; +plot(t_plot, xdot, 'b', 'LineWidth', 2); +hold on; +plot(t_plot, ydot, 'm--', 'LineWidth', 2); +grid on; +xlabel('Time [s]'); +ylabel('Velocity Components [m/s]'); +legend('$v_x$', '$v_y$'); +title('Velocity Components Over Time'); + +figure; +subplot(2,1,1); +plot(1:length(error_x_history), error_x_history, 'b-o', 'LineWidth', 2); +grid on; +xlabel('Iteration'); +ylabel('Error in x [m]'); +title('Error in $x(t_f)$ Over FSOLVE Iterations'); + +subplot(2,1,2); +plot(1:length(error_y_history), error_y_history, 'r-s', 'LineWidth', 2); +grid on; +xlabel('Iteration'); +ylabel('Error in y [m]'); +title('Error in $y(t_f)$ Over FSOLVE Iterations'); + + +% Function Definitions + +function F = residual_function(params) + global error_x_history error_y_history + k = params(1); + tf = params(2); + + % Integrate system from t=0 to t=tf + [x_sol, y_sol, ~] = integrate_trajectory(k, tf); + + x_tf = x_sol(end); + y_tf = y_sol(end); + + % Errores con respecto al objetivo + ex = x_tf - 1000; + ey = y_tf - 200; + + % Guardar los errores por separado + error_x_history(end+1) = ex; + error_y_history(end+1) = ey; + + % Boundary errors + F = [x_tf - 1000; y_tf - 200]; +end + +function [x_vals, y_vals, t_vals] = integrate_trajectory(k, tf) + V = 30; + z0 = [0; 0]; % Initial conditions: x(0)=0, y(0)=0 + + % Define ODE system + odefun = @(t, z) [ + V * cos(atan(-0.5 * t + k)) + 0.5 * z(2); % xdot + V * sin(atan(-0.5 * t + k)) % ydot + ]; + + % Integrate with ode45 + [t_vals, z] = ode45(odefun, [0 tf], z0); + x_vals = z(:,1); + y_vals = z(:,2); +end diff --git a/OptimalControl/cesc/Trapezoidal_direct.m b/OptimalControl/cesc/Trapezoidal_direct.m new file mode 100644 index 0000000000..2669448c48 --- /dev/null +++ b/OptimalControl/cesc/Trapezoidal_direct.m @@ -0,0 +1,119 @@ +% DIRECT COLLOCATION METHOD => Solved with own transcription +% Trapezoidal discretization +% NLP solver -> fmincon + +clear; +clc; + +% Problem inputs + +N = 50; % number of mesh intervals +x0 = 0; y0 = 0; % initial state +xf = 1000; yf = 200; % target state +V = 30; % Velocity module + +% Initial guesses + +tf_guess = 40; % initial guess for final time +x_guess = linspace(x0, xf, N+1); % straight line +y_guess = linspace(y0, yf, N+1); % straight line +alpha_guess = atan2(diff(y_guess), diff(x_guess)); +alpha_guess = [alpha_guess, alpha_guess(end)]; % N+1 + +z0 = [x_guess, y_guess, alpha_guess, tf_guess]'; % column + +% bounds for variables + +lb = [-inf*ones(3*(N+1),1); 1]; % tf ≥ 1 s +ub = [ inf*ones(2*(N+1),1); pi*ones(N+1,1); 1e4]; % tf ≤ 10 000 s + +% fmincon solver options + +opts = optimoptions('fmincon','Display','iter','MaxFunEvals',1e6,... + 'MaxIter',1e3,'Algorithm','interior-point'); + +% solve NLP problem using fmincon + +z_opt = fmincon(@objective, z0, [], [], [], [], ... + lb, ub, @(z) constraints(z, xf, yf,V), opts); + +% plot result + +np1 = (length(z_opt)-1)/3; +x = z_opt(1:np1); +y = z_opt(np1+1:2*np1); +alpha = z_opt(2*np1+1:3*np1); +tf = z_opt(end); +t = linspace(0, tf, np1); + +set(groot, 'defaultTextInterpreter', 'latex'); +set(groot, 'defaultAxesTickLabelInterpreter', 'latex'); +set(groot, 'defaultLegendInterpreter', 'latex'); + +figure; +plot(x, y, 'b.-'); +xlabel('x'); ylabel('y'); grid on; +title('Optimal path'); + +alpha_deg = rad2deg(wrapToPi(alpha)); + +figure; +plot(t, alpha_deg, 'r.-','LineWidth', 2, 'MarkerSize', 10); +xlabel('Time [s]'); +ylabel('$\alpha$ $[^\circ]$'); +grid on; +title('Optimal heading angle'); + +% --- Trajectory plot --- +figure; +plot(x, y, 'b.-', 'LineWidth', 2, 'MarkerSize', 10); +hold on; +plot(x(1), y(1), 'go', 'MarkerSize', 8, 'MarkerFaceColor', 'g'); % Start +plot(x(end), y(end), 'ro', 'MarkerSize', 8, 'MarkerFaceColor', 'r'); % Target +grid on; +xlabel('x [m]'); +ylabel('y [m]'); +ylim([0 250]) +xlim([0 1000]) +title('Optimal Trajectory using Direct Collocation'); +legend('Trajectory', 'Start', 'Target', 'Location', 'best'); + +% cost function (minimize final time) + +function J = objective(z) + J = z(end); +end + +% constraints +function [c, ceq] = constraints(z, xf, yf,V) + + % decode decision vector + np1 = (length(z)-1)/3; % np1 = N + 1 + N = np1 - 1; % number of intervals + + x = z(1:np1); + y = z(np1+1:2*np1); + alpha = z(2*np1+1:3*np1); + tf = z(end); + h = tf / N; + + % trapezoidal dynamics + ceq_dyn = zeros(2*N,1); + for i = 1:N + f1_i = V*cos(alpha(i)) + 0.5*y(i); + f1_ip1 = V*cos(alpha(i+1)) + 0.5*y(i+1); + + f2_i = V*sin(alpha(i)); + f2_ip1 = V*sin(alpha(i+1)); + + ceq_dyn(i) = x(i+1) - x(i) - h/2*(f1_i + f1_ip1); + ceq_dyn(N+i) = y(i+1) - y(i) - h/2*(f2_i + f2_ip1); + end + + % boundary conditions + ceq_bc = [x(1); y(1); x(end)-xf; y(end)-yf]; + + % Put together all the constraints + ceq = [ceq_dyn; ceq_bc]; % equality constraints + c = []; % no inequality constraints +end diff --git a/OptimalControl/cesc/fm_mex_source_zermelo.mexw64 b/OptimalControl/cesc/fm_mex_source_zermelo.mexw64 new file mode 100644 index 0000000000000000000000000000000000000000..e4d87a779560ed8a56bff61f57fd4713d3065d6c GIT binary patch literal 108544 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�T6+X!$qosO5@fIVD=N-A`ESlP|_BVsbw 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 literal 0 HcmV?d00001 diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/_clang-format b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/_clang-format new file mode 100644 index 0000000000..55a16f7ec3 --- /dev/null +++ b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/_clang-format @@ -0,0 +1,27 @@ +BasedOnStyle: LLVM +Language: Cpp +IndentWidth: 2 +ColumnLimit: 80 +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: None +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +CommentPragmas: '^(Return Type|Arguments)\s*' +DeriveLineEnding : true +BreakBeforeBraces: Custom +BraceWrapping: + AfterClass: false + AfterControlStatement: false + AfterEnum: true + AfterFunction: true + AfterNamespace: false + AfterStruct: false + AfterUnion: false + AfterExternBlock: false + BeforeCatch: false + BeforeElse: false + SplitEmptyFunction: true + SplitEmptyRecord: true diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/buildInfo.mat b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/buildInfo.mat new file mode 100644 index 0000000000000000000000000000000000000000..131a6a19dcb62a8c262bd7250741cddf01a2f74c GIT binary patch literal 7488 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 literal 0 HcmV?d00001 diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/codedescriptor.dmr b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/codedescriptor.dmr new file mode 100644 index 0000000000000000000000000000000000000000..07722c0c3fc69757fde8f4858ab328bd0e8291c5 GIT binary patch literal 580608 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 literal 0 HcmV?d00001 diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/compileInfo.mat b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/compileInfo.mat new file mode 100644 index 0000000000000000000000000000000000000000..6eb9432bea60f4cde4fbd54680565ea18fdd7505 GIT binary patch literal 3020 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 +#include + +// Custom Header Code +#include +#define CHAR16_T uint16_t +#include "mex.h" +// Function Declarations +extern int main(int argc, char **argv); + +extern void main_mb_fm_mex_source_zermelo(); + +#endif +// End of code generation (main.h) diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_api.cpp b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_api.cpp new file mode 100644 index 0000000000..d532773afd --- /dev/null +++ b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_api.cpp @@ -0,0 +1,214 @@ +// +// Academic License - for use in teaching, academic research, and meeting +// course requirements at degree granting institutions only. Not for +// government, commercial, or other organizational use. +// +// _coder_mb_fm_mex_source_zermelo_api.cpp +// +// Code generation for function 'mb_fm_mex_source_zermelo' +// + +// Include files +#include "_coder_mb_fm_mex_source_zermelo_api.h" +#include "_coder_mb_fm_mex_source_zermelo_mex.h" + +// Variable Definitions +emlrtCTX emlrtRootTLSGlobal{nullptr}; + +emlrtContext emlrtContextGlobal{ + true, // bFirstTime + false, // bInitialized + 131642U, // fVersionInfo + nullptr, // fErrorFunction + "mb_fm_mex_source_zermelo", // fFunctionName + nullptr, // fRTCallStack + false, // bDebugMode + {2045744189U, 2170104910U, 2743257031U, 4284093946U}, // fSigWrd + nullptr // fSigMem +}; + +// Function Declarations +static real_T b_emlrt_marshallIn(const emlrtStack &sp, const mxArray *controls, + const char_T *identifier); + +static real_T b_emlrt_marshallIn(const emlrtStack &sp, const mxArray *u, + const emlrtMsgIdentifier *parentId); + +static const mxArray *b_emlrt_marshallOut(const real_T u[6]); + +static real_T (*c_emlrt_marshallIn(const emlrtStack &sp, const mxArray *src, + const emlrtMsgIdentifier *msgId))[2]; + +static real_T d_emlrt_marshallIn(const emlrtStack &sp, const mxArray *src, + const emlrtMsgIdentifier *msgId); + +static real_T (*emlrt_marshallIn(const emlrtStack &sp, const mxArray *states, + const char_T *identifier))[2]; + +static real_T (*emlrt_marshallIn(const emlrtStack &sp, const mxArray *u, + const emlrtMsgIdentifier *parentId))[2]; + +static const mxArray *emlrt_marshallOut(const real_T u[2]); + +// Function Definitions +static real_T b_emlrt_marshallIn(const emlrtStack &sp, const mxArray *controls, + const char_T *identifier) +{ + emlrtMsgIdentifier thisId; + real_T y; + thisId.fIdentifier = const_cast(identifier); + thisId.fParent = nullptr; + thisId.bParentIsCell = false; + y = b_emlrt_marshallIn(sp, emlrtAlias(controls), &thisId); + emlrtDestroyArray(&controls); + return y; +} + +static real_T b_emlrt_marshallIn(const emlrtStack &sp, const mxArray *u, + const emlrtMsgIdentifier *parentId) +{ + real_T y; + y = d_emlrt_marshallIn(sp, emlrtAlias(u), parentId); + emlrtDestroyArray(&u); + return y; +} + +static const mxArray *b_emlrt_marshallOut(const real_T u[6]) +{ + static const int32_T iv[2]{0, 0}; + static const int32_T iv1[2]{2, 3}; + const mxArray *m; + const mxArray *y; + y = nullptr; + m = emlrtCreateNumericArray(2, (const void *)&iv[0], mxDOUBLE_CLASS, mxREAL); + emlrtMxSetData((mxArray *)m, (void *)&u[0]); + emlrtSetDimensions((mxArray *)m, &iv1[0], 2); + emlrtAssign(&y, m); + return y; +} + +static real_T (*c_emlrt_marshallIn(const emlrtStack &sp, const mxArray *src, + const emlrtMsgIdentifier *msgId))[2] +{ + static const int32_T dims{2}; + real_T(*ret)[2]; + int32_T i; + boolean_T b{false}; + emlrtCheckVsBuiltInR2012b((emlrtConstCTX)&sp, msgId, src, "double", false, 1U, + (const void *)&dims, &b, &i); + ret = (real_T(*)[2])emlrtMxGetData(src); + emlrtDestroyArray(&src); + return ret; +} + +static real_T d_emlrt_marshallIn(const emlrtStack &sp, const mxArray *src, + const emlrtMsgIdentifier *msgId) +{ + static const int32_T dims{0}; + real_T ret; + emlrtCheckBuiltInR2012b((emlrtConstCTX)&sp, msgId, src, "double", false, 0U, + (const void *)&dims); + ret = *static_cast(emlrtMxGetData(src)); + emlrtDestroyArray(&src); + return ret; +} + +static real_T (*emlrt_marshallIn(const emlrtStack &sp, const mxArray *states, + const char_T *identifier))[2] +{ + emlrtMsgIdentifier thisId; + real_T(*y)[2]; + thisId.fIdentifier = const_cast(identifier); + thisId.fParent = nullptr; + thisId.bParentIsCell = false; + y = emlrt_marshallIn(sp, emlrtAlias(states), &thisId); + emlrtDestroyArray(&states); + return y; +} + +static real_T (*emlrt_marshallIn(const emlrtStack &sp, const mxArray *u, + const emlrtMsgIdentifier *parentId))[2] +{ + real_T(*y)[2]; + y = c_emlrt_marshallIn(sp, emlrtAlias(u), parentId); + emlrtDestroyArray(&u); + return y; +} + +static const mxArray *emlrt_marshallOut(const real_T u[2]) +{ + static const int32_T i{0}; + static const int32_T i1{2}; + const mxArray *m; + const mxArray *y; + y = nullptr; + m = emlrtCreateNumericArray(1, (const void *)&i, mxDOUBLE_CLASS, mxREAL); + emlrtMxSetData((mxArray *)m, (void *)&u[0]); + emlrtSetDimensions((mxArray *)m, &i1, 1); + emlrtAssign(&y, m); + return y; +} + +void mb_fm_mex_source_zermelo_api(const mxArray *const prhs[2], int32_T nlhs, + const mxArray *plhs[2]) +{ + emlrtStack st{ + nullptr, // site + nullptr, // tls + nullptr // prev + }; + real_T(*j_statesdot)[6]; + real_T(*states)[2]; + real_T(*statesdot)[2]; + real_T controls; + st.tls = emlrtRootTLSGlobal; + statesdot = (real_T(*)[2])mxMalloc(sizeof(real_T[2])); + j_statesdot = (real_T(*)[6])mxMalloc(sizeof(real_T[6])); + // Marshall function inputs + states = emlrt_marshallIn(st, emlrtAlias(prhs[0]), "states"); + controls = b_emlrt_marshallIn(st, emlrtAliasP(prhs[1]), "controls"); + // Invoke the target function + mb_fm_mex_source_zermelo(*states, controls, *statesdot, *j_statesdot); + // Marshall function outputs + plhs[0] = emlrt_marshallOut(*statesdot); + if (nlhs > 1) { + plhs[1] = b_emlrt_marshallOut(*j_statesdot); + } +} + +void mb_fm_mex_source_zermelo_atexit() +{ + emlrtStack st{ + nullptr, // site + nullptr, // tls + nullptr // prev + }; + mexFunctionCreateRootTLS(); + st.tls = emlrtRootTLSGlobal; + emlrtEnterRtStackR2012b(&st); + emlrtDestroyRootTLS(&emlrtRootTLSGlobal); + mb_fm_mex_source_zermelo_xil_terminate(); + mb_fm_mex_source_zermelo_xil_shutdown(); + emlrtExitTimeCleanup(&emlrtContextGlobal); +} + +void mb_fm_mex_source_zermelo_initialize() +{ + emlrtStack st{ + nullptr, // site + nullptr, // tls + nullptr // prev + }; + mexFunctionCreateRootTLS(); + st.tls = emlrtRootTLSGlobal; + emlrtClearAllocCountR2012b(&st, false, 0U, nullptr); + emlrtEnterRtStackR2012b(&st); + emlrtFirstTimeR2012b(emlrtRootTLSGlobal); +} + +void mb_fm_mex_source_zermelo_terminate() +{ + emlrtDestroyRootTLS(&emlrtRootTLSGlobal); +} + +// End of code generation (_coder_mb_fm_mex_source_zermelo_api.cpp) diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_api.h b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_api.h new file mode 100644 index 0000000000..5eb4a9a85c --- /dev/null +++ b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_api.h @@ -0,0 +1,42 @@ +// +// Academic License - for use in teaching, academic research, and meeting +// course requirements at degree granting institutions only. Not for +// government, commercial, or other organizational use. +// +// _coder_mb_fm_mex_source_zermelo_api.h +// +// Code generation for function 'mb_fm_mex_source_zermelo' +// + +#ifndef _CODER_MB_FM_MEX_SOURCE_ZERMELO_API_H +#define _CODER_MB_FM_MEX_SOURCE_ZERMELO_API_H + +// Include files +#include "emlrt.h" +#include "tmwtypes.h" +#include +#include + +// Variable Declarations +extern emlrtCTX emlrtRootTLSGlobal; +extern emlrtContext emlrtContextGlobal; + +// Function Declarations +void mb_fm_mex_source_zermelo(real_T states[2], real_T controls, + real_T statesdot[2], real_T j_statesdot[6]); + +void mb_fm_mex_source_zermelo_api(const mxArray *const prhs[2], int32_T nlhs, + const mxArray *plhs[2]); + +void mb_fm_mex_source_zermelo_atexit(); + +void mb_fm_mex_source_zermelo_initialize(); + +void mb_fm_mex_source_zermelo_terminate(); + +void mb_fm_mex_source_zermelo_xil_shutdown(); + +void mb_fm_mex_source_zermelo_xil_terminate(); + +#endif +// End of code generation (_coder_mb_fm_mex_source_zermelo_api.h) diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_info.cpp b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_info.cpp new file mode 100644 index 0000000000..8392721487 --- /dev/null +++ b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_info.cpp @@ -0,0 +1,84 @@ +// +// Academic License - for use in teaching, academic research, and meeting +// course requirements at degree granting institutions only. Not for +// government, commercial, or other organizational use. +// +// _coder_mb_fm_mex_source_zermelo_info.cpp +// +// Code generation for function 'mb_fm_mex_source_zermelo' +// + +// Include files +#include "_coder_mb_fm_mex_source_zermelo_info.h" +#include "emlrt.h" +#include "tmwtypes.h" + +// Function Declarations +static const mxArray *emlrtMexFcnResolvedFunctionsInfo(); + +// Function Definitions +static const mxArray *emlrtMexFcnResolvedFunctionsInfo() +{ + const mxArray *nameCaptureInfo; + const char_T *data[5]{ + "789cc554cb4ec240141d0c3e36282bbfc19569e55170a5a13e13450326268e29657aabd5" + "ce0ce9b408ee4ddcb9d2cf72e1d6855b3fc1a5522850e2041222decd" + "9d93939973ee99c9a0c4c1510221b48cba955eecf654847b7d0ec56b944f487a54f32819" + "db17f14fbd4e38f3a1e577013329f4775a9c3acc647eb5dd00e481e0", + "6e13ac90b11d17aa0e85ca3038ee20ba3b44f54187eaac4bd7406e2b0145deb518387487" + "413f8f4fc9bcc909f37890e4911ee12f762e4b9bf84c802770cb6c3a" + "0d5c66a07b4e13b0ce494081f95ce03dc7df0feab87267325c6ef80e35ddd24f701e7731" + "0141b04d0dca2d7045b882962178e01130eec1a3e0726c39b68d69dd", + "f8955da743733f4e39f7da98b9235eb485912916c056f2d9a2aa65b24a319f2b281a5188" + "aadaaaa98169193726897cd5a6f4b520f5d5652c1ed45d18e4f035a5" + "deb3542fcecff0fe278d3cf61e6a92395726cc41f62fa4d052d85f5edf436a567a871f5b" + "6fb3d48beabff45a92f3267dc7ab12bdf408af072ca7f1ea39dbe679", + "ce3772ea15390df4818f93313ae37c2009feebf3bf012de1b6d5", ""}; + nameCaptureInfo = nullptr; + emlrtNameCaptureMxArrayR2016a(&data[0], 1832U, &nameCaptureInfo); + return nameCaptureInfo; +} + +mxArray *emlrtMexFcnProperties() +{ + mxArray *xEntryPoints; + mxArray *xInputs; + mxArray *xResult; + const char_T *propFieldName[7]{ + "Version", "ResolvedFunctions", "Checksum", "EntryPoints", + "CoverageInfo", "IsPolymorphic", "PropertyList"}; + const char_T *epFieldName[6]{ + "Name", "NumberOfInputs", "NumberOfOutputs", + "ConstantInputs", "FullPath", "TimeStamp"}; + xEntryPoints = + emlrtCreateStructMatrix(1, 1, 6, (const char_T **)&epFieldName[0]); + xInputs = emlrtCreateLogicalMatrix(1, 2); + emlrtSetField(xEntryPoints, 0, "Name", + emlrtMxCreateString("mb_fm_mex_source_zermelo")); + emlrtSetField(xEntryPoints, 0, "NumberOfInputs", + emlrtMxCreateDoubleScalar(2.0)); + emlrtSetField(xEntryPoints, 0, "NumberOfOutputs", + emlrtMxCreateDoubleScalar(2.0)); + emlrtSetField(xEntryPoints, 0, "ConstantInputs", xInputs); + emlrtSetField( + xEntryPoints, 0, "FullPath", + emlrtMxCreateString( + "C:" + "\\Users\\xavip\\OneDrive\\Documentos\\GitHub\\Swan\\OptimalControl\\" + "cesc\\fm_models\\fm_mex_source_zermelo\\diff\\mb_fm_mex_so" + "urce_zermelo.m")); + emlrtSetField(xEntryPoints, 0, "TimeStamp", + emlrtMxCreateDoubleScalar(739764.06609953707)); + xResult = + emlrtCreateStructMatrix(1, 1, 7, (const char_T **)&propFieldName[0]); + emlrtSetField(xResult, 0, "Version", + emlrtMxCreateString("9.14.0.2891782 (R2023a) Update 8")); + emlrtSetField(xResult, 0, "ResolvedFunctions", + (mxArray *)emlrtMexFcnResolvedFunctionsInfo()); + emlrtSetField(xResult, 0, "Checksum", + emlrtMxCreateString("P2BaLQnArfOPfnWYWVXwt")); + emlrtSetField(xResult, 0, "EntryPoints", xEntryPoints); + return xResult; +} + +// End of code generation (_coder_mb_fm_mex_source_zermelo_info.cpp) diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_info.h b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_info.h new file mode 100644 index 0000000000..3df024048d --- /dev/null +++ b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_info.h @@ -0,0 +1,21 @@ +// +// Academic License - for use in teaching, academic research, and meeting +// course requirements at degree granting institutions only. Not for +// government, commercial, or other organizational use. +// +// _coder_mb_fm_mex_source_zermelo_info.h +// +// Code generation for function 'mb_fm_mex_source_zermelo' +// + +#ifndef _CODER_MB_FM_MEX_SOURCE_ZERMELO_INFO_H +#define _CODER_MB_FM_MEX_SOURCE_ZERMELO_INFO_H + +// Include files +#include "mex.h" + +// Function Declarations +MEXFUNCTION_LINKAGE mxArray *emlrtMexFcnProperties(); + +#endif +// End of code generation (_coder_mb_fm_mex_source_zermelo_info.h) diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_mex.cpp b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_mex.cpp new file mode 100644 index 0000000000..55081ff3a1 --- /dev/null +++ b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_mex.cpp @@ -0,0 +1,70 @@ +// +// Academic License - for use in teaching, academic research, and meeting +// course requirements at degree granting institutions only. Not for +// government, commercial, or other organizational use. +// +// _coder_mb_fm_mex_source_zermelo_mex.cpp +// +// Code generation for function 'mb_fm_mex_source_zermelo' +// + +// Include files +#include "_coder_mb_fm_mex_source_zermelo_mex.h" +#include "_coder_mb_fm_mex_source_zermelo_api.h" + +// Function Definitions +void mexFunction(int32_T nlhs, mxArray *plhs[], int32_T nrhs, + const mxArray *prhs[]) +{ + mexAtExit(&mb_fm_mex_source_zermelo_atexit); + // Module initialization. + mb_fm_mex_source_zermelo_initialize(); + // Dispatch the entry-point. + unsafe_mb_fm_mex_source_zermelo_mexFunction(nlhs, plhs, nrhs, prhs); + // Module termination. + mb_fm_mex_source_zermelo_terminate(); +} + +emlrtCTX mexFunctionCreateRootTLS() +{ + emlrtCreateRootTLSR2022a(&emlrtRootTLSGlobal, &emlrtContextGlobal, nullptr, 1, + nullptr, "windows-1252", true); + return emlrtRootTLSGlobal; +} + +void unsafe_mb_fm_mex_source_zermelo_mexFunction(int32_T nlhs, mxArray *plhs[2], + int32_T nrhs, + const mxArray *prhs[2]) +{ + emlrtStack st{ + nullptr, // site + nullptr, // tls + nullptr // prev + }; + const mxArray *b_prhs[2]; + const mxArray *outputs[2]; + int32_T i; + st.tls = emlrtRootTLSGlobal; + // Check for proper number of arguments. + if (nrhs != 2) { + emlrtErrMsgIdAndTxt(&st, "EMLRT:runTime:WrongNumberOfInputs", 5, 12, 2, 4, + 24, "mb_fm_mex_source_zermelo"); + } + if (nlhs > 2) { + emlrtErrMsgIdAndTxt(&st, "EMLRT:runTime:TooManyOutputArguments", 3, 4, 24, + "mb_fm_mex_source_zermelo"); + } + // Call the function. + b_prhs[0] = prhs[0]; + b_prhs[1] = prhs[1]; + mb_fm_mex_source_zermelo_api(b_prhs, nlhs, outputs); + // Copy over outputs to the caller. + if (nlhs < 1) { + i = 1; + } else { + i = nlhs; + } + emlrtReturnArrays(i, &plhs[0], &outputs[0]); +} + +// End of code generation (_coder_mb_fm_mex_source_zermelo_mex.cpp) diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_mex.h b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_mex.h new file mode 100644 index 0000000000..1b1d75ac81 --- /dev/null +++ b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_mex.h @@ -0,0 +1,30 @@ +// +// Academic License - for use in teaching, academic research, and meeting +// course requirements at degree granting institutions only. Not for +// government, commercial, or other organizational use. +// +// _coder_mb_fm_mex_source_zermelo_mex.h +// +// Code generation for function 'mb_fm_mex_source_zermelo' +// + +#ifndef _CODER_MB_FM_MEX_SOURCE_ZERMELO_MEX_H +#define _CODER_MB_FM_MEX_SOURCE_ZERMELO_MEX_H + +// Include files +#include "emlrt.h" +#include "mex.h" +#include "tmwtypes.h" + +// Function Declarations +MEXFUNCTION_LINKAGE void mexFunction(int32_T nlhs, mxArray *plhs[], + int32_T nrhs, const mxArray *prhs[]); + +emlrtCTX mexFunctionCreateRootTLS(); + +void unsafe_mb_fm_mex_source_zermelo_mexFunction(int32_T nlhs, mxArray *plhs[2], + int32_T nrhs, + const mxArray *prhs[2]); + +#endif +// End of code generation (_coder_mb_fm_mex_source_zermelo_mex.h) diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo.cpp b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo.cpp new file mode 100644 index 0000000000..0c67e72878 --- /dev/null +++ b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo.cpp @@ -0,0 +1,98 @@ +// +// Academic License - for use in teaching, academic research, and meeting +// course requirements at degree granting institutions only. Not for +// government, commercial, or other organizational use. +// +// mb_fm_mex_source_zermelo.cpp +// +// Code generation for function 'mb_fm_mex_source_zermelo' +// + +// Include files +#include "mb_fm_mex_source_zermelo.h" +#include + +// Function Definitions +void mb_fm_mex_source_zermelo(const double states[2], double controls, + double statesdot[2], double j_statesdot[6]) +{ + static const signed char iv[3]{0, 0, 1}; + double b_j_states[9]; + double dv[6]; + double j_statedottmp[6]; + double out1_tmp; + double statesdot_tmp; + int j_states_tmp; + signed char j_states[6]; + // mb_fm_mex_source_zermelo + // File automatically generated by FALCON.m + // === Extract Data From Input ============================================== + // === Jacobians and Hessians =============================================== + for (int i{0}; i < 6; i++) { + j_states[i] = 0; + } + j_states[0] = 1; + j_states[1] = 0; + j_states[2] = 0; + j_states[3] = 1; + // === Write Constants ====================================================== + // === Subsystem source_zermelo ============================================= + // Defined at ? + // Call sys_398ef064917340965807c0c11f1a7ead_jac + // SYS_398EF064917340965807C0C11F1A7EAD_JAC + // [OUT1,J_OUT1,H_OUT1] = + // SYS_398EF064917340965807C0C11F1A7EAD_JAC(IN1,IN2VAL1) This function was + // generated by the Symbolic Math Toolbox version 9.3. 27-May-2025 + // 01:35:10 + // Generated using CreateGradient + // Input dimensions : {[2 1], [1 1]} + // Derivative inputs: [true true] + // DerivativeOrder : 1 + // Output dimensions: {[2 1]} + // Constant outputs : false + out1_tmp = std::sin(controls); + statesdot_tmp = std::cos(controls) * 30.0; + statesdot[0] = states[1] / 2.0 + statesdot_tmp; + statesdot[1] = out1_tmp * 30.0; + // Hessian Jacobian for sys_398ef064917340965807c0c11f1a7ead_jac + // Calculation of Jacobian with respect to function global input for + // sys_398ef064917340965807c0c11f1a7ead_jac + dv[0] = 0.0; + dv[1] = 0.0; + dv[2] = 0.5; + dv[3] = 0.0; + dv[4] = out1_tmp * -30.0; + dv[5] = statesdot_tmp; + for (int i{0}; i < 3; i++) { + j_states_tmp = i << 1; + b_j_states[3 * i] = j_states[j_states_tmp]; + b_j_states[3 * i + 1] = j_states[j_states_tmp + 1]; + b_j_states[3 * i + 2] = iv[i]; + } + for (int i{0}; i < 2; i++) { + out1_tmp = dv[i + 2]; + statesdot_tmp = dv[i + 4]; + for (j_states_tmp = 0; j_states_tmp < 3; j_states_tmp++) { + j_statedottmp[i + (j_states_tmp << 1)] = + out1_tmp * b_j_states[3 * j_states_tmp + 1] + + statesdot_tmp * b_j_states[3 * j_states_tmp + 2]; + } + } + // Combine Variables to statesdot + j_statesdot[0] = j_statedottmp[0]; + j_statesdot[1] = j_statedottmp[1]; + j_statesdot[2] = j_statedottmp[2]; + j_statesdot[3] = j_statedottmp[3]; + j_statesdot[4] = j_statedottmp[4]; + j_statesdot[5] = j_statedottmp[5]; +} + +void mb_fm_mex_source_zermelo_initialize() +{ +} + +void mb_fm_mex_source_zermelo_terminate() +{ +} + +// End of code generation (mb_fm_mex_source_zermelo.cpp) diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo.h b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo.h new file mode 100644 index 0000000000..e1e9eedecf --- /dev/null +++ b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo.h @@ -0,0 +1,33 @@ +// +// Academic License - for use in teaching, academic research, and meeting +// course requirements at degree granting institutions only. Not for +// government, commercial, or other organizational use. +// +// mb_fm_mex_source_zermelo.h +// +// Code generation for function 'mb_fm_mex_source_zermelo' +// + +#ifndef MB_FM_MEX_SOURCE_ZERMELO_H +#define MB_FM_MEX_SOURCE_ZERMELO_H + +// Include files +#include "rtwtypes.h" +#include +#include + +// Custom Header Code +#include +#define CHAR16_T uint16_t +#include "mex.h" +// Function Declarations +extern void mb_fm_mex_source_zermelo(const double states[2], double controls, + double statesdot[2], + double j_statesdot[6]); + +extern void mb_fm_mex_source_zermelo_initialize(); + +extern void mb_fm_mex_source_zermelo_terminate(); + +#endif +// End of code generation (mb_fm_mex_source_zermelo.h) diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_CALL.cpp b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_CALL.cpp new file mode 100644 index 0000000000..ad2c2d2777 --- /dev/null +++ b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_CALL.cpp @@ -0,0 +1,211 @@ +// Call Function generated automatically on 27-May-2025 01:35:29 +// Created on DESKTOP-BM120QM +#include "cstdint" +#include "mex.h" +#include "math.h" +#include "algorithm" +#include "array" +#include "mb_fm_mex_source_zermelo.h" +#include "mb_fm_mex_source_zermelo_types.h" + +// Constants - Input Dimensions +#define DIM_M_STATES 2 +#define DIM_M_CONTROLS 1 + +// Constants - Number of Independent Variables (non discrete control case) +#define N_IDP 3 + +// Constants - Output Sizes +#define NUM_OUT_STATESDOT 2 + +static int const nthreads = 1; + +// Function Header +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) try { + + // Declare input arrays + mxArray const *array_states = prhs[0]; + mxArray const *array_controls = prhs[1]; + + // Declare number of time steps + int nEval; + + // Declare Outputs + double *statesdot; + double *j_statesdot; + mwSize j_dim_statesdot[3]; + + // Write Call Information + if (nrhs == 0 && nlhs == 0) { + // System Information + mexPrintf("System Information\n"); + mexPrintf("Mex file created by Derivative Model Builder\n"); + mexPrintf("- Date: 27-May-2025 01:35:29\n"); + mexPrintf("- Computer: DESKTOP-BM120QM\n"); + mexPrintf("- MATLAB-Version: 9.14.0.2891782 (R2023a) Update 8\n"); + mexPrintf("- DerivativeOrder: 1\n"); + mexPrintf("- Jacobian Calculation:true\n"); + mexPrintf("- Hessian-Calculation: false\n"); + mexPrintf("\n"); + + // Input Information + mexPrintf("Input Information\n"); + mexPrintf("Name Size DataType Derivative MultipleTimeEval VariableSize\n"); + mexPrintf("states [2 1] double true true false\n"); + mexPrintf("| x\n"); + mexPrintf("| y\n"); + mexPrintf("\n"); + mexPrintf("controls [1 1] double true true false\n"); + mexPrintf("| u\n"); + mexPrintf("\n"); + mexPrintf("\n"); + + // Output Information + mexPrintf("Output Information\n"); + mexPrintf("Name Size \n"); + mexPrintf("statesdot [2 1]\n"); + + return; + } + else if (nrhs == 0 && nlhs == 1) { + const char *names[] = {"input", "output", "info", "name", "type", "WrapperClass"}; + const char *i_names[] = {"m", "n","name","argnames","type", "groupindex", "DataType"}; + const char *o_names[] = {"m", "n","name","argnames","type","jac_sparsity","hess_sparsity"}; + mxArray *struct_inputs; + mxArray *struct_outputs; + const char *info_names[] = {"Date", "Computer", "MATLAB", "DerivativeOrder", "Jacobian", "Hessian", "UseSparsityEstimator"}; + mxArray *struct_info; + mxArray *mx; + double *sparsity_j; + double *sparsity_h; + + plhs[0] = mxCreateStructMatrix(1,1,6,names); + mxSetField(plhs[0], 0, names[3], mxCreateString("fm_mex_source_zermelo")); + mxSetField(plhs[0], 0, names[4], mxCreateString("SIMULATION_MODEL")); + mxSetField(plhs[0], 0, names[5], mxCreateString("falcon.ModelWrapper")); + + struct_inputs = mxCreateStructMatrix(2,1,7,i_names); + + mxSetField(struct_inputs, 0, i_names[0], mxCreateDoubleScalar(2)); + mxSetField(struct_inputs, 0, i_names[1], mxCreateDoubleScalar(1)); + mxSetField(struct_inputs, 0, i_names[2], mxCreateString("states")); + mxSetField(struct_inputs, 0, i_names[4], mxCreateString("STATE")); + mxSetField(struct_inputs, 0, i_names[5], mxCreateDoubleScalar(0)); + mxSetField(struct_inputs, 0, i_names[6], mxCreateString("double")); + mx = mxCreateCellMatrix(2, 1); + mxSetCell(mx, 0, mxCreateString("x")); + mxSetCell(mx, 1, mxCreateString("y")); + mxSetField(struct_inputs, 0, i_names[3], mx); + + mxSetField(struct_inputs, 1, i_names[0], mxCreateDoubleScalar(1)); + mxSetField(struct_inputs, 1, i_names[1], mxCreateDoubleScalar(1)); + mxSetField(struct_inputs, 1, i_names[2], mxCreateString("controls")); + mxSetField(struct_inputs, 1, i_names[4], mxCreateString("CONTROL")); + mxSetField(struct_inputs, 1, i_names[5], mxCreateDoubleScalar(0)); + mxSetField(struct_inputs, 1, i_names[6], mxCreateString("double")); + mx = mxCreateCellMatrix(1, 1); + mxSetCell(mx, 0, mxCreateString("u")); + mxSetField(struct_inputs, 1, i_names[3], mx); + mxSetField(plhs[0], 0, names[0], struct_inputs); + + struct_outputs = mxCreateStructMatrix(1,1,7,o_names); + + mxSetField(struct_outputs, 0, o_names[0], mxCreateDoubleScalar(2)); + mxSetField(struct_outputs, 0, o_names[1], mxCreateDoubleScalar(1)); + mxSetField(struct_outputs, 0, o_names[2], mxCreateString("statesdot")); + mxSetField(struct_outputs, 0, o_names[4], mxCreateString("STATEDOT")); + mx = mxCreateDoubleMatrix(2, 3, mxREAL); + sparsity_j = reinterpret_cast(mxGetPr(mx)); + { + std::array const sparsity_j_template = { + 0, 0, /* column 1 */ + 1, 0, /* column 2 */ + 1, 1, /* column 3 */ + }; /* end of sparsity_j_template */ + std::copy(sparsity_j_template.cbegin(), sparsity_j_template.cend(), sparsity_j); + } + mxSetField(struct_outputs, 0, o_names[5], mx); + mx = mxCreateDoubleMatrix(0, 0, mxREAL); + sparsity_h = reinterpret_cast(mxGetPr(mx)); + { + std::array const sparsity_h_template = { + }; /* end of sparsity_h_template */ + std::copy(sparsity_h_template.cbegin(), sparsity_h_template.cend(), sparsity_h); + } + mxSetField(struct_outputs, 0, o_names[6], mx); + mx = mxCreateCellMatrix(0,0); + mxSetField(struct_outputs, 0, o_names[3], mx); + mxSetField(plhs[0], 0, names[1], struct_outputs); + struct_info = mxCreateStructMatrix(1,1,7,info_names); + mxSetField(struct_info, 0, info_names[0], mxCreateString("27-May-2025 01:35:29")); + mxSetField(struct_info, 0, info_names[1], mxCreateString("DESKTOP-BM120QM")); + mxSetField(struct_info, 0, info_names[2], mxCreateString("9.14.0.2891782 (R2023a) Update 8")); + mxSetField(struct_info, 0, info_names[3], mxCreateDoubleScalar(1)); + mxSetField(struct_info, 0, info_names[4], mxCreateLogicalScalar(true)); + mxSetField(struct_info, 0, info_names[5], mxCreateLogicalScalar(false)); + mxSetField(struct_info, 0, info_names[6], mxCreateLogicalScalar(false)); + mxSetField(plhs[0], 0, names[2], struct_info); + return; + } + + // Check Number of Input Arguments + if (nrhs < 2 || nrhs > 2) { + mexErrMsgIdAndTxt("MATLAB:callModel:Error","Wrong number of input arguments for fm_mex_source_zermelo. The required number of input arguments is 2. Call the mex file with no input arguments to get exact input & output type information."); + } + + // Extract Inputs + + if (!mxIsClass(array_states, "double") || mxIsComplex(array_states)) { + mexErrMsgIdAndTxt("MATLAB:callModel:Error", "Wrong argument type: states must be real double, found %s.", mxGetClassName(array_states)); + } + double const *states = reinterpret_cast(mxGetPr(array_states)); + + if (!mxIsClass(array_controls, "double") || mxIsComplex(array_controls)) { + mexErrMsgIdAndTxt("MATLAB:callModel:Error", "Wrong argument type: controls must be real double, found %s.", mxGetClassName(array_controls)); + } + double const *controls = reinterpret_cast(mxGetPr(array_controls)); + nEval = mxGetN(array_states); + + // Check Input Dimensions + // Input_1: states + if (mxGetM(array_states) != DIM_M_STATES) { + mexErrMsgIdAndTxt("MATLAB:callModel:Error", "Number of rows for input 1 with name \"states\" should be 2 but is %i.", mxGetM(prhs[0])); + } + if (mxGetN(array_states) != nEval) { + mexErrMsgIdAndTxt("MATLAB:callModel:Error", "Number of columns for input 1 with name \"states\" should be equal to the number of time steps (%i) but is %i.", nEval, mxGetN(prhs[0])); + } + // Input_2: controls + if (mxGetM(array_controls) != DIM_M_CONTROLS) { + mexErrMsgIdAndTxt("MATLAB:callModel:Error", "Number of rows for input 2 with name \"controls\" should be 1 but is %i.", mxGetM(prhs[1])); + } + if (mxGetN(array_controls) != nEval) { + mexErrMsgIdAndTxt("MATLAB:callModel:Error", "Number of columns for input 2 with name \"controls\" should be equal to the number of time steps (%i) but is %i.", nEval, mxGetN(prhs[1])); + } + + // Prepare jacobian and hessian dimensions + // Output_1: statesdot + plhs[0] = mxCreateDoubleMatrix(2, 1*nEval, mxREAL); + statesdot = mxGetPr(plhs[0]); + // Output_jacobian_1: statesdot + j_dim_statesdot[0] = NUM_OUT_STATESDOT; + j_dim_statesdot[1] = N_IDP; + j_dim_statesdot[2] = nEval; + plhs[1] = mxCreateNumericArray(3,j_dim_statesdot,mxDOUBLE_CLASS,mxREAL); + j_statesdot = mxGetPr(plhs[1]); + + // Call Model in for-loop + for (int iEval = 0; iEval < nEval; iEval++) { + mb_fm_mex_source_zermelo( + &states[DIM_M_STATES * iEval], + controls[DIM_M_CONTROLS * iEval], + &statesdot[NUM_OUT_STATESDOT * iEval], + &j_statesdot[NUM_OUT_STATESDOT * N_IDP * iEval] + ); + } + // Remove Temporary Variables - Variable Size Data + +} +catch (std::exception& e) +{ + mexErrMsgIdAndTxt("MATLAB:callModel:Error", "%s", e.what()); +} diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.bat b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.bat new file mode 100644 index 0000000000..cbd33d1349 --- /dev/null +++ b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.bat @@ -0,0 +1,16 @@ +@echo off + +call "setup_mingw.bat" + +cd . + +chcp 1252 + +if "%1"=="" ("%MINGW_ROOT%\mingw32-make.exe" -f mb_fm_mex_source_zermelo_rtw.mk all) else ("%MINGW_ROOT%\mingw32-make.exe" -f mb_fm_mex_source_zermelo_rtw.mk %1) +@if errorlevel 1 goto error_exit + +exit /B 0 + +:error_exit +echo The make command returned an error of %errorlevel% +exit /B 1 \ No newline at end of file diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.mk b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.mk new file mode 100644 index 0000000000..81aa798135 --- /dev/null +++ b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.mk @@ -0,0 +1,391 @@ +########################################################################### +## Makefile generated for component 'mb_fm_mex_source_zermelo'. +## +## Makefile : mb_fm_mex_source_zermelo_rtw.mk +## Generated on : Tue May 27 01:35:27 2025 +## Final product: C:/Users/xavip/OneDrive/Documentos/GitHub/Swan/OptimalControl/cesc/mb_fm_mex_source_zermelo.exe +## Product type : executable +## +########################################################################### + +########################################################################### +## MACROS +########################################################################### + +# Macro Descriptions: +# PRODUCT_NAME Name of the system to build +# MAKEFILE Name of this makefile +# COMPILER_COMMAND_FILE Compiler command listing model reference header paths +# CMD_FILE Command file + +PRODUCT_NAME = mb_fm_mex_source_zermelo +MAKEFILE = mb_fm_mex_source_zermelo_rtw.mk +MATLAB_ROOT = C:/PROGRA~1/MATLAB/R2023a +MATLAB_BIN = C:/PROGRA~1/MATLAB/R2023a/bin +MATLAB_ARCH_BIN = $(MATLAB_BIN)/win64 +START_DIR = C:/Users/xavip/OneDrive/Documentos/GitHub/Swan/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp +TGT_FCN_LIB = ISO_C++11 +SOLVER_OBJ = +CLASSIC_INTERFACE = 0 +MODEL_HAS_DYNAMICALLY_LOADED_SFCNS = +RELATIVE_PATH_TO_ANCHOR = . +COMPILER_COMMAND_FILE = mb_fm_mex_source_zermelo_rtw_comp.rsp +CMD_FILE = mb_fm_mex_source_zermelo_rtw.rsp +C_STANDARD_OPTS = -fwrapv +CPP_STANDARD_OPTS = -fwrapv + +########################################################################### +## TOOLCHAIN SPECIFICATIONS +########################################################################### + +# Toolchain Name: MinGW64 | gmake (64-bit Windows) +# Supported Version(s): 6.x +# ToolchainInfo Version: 2023a +# Specification Revision: 1.0 +# +#------------------------------------------- +# Macros assumed to be defined elsewhere +#------------------------------------------- + +# C_STANDARD_OPTS +# CPP_STANDARD_OPTS +# MINGW_ROOT +# MINGW_C_STANDARD_OPTS + +#----------- +# MACROS +#----------- + +WARN_FLAGS = -Wall -W -Wwrite-strings -Winline -Wstrict-prototypes -Wnested-externs -Wpointer-arith -Wcast-align +WARN_FLAGS_MAX = $(WARN_FLAGS) -Wcast-qual -Wshadow +CPP_WARN_FLAGS = -Wall -W -Wwrite-strings -Winline -Wpointer-arith -Wcast-align +CPP_WARN_FLAGS_MAX = $(CPP_WARN_FLAGS) -Wcast-qual -Wshadow +MW_EXTERNLIB_DIR = $(MATLAB_ROOT)/extern/lib/win64/mingw64 +SHELL = %SystemRoot%/system32/cmd.exe + +TOOLCHAIN_SRCS = +TOOLCHAIN_INCS = +TOOLCHAIN_LIBS = -lws2_32 + +#------------------------ +# BUILD TOOL COMMANDS +#------------------------ + +# C Compiler: GNU C Compiler +CC_PATH = $(MINGW_ROOT) +CC = "$(CC_PATH)/gcc" + +# Linker: GNU Linker +LD_PATH = $(MINGW_ROOT) +LD = "$(LD_PATH)/g++" + +# C++ Compiler: GNU C++ Compiler +CPP_PATH = $(MINGW_ROOT) +CPP = "$(CPP_PATH)/g++" + +# C++ Linker: GNU C++ Linker +CPP_LD_PATH = $(MINGW_ROOT) +CPP_LD = "$(CPP_LD_PATH)/g++" + +# Archiver: GNU Archiver +AR_PATH = $(MINGW_ROOT) +AR = "$(AR_PATH)/ar" + +# MEX Tool: MEX Tool +MEX_PATH = $(MATLAB_ARCH_BIN) +MEX = "$(MEX_PATH)/mex" + +# Download: Download +DOWNLOAD = + +# Execute: Execute +EXECUTE = $(PRODUCT) + +# Builder: GMAKE Utility +MAKE_PATH = $(MINGW_ROOT) +MAKE = "$(MAKE_PATH)/mingw32-make.exe" + + +#------------------------- +# Directives/Utilities +#------------------------- + +CDEBUG = -g +C_OUTPUT_FLAG = -o +LDDEBUG = -g +OUTPUT_FLAG = -o +CPPDEBUG = -g +CPP_OUTPUT_FLAG = -o +CPPLDDEBUG = -g +OUTPUT_FLAG = -o +ARDEBUG = +STATICLIB_OUTPUT_FLAG = +MEX_DEBUG = -g +RM = @del +ECHO = @echo +MV = @move +RUN = + +#-------------------------------------- +# "Faster Runs" Build Configuration +#-------------------------------------- + +ARFLAGS = ruvs +CFLAGS = -c $(MINGW_C_STANDARD_OPTS) -m64 \ + -O3 -fno-loop-optimize -fno-aggressive-loop-optimizations +CPPFLAGS = -c $(CPP_STANDARD_OPTS) -m64 \ + -O3 -fno-loop-optimize -fno-aggressive-loop-optimizations +CPP_LDFLAGS = -static -m64 +CPP_SHAREDLIB_LDFLAGS = -shared -Wl,--no-undefined \ + -Wl,--out-implib,$(notdir $(basename $(PRODUCT))).lib +DOWNLOAD_FLAGS = +EXECUTE_FLAGS = +LDFLAGS = -static -m64 +MEX_CPPFLAGS = +MEX_CPPLDFLAGS = +MEX_CFLAGS = +MEX_LDFLAGS = +MAKE_FLAGS = -f $(MAKEFILE) +SHAREDLIB_LDFLAGS = -shared -Wl,--no-undefined \ + -Wl,--out-implib,$(notdir $(basename $(PRODUCT))).lib + + + +########################################################################### +## OUTPUT INFO +########################################################################### + +PRODUCT = C:/Users/xavip/OneDrive/Documentos/GitHub/Swan/OptimalControl/cesc/mb_fm_mex_source_zermelo.exe +PRODUCT_TYPE = "executable" +BUILD_TYPE = "Executable" + +########################################################################### +## INCLUDE PATHS +########################################################################### + +INCLUDES_BUILDINFO = + +INCLUDES = $(INCLUDES_BUILDINFO) + +########################################################################### +## DEFINES +########################################################################### + +DEFINES_ = -D__USE_MINGW_ANSI_STDIO=1 +DEFINES_CUSTOM = +DEFINES_STANDARD = -DMODEL=mb_fm_mex_source_zermelo + +DEFINES = $(DEFINES_) $(DEFINES_CUSTOM) $(DEFINES_STANDARD) + +########################################################################### +## SOURCE FILES +########################################################################### + +SRCS = $(START_DIR)/mb_fm_mex_source_zermelo.cpp + +ALL_SRCS = $(SRCS) + +########################################################################### +## OBJECTS +########################################################################### + +OBJS = mb_fm_mex_source_zermelo.obj + +ALL_OBJS = $(OBJS) + +########################################################################### +## PREBUILT OBJECT FILES +########################################################################### + +PREBUILT_OBJS = + +########################################################################### +## LIBRARIES +########################################################################### + +LIBS = + +########################################################################### +## SYSTEM LIBRARIES +########################################################################### + +SYSTEM_LIBS = + +########################################################################### +## ADDITIONAL TOOLCHAIN FLAGS +########################################################################### + +#--------------- +# C Compiler +#--------------- + +CFLAGS_BASIC = $(DEFINES) $(INCLUDES) @$(COMPILER_COMMAND_FILE) + +CFLAGS += $(CFLAGS_BASIC) + +#----------------- +# C++ Compiler +#----------------- + +CPPFLAGS_BASIC = $(DEFINES) $(INCLUDES) @$(COMPILER_COMMAND_FILE) + +CPPFLAGS += $(CPPFLAGS_BASIC) + +#--------------------- +# MEX C++ Compiler +#--------------------- + +MEX_CPP_Compiler_BASIC = @$(COMPILER_COMMAND_FILE) + +MEX_CPPFLAGS += $(MEX_CPP_Compiler_BASIC) + +#----------------- +# MEX Compiler +#----------------- + +MEX_Compiler_BASIC = @$(COMPILER_COMMAND_FILE) + +MEX_CFLAGS += $(MEX_Compiler_BASIC) + +########################################################################### +## INLINED COMMANDS +########################################################################### + + +MINGW_C_STANDARD_OPTS = $(C_STANDARD_OPTS) + + +########################################################################### +## PHONY TARGETS +########################################################################### + +.PHONY : all build buildobj clean info prebuild download execute + + +all : build + @echo "### Successfully generated all binary outputs." + + +build : prebuild $(PRODUCT) + + +buildobj : prebuild $(OBJS) $(PREBUILT_OBJS) + @echo "### Successfully generated all binary outputs." + + +prebuild : + + +download : $(PRODUCT) + + +execute : download + @echo "### Invoking postbuild tool "Execute" ..." + $(EXECUTE) $(EXECUTE_FLAGS) + @echo "### Done invoking postbuild tool." + + +########################################################################### +## FINAL TARGET +########################################################################### + +#------------------------------------------- +# Create a standalone executable +#------------------------------------------- + +$(PRODUCT) : $(OBJS) $(PREBUILT_OBJS) + @echo "### Creating standalone executable "$(PRODUCT)" ..." + $(CPP_LD) $(CPP_LDFLAGS) -o $(PRODUCT) @$(CMD_FILE) $(SYSTEM_LIBS) $(TOOLCHAIN_LIBS) + @echo "### Created: $(PRODUCT)" + + +########################################################################### +## INTERMEDIATE TARGETS +########################################################################### + +#--------------------- +# SOURCE-TO-OBJECT +#--------------------- + +%.obj : %.c + $(CC) $(CFLAGS) -o "$@" "$<" + + +%.obj : %.cpp + $(CPP) $(CPPFLAGS) -o "$@" "$<" + + +%.obj : $(RELATIVE_PATH_TO_ANCHOR)/%.c + $(CC) $(CFLAGS) -o "$@" "$<" + + +%.obj : $(RELATIVE_PATH_TO_ANCHOR)/%.cpp + $(CPP) $(CPPFLAGS) -o "$@" "$<" + + +%.obj : $(START_DIR)/%.c + $(CC) $(CFLAGS) -o "$@" "$<" + + +%.obj : $(START_DIR)/%.cpp + $(CPP) $(CPPFLAGS) -o "$@" "$<" + + +%.obj : C:/Users/xavip/OneDrive/Documentos/GitHub/Swan/OptimalControl/cesc/%.c + $(CC) $(CFLAGS) -o "$@" "$<" + + +%.obj : C:/Users/xavip/OneDrive/Documentos/GitHub/Swan/OptimalControl/cesc/%.cpp + $(CPP) $(CPPFLAGS) -o "$@" "$<" + + +mb_fm_mex_source_zermelo.obj : $(START_DIR)/mb_fm_mex_source_zermelo.cpp + $(CPP) $(CPPFLAGS) -o "$@" "$<" + + +########################################################################### +## DEPENDENCIES +########################################################################### + +$(ALL_OBJS) : rtw_proj.tmw $(COMPILER_COMMAND_FILE) $(MAKEFILE) + + +########################################################################### +## MISCELLANEOUS TARGETS +########################################################################### + +info : + @echo "### PRODUCT = $(PRODUCT)" + @echo "### PRODUCT_TYPE = $(PRODUCT_TYPE)" + @echo "### BUILD_TYPE = $(BUILD_TYPE)" + @echo "### INCLUDES = $(INCLUDES)" + @echo "### DEFINES = $(DEFINES)" + @echo "### ALL_SRCS = $(ALL_SRCS)" + @echo "### ALL_OBJS = $(ALL_OBJS)" + @echo "### LIBS = $(LIBS)" + @echo "### MODELREF_LIBS = $(MODELREF_LIBS)" + @echo "### SYSTEM_LIBS = $(SYSTEM_LIBS)" + @echo "### TOOLCHAIN_LIBS = $(TOOLCHAIN_LIBS)" + @echo "### CFLAGS = $(CFLAGS)" + @echo "### LDFLAGS = $(LDFLAGS)" + @echo "### SHAREDLIB_LDFLAGS = $(SHAREDLIB_LDFLAGS)" + @echo "### CPPFLAGS = $(CPPFLAGS)" + @echo "### CPP_LDFLAGS = $(CPP_LDFLAGS)" + @echo "### CPP_SHAREDLIB_LDFLAGS = $(CPP_SHAREDLIB_LDFLAGS)" + @echo "### ARFLAGS = $(ARFLAGS)" + @echo "### MEX_CFLAGS = $(MEX_CFLAGS)" + @echo "### MEX_CPPFLAGS = $(MEX_CPPFLAGS)" + @echo "### MEX_LDFLAGS = $(MEX_LDFLAGS)" + @echo "### MEX_CPPLDFLAGS = $(MEX_CPPLDFLAGS)" + @echo "### DOWNLOAD_FLAGS = $(DOWNLOAD_FLAGS)" + @echo "### EXECUTE_FLAGS = $(EXECUTE_FLAGS)" + @echo "### MAKE_FLAGS = $(MAKE_FLAGS)" + + +clean : + $(ECHO) "### Deleting all derived files ..." + $(RM) $(subst /,\,$(PRODUCT)) + $(RM) $(subst /,\,$(ALL_OBJS)) + $(ECHO) "### Deleted all derived files." + + diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.rsp b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.rsp new file mode 100644 index 0000000000..95fd8b72e4 --- /dev/null +++ b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.rsp @@ -0,0 +1 @@ +mb_fm_mex_source_zermelo.obj diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw_comp.rsp b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw_comp.rsp new file mode 100644 index 0000000000..107d90470e --- /dev/null +++ b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw_comp.rsp @@ -0,0 +1,4 @@ +-IC:/Users/xavip/OneDrive/Documentos/GitHub/Swan/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp +-IC:/Users/xavip/OneDrive/Documentos/GitHub/Swan/OptimalControl/cesc +-IC:/Users/xavip/OneDrive/Documentos/GitHub/Swan/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/diff +-IC:/Program\ Files/MATLAB/R2023a/extern/include diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw_ref.rsp b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw_ref.rsp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_types.h b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_types.h new file mode 100644 index 0000000000..743eea9764 --- /dev/null +++ b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_types.h @@ -0,0 +1,22 @@ +// +// Academic License - for use in teaching, academic research, and meeting +// course requirements at degree granting institutions only. Not for +// government, commercial, or other organizational use. +// +// mb_fm_mex_source_zermelo_types.h +// +// Code generation for function 'mb_fm_mex_source_zermelo' +// + +#ifndef MB_FM_MEX_SOURCE_ZERMELO_TYPES_H +#define MB_FM_MEX_SOURCE_ZERMELO_TYPES_H + +// Include files +#include "rtwtypes.h" + +// Custom Header Code +#include +#define CHAR16_T uint16_t +#include "mex.h" +#endif +// End of code generation (mb_fm_mex_source_zermelo_types.h) diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/rtw_proj.tmw b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/rtw_proj.tmw new file mode 100644 index 0000000000..fd4b2b7361 --- /dev/null +++ b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/rtw_proj.tmw @@ -0,0 +1 @@ +Code generation project for mb_fm_mex_source_zermelo using toolchain "MinGW64 | gmake (64-bit Windows)". MATLAB root = C:\Program Files\MATLAB\R2023a. diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/rtwtypes.h b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/rtwtypes.h new file mode 100644 index 0000000000..e537b89b39 --- /dev/null +++ b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/rtwtypes.h @@ -0,0 +1,44 @@ +// +// Academic License - for use in teaching, academic research, and meeting +// course requirements at degree granting institutions only. Not for +// government, commercial, or other organizational use. +// +// rtwtypes.h +// +// Code generation for function 'mb_fm_mex_source_zermelo' +// + +#ifndef RTWTYPES_H +#define RTWTYPES_H + +/*=======================================================================* + * Fixed width word size data types: * + * int64_T - signed 64 bit integers * + * uint64_T - unsigned 64 bit integers * + *=======================================================================*/ + +#if defined(__APPLE__) +#ifndef INT64_T +#define INT64_T long +#define FMT64 "l" +#if defined(__LP64__) && !defined(INT_TYPE_64_IS_LONG) +#define INT_TYPE_64_IS_LONG +#endif +#endif +#endif + +#if defined(__APPLE__) +#ifndef UINT64_T +#define UINT64_T unsigned long +#define FMT64 "l" +#if defined(__LP64__) && !defined(INT_TYPE_64_IS_LONG) +#define INT_TYPE_64_IS_LONG +#endif +#endif +#endif + +// Include files +#include "tmwtypes.h" + +#endif +// End of code generation (rtwtypes.h) diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/setup_mingw.bat b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/setup_mingw.bat new file mode 100644 index 0000000000..4f69e4f2b5 --- /dev/null +++ b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/setup_mingw.bat @@ -0,0 +1,2 @@ +set "MINGW_ROOT=C:\PROGRA~3\MATLAB\SUPPOR~1\R2023a\3P778C~1.INS\MINGW_~1.INS\bin" +@set "PATH=%PATH%;%MINGW_ROOT%" \ No newline at end of file diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/diff/mb_fm_mex_source_zermelo.m b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/diff/mb_fm_mex_source_zermelo.m new file mode 100644 index 0000000000..ab68635562 --- /dev/null +++ b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/diff/mb_fm_mex_source_zermelo.m @@ -0,0 +1,41 @@ +function [ statesdot, j_statesdot ] = mb_fm_mex_source_zermelo(states, controls) +%mb_fm_mex_source_zermelo +% File automatically generated by FALCON.m + +%=== Extract Data From Input ============================================== +x = states(1); +y = states(2); +u = controls(1); + +%=== Jacobians and Hessians =============================================== +j_states = zeros(2, 3); +j_states(:, 1 : 2) = eye(2); +j_x = j_states(1, :); +j_y = j_states(2, :); +j_controls = zeros(1, 3); +j_controls(:, 3 : 3) = eye(1); +j_u = j_controls(1, :); + +%=== Write Constants ====================================================== + +%=== Subsystem source_zermelo ============================================= + +% Defined at ? + +% Call sys_398ef064917340965807c0c11f1a7ead_jac +[ statedottmp, j_statedottmp ] = sys_398ef064917340965807c0c11f1a7ead_jac(states, controls); + +% Hessian Jacobian for sys_398ef064917340965807c0c11f1a7ead_jac +tmp_j_input_sys_398ef064917340965807c0c11f1a7ead_jac = [j_states; j_controls]; + +% Calculation of Jacobian with respect to function global input for sys_398ef064917340965807c0c11f1a7ead_jac +j_statedottmp = j_statedottmp * tmp_j_input_sys_398ef064917340965807c0c11f1a7ead_jac; + +% Combine Variables to statesdot +statesdot = [statedottmp]; +j_statesdot = [ + j_statedottmp(1, :) + j_statedottmp(2, :) +]; + +end diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/diff/sys_398ef064917340965807c0c11f1a7ead-meta.json b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/diff/sys_398ef064917340965807c0c11f1a7ead-meta.json new file mode 100644 index 0000000000..deb927a365 --- /dev/null +++ b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/diff/sys_398ef064917340965807c0c11f1a7ead-meta.json @@ -0,0 +1 @@ +{"Class":"falcon.core.builder.DerivativeCacheEntry","Inputs":[{"Rows":2,"Cols":1,"Derivative":true},{"Rows":1,"Cols":1,"Derivative":true}],"Outputs":{"Rows":2,"Cols":1,"Derivative":true,"JacobianSparsity":[[false,true,true],[false,false,true]],"HessianSparsity":[]}} \ No newline at end of file diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/diff/sys_398ef064917340965807c0c11f1a7ead_jac.m b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/diff/sys_398ef064917340965807c0c11f1a7ead_jac.m new file mode 100644 index 0000000000..c1fe010c4c --- /dev/null +++ b/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/diff/sys_398ef064917340965807c0c11f1a7ead_jac.m @@ -0,0 +1,22 @@ +function [out1,j_out1,h_out1] = sys_398ef064917340965807c0c11f1a7ead_jac(in1,in2val1) +%SYS_398EF064917340965807C0C11F1A7EAD_JAC +% [OUT1,J_OUT1,H_OUT1] = SYS_398EF064917340965807C0C11F1A7EAD_JAC(IN1,IN2VAL1) + +% This function was generated by the Symbolic Math Toolbox version 9.3. +% 27-May-2025 01:35:10 + +%Generated using CreateGradient +%Input dimensions : {[2 1], [1 1]} +%Derivative inputs: [true true] +%DerivativeOrder : 1 +%Output dimensions: {[2 1]} +%Constant outputs : false +in1val2 = in1(2,:); +out1 = [in1val2./2.0+cos(in2val1).*3.0e+1;sin(in2val1).*3.0e+1]; +if nargout > 1 + j_out1 = reshape([0.0,0.0,1.0./2.0,0.0,sin(in2val1).*-3.0e+1,cos(in2val1).*3.0e+1],[2,3]); +end +if nargout > 2 + h_out1 = zeros(0,0); +end +end diff --git a/OptimalControl/cesc/main.m b/OptimalControl/cesc/main.m new file mode 100644 index 0000000000..6243a7b499 --- /dev/null +++ b/OptimalControl/cesc/main.m @@ -0,0 +1,122 @@ +% DIRECT COLLOCATION METHOD => Transcription done by Falcon +% Trapezoidal discretization +% NLP solver -> IPOPT + +clear; +clc; + +falcon.init(); + +%% Define States Controls and Parameter +x_vec = [... + falcon.State('x', -1000, 2000, 0.001);... + falcon.State('y', -1000, 2000, 0.001)]; + +u_vec = [... + falcon.Control('u' , -pi, pi, 1)]; + +tf = falcon.Parameter('FinalTime', 20, 0, 1000, 0.01); + +%% Define Optimal Control Problem +% Create new Problem Instance (Main Instance) +problem = falcon.Problem('Zermelo_wind'); + +% Specify Discretization +tau = linspace(0,1,201); + +% Add a new Phase +phase = problem.addNewPhase(@source_zermelo, x_vec, tau, 0, tf); +phase.addNewControlGrid(u_vec, tau); + + +% Set Boundary Condition +phase.setInitialBoundaries([0,0]); +phase.setFinalBoundaries([1000,200]); + + +% Add Cost Function +problem.addNewLinearPointCost(tf); + + +% Prepare problem for solving +problem.Bake(); + +% Solve problem +solver = falcon.solver.ipopt(problem); +solver.Options.MajorIterLimit = 500; +solver.Options.MajorFeasTol = 1e-6; +solver.Options.MajorOptTol = 1e-6; + +solver.Solve(); + +%% Plots + +results = struct(); +results.t = problem.RealTime; +results.tfinal = problem.Parameters.byName().FinalTime.Value; +results.x = x_vec.extractValuesStructFrom(problem); +results.u = u_vec.extractValuesStructFrom(problem); + +figure(); + +ax = subplot(2, 2, 1); +plot(ax, results.t, rad2deg(results.u.u)); +xlabel(ax, "t"); +ylabel(ax, "alfa (deg)"); + +ax = subplot(2, 2, 2); +plot(ax, results.x.x, results.x.y); +xlabel(ax, "x"); +ylabel(ax, "y"); + +% Plot with wind vector field + +% Define the range for x and y +x = linspace(0, 1100, 20); +y = linspace(0, 250, 20); + +% Create meshgrid for x and y +[X, Y] = meshgrid(x, y); + +% Define the vector field +vx = 0.05 * Y; +vy= 0 * X; + +set(groot, 'defaultTextInterpreter', 'latex'); +set(groot, 'defaultAxesTickLabelInterpreter', 'latex'); +set(groot, 'defaultLegendInterpreter', 'latex'); + +% Plot the vector field and the trajectory using quiver +figure; +quiver(X, Y, vx, vy, 'AutoScaleFactor', 0.75); +hold on; % Keep the figure for further plotting + +% Plot the trajectory on top of the vector field +plot(results.x.x, results.x.y, 'b', 'LineWidth', 2); + +% Plot starting point +plot(results.x.x(1), results.x.y(1), 'go', 'MarkerSize', 8, 'MarkerFaceColor', 'g'); + +% Plot target point +plot(results.x.x(end), results.x.y(end), 'ro', 'MarkerSize', 8, 'MarkerFaceColor', 'r'); + +% Add annotations and grid +xlim([0 1000]); % Setting x-axis limits +ylim([0 250]); % Setting y-axis limits +title('Wind Vector Field with Trajectory'); +xlabel('X Coordinate'); +ylabel('Y Coordinate'); +legend('Wind Vectors', 'Trajectory', 'Location', 'best'); +grid on; +hold off; % Release the figure + +% Control plot + +figure; +plot(results.t, rad2deg(results.u.u), 'r', 'LineWidth', 2); +grid on; +xlabel('Time [s]'); +ylabel('\alpha [^\circ]'); +title('Control Angle \alpha Over Time'); + +results.tfinal diff --git a/OptimalControl/cesc/source_zermelo.m b/OptimalControl/cesc/source_zermelo.m new file mode 100644 index 0000000000..e2f52316ff --- /dev/null +++ b/OptimalControl/cesc/source_zermelo.m @@ -0,0 +1,24 @@ +function [states_dot] = source_zermelo(states, controls) %#codegen + +% model interface created by falcon.m + +% Extract states +x = states(1); +y = states(2); + +% Extract controls +u = controls(1); + +% Constants +V=30; % m/s + +% ------------------------ % +% implement the model here % +% ------------------------ % + +% implement state derivatives here +x_dot = V*cos(u) + 0.5*y; +y_dot = V*sin(u); +states_dot = [x_dot; y_dot]; +% EoF +end \ No newline at end of file diff --git a/OptimalControl/drag pruebas/drag_data.mat b/OptimalControl/drag pruebas/drag_data.mat new file mode 100644 index 0000000000000000000000000000000000000000..cb06a5c2390552258a057bde209f54c2f82b836a GIT binary patch literal 42849 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 DH$6aU literal 0 HcmV?d00001 diff --git a/OptimalControl/drag pruebas/main_constraint_drag.m b/OptimalControl/drag pruebas/main_constraint_drag.m new file mode 100644 index 0000000000..967f019cc9 --- /dev/null +++ b/OptimalControl/drag pruebas/main_constraint_drag.m @@ -0,0 +1,183 @@ +function main_constraint_drag + persistent u_history J_history; + clc; close all + + g = 9.81; % Gravity [m/s^2] + rho = 1.225; % Air density [kg/m^3] + Sw = 2; % Wing/Aerodynamic surface [m^2] + Cd0 = 0.01; % Drag coefficient + m = 1; % Object mass [kg] + k = 0.05; + Clalpha = 2*pi; + Cl0 = 0; + + N = 50; % Discretization + + x1_0 = 0; x2_0 = 0; v0 = 15; + gamma0 = deg2rad(40); + t0 = 0; tf = 30; + alpha0 = deg2rad(10); + u0 = [tf; alpha0]; + lb = [0 0.01]; % Lower bounds for the control + ub = [500 deg2rad(10)]; % Upper bounds for the control + + u0 = [u0(1) ones(1,N)*u0(2)]; + lb = [lb(1) ones(1,N)*lb(2)]; + ub = [ub(1) ones(1,N)*ub(2)]; + + % Previous calculations (Derivatives) + + Cl = @(alpha) Cl0 + Clalpha*alpha; + Cd = @(alpha) Cd0 + k*Cl(alpha).^2; + D = @(V,alpha) 0.5*rho*Sw*V.^2.*Cd(alpha); + + dCl = Clalpha; % Derivative respecto to alpha + dCd = @(alpha) 2*k*Cl(alpha)*dCl; % Derivative respect to alpha + dDda = @(V,alpha) 0.5*rho*Sw*V.^2.*dCd(alpha); % Derivative respect to alpha + + dDdv = @(V,alpha) rho*Sw*V.*Cd(alpha); % Derivative respect to velocity + + cost = @(u) f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D, dDda, dDdv, N, m); + constraint = @(u) groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, dDda, dDdv, N, m); + + [valid,err] = checkGradients(cost, u0, 'Tolerance', 1e-3, 'Display', 'on'); + assignin('base', 'err', err); + %[valid2,err2] = checkGradients(constraint, u0, 'Tolerance', 1e-3, 'Display', 'on') + %assignin('base', 'err2', err2); + + options = optimoptions("fmincon", ... + "OutputFcn", @store_fmincon, ... + "Algorithm", "sqp", ... + "DerivativeCheck", "on","Display","iter"); + + [u_opt, ~] = fmincon(cost, u0, [], [], [], [], lb, ub, @(u) nonlcon(u,constraint), options); + + y0 = [x1_0 x2_0 v0 gamma0]; + t_span = linspace(t0, u_opt(1), N); + [~, y] = ode45(@(t, y) dynamics(t, y, tf, u_opt(2:N+1), g, D, N, m), t_span, y0); + + disp(["Maximum distance [m] = ", num2str(y(end, 1))]) + disp(["Initial angle [°]: ", num2str(rad2deg(u_opt(2)))]) + disp(["Final Time [s]: ", num2str(u_opt(1))]) + + figure; plot(y(:,1), y(:,2), 'b-', 'LineWidth', 2); + xlabel("Horizontal distance [m]"); ylabel("Vertical distance [m]"); grid on; + + figure; plot(u_history(:,1), 'b-o', 'LineWidth', 2); + xlabel('Iteration'); ylabel('Final time [s]'); grid on; + + figure; plot(rad2deg(u_history(:,2)), 'r-o', 'LineWidth', 2); + xlabel('Iteration'); ylabel('Initial angle [°]'); grid on; + + figure; plot(J_history, 'o-', 'LineWidth', 2); + xlabel('Iteration'); ylabel('Cost function J'); grid on; + + vars = whos; + nodrag_results = struct(); + for i = 1:length(vars) + nodrag_results.(vars(i).name) = eval(vars(i).name); + end + + function stop = store_fmincon(u, optimValues, state) + if optimValues.iteration == 0 + u_history = []; + J_history = []; + end + if strcmp(state, 'iter') + u_history = [u_history; u(:)']; + J_history = [J_history; optimValues.fval]; + assignin('base', 'u_iterations', u_history); + assignin('base', 'J_iterations', J_history); + end + stop = false; + end +end + +function [c, ceq, Dc, Dceq] = nonlcon(u,constraint) + c = []; + Dc = []; + [ceq, Dceq] = constraint(u); +end + +function [J, gradJ] = f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D, dDdv, dDda, N, m) + y0 = [x1_0 x2_0 v0 gamma0]; + tf = u(1); + alpha = u(2:N+1); + t_span = linspace(t0, tf, N); + [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, D, N, m), t_span, y0); + + J = -y(end,1); + dydt_final = dynamics(tf, y(end,:)', tf, alpha, g, D, N, m); + + pT = [1 0 0 0]; + [~, p] = ode45(@(t, p) adjoint(t, p, y, g, t_span, alpha, dDdv, m), flip(t_span), pT); + + % ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; + % v = y(ind,3); + %v = interp1(t_span, y(:,3), t); + v = y(:,3); + DFdu = -dDda(v,alpha')./m; + % gradJ = [-dydt_final(1); DFdu.*p(:,3)]; + gradJ = zeros(N+1,1); + gradJ(1) = -dydt_final(1); + for i = 1:N + gradJ(i+1) = DFdu(i) * p(i,3); + end +end + +function [ceq, Dceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, dDdv, dDda, N, m) + y0 = [x1_0 x2_0 v0 gamma0]'; + tf = u(1); + t_span = linspace(t0, tf, N); + alpha = u(2:N+1); + [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, D, N, m), t_span, y0); + + ceq = y(end,2); + dydt_final = dynamics(t_span(end), y(end,:)', tf, alpha, g, D, N, m); + + pT = [0 -1 0 0]; + [~, p] = ode45(@(t, p) adjoint(t, p, y, g, t_span, alpha, dDdv, m), flip(t_span), pT); + + % v = interp1(t_span, y(:,3), t); + % ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; + % v = y(ind,3); + v = y(:,3); + DFdu = -dDda(v,alpha'); + + Dceq = [dydt_final(2); DFdu.*p(:,3)]; +end + +function dpdt = adjoint(t, p, y, g, t_span, alpha, dDdv, m) + v = interp1(t_span, y(:,3), t); + gamma = interp1(t_span, y(:,4), t); + alpha = interp1(t_span, alpha, t); + + % ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; + % v = y(ind,3); + % gamma = y(ind,4); + % alpha = alpha(ind); + + J = [0 0 0 0; + 0 0 0 0; + cos(gamma) sin(gamma) -dDdv(v,alpha)/m (g/v^2)*cos(gamma); + -v*sin(gamma) v*cos(gamma) -g*cos(gamma) (g/v)*sin(gamma)]; + dpdt = -J*p; +end + +function dydt = dynamics(t, y, tf, alpha, g, D, N, m) + v = y(3); + gamma = y(4); + + t_span = linspace(0, tf, N); + % ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; + % alpha = alpha(ind); + + alpha = interp1(t_span, alpha, t); + + dydt = [ + v*cos(gamma); + v*sin(gamma); + -g*sin(gamma)-D(v,alpha)/m; + -(g/v)*cos(gamma) + ]; +end diff --git a/OptimalControl/drag pruebas/nodrag_data.mat b/OptimalControl/drag pruebas/nodrag_data.mat new file mode 100644 index 0000000000000000000000000000000000000000..0bb8bd9ca73b6d5dbedb9cb0ad56950fce42af2c GIT binary patch literal 46208 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%0DFfqp~$+d#CAlNdr%F~W6F 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 Gfjyq@=caj`L9o%FVo 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 literal 0 HcmV?d00001 diff --git a/OptimalControl/drag/main_constraint_drag.m b/OptimalControl/drag/main_constraint_drag.m index 3e7825d9ca..e8427cfb26 100644 --- a/OptimalControl/drag/main_constraint_drag.m +++ b/OptimalControl/drag/main_constraint_drag.m @@ -42,8 +42,8 @@ [valid,err] = checkGradients(cost, u0, 'Tolerance', 1e-3, 'Display', 'on'); assignin('base', 'err', err); - [valid2,err2] = checkGradients(constraint, u0, 'Tolerance', 1e-3, 'Display', 'on') - assignin('base', 'err2', err2); + %[valid2,err2] = checkGradients(constraint, u0, 'Tolerance', 1e-3, 'Display', 'on') + %assignin('base', 'err2', err2); options = optimoptions("fmincon", ... "OutputFcn", @store_fmincon, ... @@ -103,22 +103,20 @@ y0 = [x1_0 x2_0 v0 gamma0]; tf = u(1); alpha = u(2:N+1); - t_span = linspace(t0, u(1), N); + t_span = linspace(t0, tf, N); [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, D, N, m), t_span, y0); J = -y(end,1); - dydt_final = dynamics(t_span(end), y(end,:)', tf, alpha, g, D, N, m); + dydt_final = dynamics(tf, y(end,:)', tf, alpha, g, D, N, m); pT = [1 0 0 0]; [~, p] = ode45(@(t, p) adjoint(t, p, y, g, t_span, alpha, dDdv, m), flip(t_span), pT); - % ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; % v = y(ind,3); %v = interp1(t_span, y(:,3), t); v = y(:,3); DFdu = -dDda(v,alpha')./m; - % gradJ = [-dydt_final(1); DFdu.*p(:,3)]; gradJ = zeros(N+1,1); gradJ(1) = -dydt_final(1); @@ -161,7 +159,7 @@ J = [0 0 0 0; 0 0 0 0; - cos(gamma) sin(gamma) -dDdv(v,alpha')./m (g/v^2)*cos(gamma); + cos(gamma) sin(gamma) -dDdv(v,alpha)/m (g/v^2)*cos(gamma); -v*sin(gamma) v*cos(gamma) -g*cos(gamma) (g/v)*sin(gamma)]; dpdt = -J*p; end diff --git a/OptimalControl/nodrag/main_constraint_nodrag.m b/OptimalControl/nodrag/main_constraint_nodrag.m index c37dd9e5e6..6a803e97ef 100644 --- a/OptimalControl/nodrag/main_constraint_nodrag.m +++ b/OptimalControl/nodrag/main_constraint_nodrag.m @@ -32,17 +32,44 @@ disp(["Initial angle [°]: ", num2str(rad2deg(u_opt(2)))]) disp(["Final Time [s]: ", num2str(u_opt(1))]) - figure; plot(y(:,1), y(:,2), 'b-', 'LineWidth', 2); - xlabel("Horizontal distance [m]"); ylabel("Vertical distance [m]"); grid on; - - figure; plot(u_history(:,1), 'b-o', 'LineWidth', 2); + %%% Results plot %%% + + set(groot, 'defaultTextInterpreter', 'latex'); + set(groot, 'defaultAxesTickLabelInterpreter', 'latex'); + set(groot, 'defaultLegendInterpreter', 'latex'); + + % Trajectory + + figure; + plot(y(:,1), y(:,2), 'b-', 'LineWidth', 2); + hold on + plot(y(1,1), y(1,2), 'go', 'MarkerSize', 7, 'MarkerFaceColor', 'g'); % initial + plot(y(end,1), y(end,2), 'ro', 'MarkerSize', 7, 'MarkerFaceColor', 'r'); % final + xlabel("Horizontal distance [m]"); + ylabel("Vertical distance [m]"); + ylim([0 6]) + grid on; + legend({'Trajectory','Start','Final'}, 'Location', 'Best'); + + % Control over iterations + + figure; + subplot(2,1,1) + plot(u_history(:,1), 'b-o', 'LineWidth', 2, 'MarkerSize', 6); xlabel('Iteration'); ylabel('Final time [s]'); grid on; + title('Convergence of final time') + + subplot(2,1,2) + plot(rad2deg(u_history(:,2)), 'r-o', 'LineWidth', 2, 'MarkerSize', 6); + xlabel('Iteration'); ylabel('Initial angle [$^circ$]'); grid on; + title('Convergence of initial angle') - figure; plot(rad2deg(u_history(:,2)), 'r-o', 'LineWidth', 2); - xlabel('Iteration'); ylabel('Initial angle [°]'); grid on; + % Cost function - figure; plot(J_history, 'o-', 'LineWidth', 2); + figure; + plot(J_history, 'k-o', 'LineWidth', 2, 'MarkerSize', 6); xlabel('Iteration'); ylabel('Cost function J'); grid on; + title('Evolution of cost function') vars = whos; nodrag_results = struct(); diff --git a/OptimalControl/nodrag/nodrag_data.mat b/OptimalControl/nodrag/nodrag_data.mat index a8808a1670b6b4ab204d8b412d5273427af0f8d6..c817f0d25a51c3a0da67341484855dc26eb6515b 100644 GIT binary patch delta 49003 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 Date: Thu, 29 May 2025 21:15:27 +0200 Subject: [PATCH 10/22] Pruebas con diferencias finitas --- OptimalControl/drag/main_constraint_drag.m | 109 +++++++++++++++++++-- 1 file changed, 102 insertions(+), 7 deletions(-) diff --git a/OptimalControl/drag/main_constraint_drag.m b/OptimalControl/drag/main_constraint_drag.m index 5db9c235b8..704113b512 100644 --- a/OptimalControl/drag/main_constraint_drag.m +++ b/OptimalControl/drag/main_constraint_drag.m @@ -11,12 +11,12 @@ Clalpha = 2*pi; Cl0 = 0; - N = 50; % Discretization + N = 100; % Discretization x1_0 = 0; x2_0 = 0; v0 = 15; gamma0 = deg2rad(40); - t0 = 0; tf = 30; - alpha0 = deg2rad(10); + t0 = 0; tf = 10; + alpha0 = deg2rad(3); u0 = [tf; alpha0]; lb = [0 0.01]; % Lower bounds for the control ub = [50 deg2rad(10)]; % Upper bounds for the control @@ -40,11 +40,106 @@ cost = @(u) f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D, dDda, dDdv, N, m); constraint = @(u) groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, dDda, dDdv, N, m); + eps = 1e-6; + [cost0, grad0] = cost(u0); + for i=1:N+1 + uI = u0; + uI(i) = uI(i) + eps*u0(i); + costI(i) = cost(uI); + gradD(i) = (costI(i)-cost0)/(uI(i)-u0(i)); + end + + plot(grad0(2:end)/(tf/N),'-+') + hold on + plot(gradD(2:end),'-+') + + % Coste centrada + + % eps = 1e-6; + % [cost0, grad0] = cost(u0); + % + % gradD = zeros(N+1, 1); % inicializar vector de derivadas + % + % for i = 1:N+1 + % u_forward = u0; + % u_backward = u0; + % + % % Asegura que el paso no sea nulo si u0(i) es cero + % delta = eps * max(1, abs(u0(i))); + % + % u_forward(i) = u_forward(i) + delta*u0(i); + % u_backward(i) = u_backward(i) - delta*u0(i); + % + % cost_forward = cost(u_forward); + % cost_backward = cost(u_backward); + % + % % Diferencia centrada + % gradD(i) = (cost_forward - cost_backward) / (2 * delta); + % end + % + % plot(grad0(2:end)/(tf/N), '-+') + % hold on + % plot(gradD(2:end), '-+') + % legend('Gradiente analítico', 'Gradiente centrado numérico') + % xlabel('Índice de variable de control') + % ylabel('Derivada') + % title('Comparación entre gradiente del coste analítico y numérico centrado') + + + % eps = 1e-6; + % [constraint0,gradconst0] = constraint(u0); + % for i=1:N+1 + % uI = u0; + % uI(i) = uI(i) + eps*u0(i); + % constraintI(i) = constraint(uI); + % gradconstD(i) = (constraintI(i)-constraint0)/(uI(i)-u0(i)); + % end + % + % figure + % plot(gradconst0/(tf/N),'-+') + % hold on + % plot(gradconstD,'-+') + + % Centrada + + eps = 1e-6; + [constraint0, gradconst0] = constraint(u0); + + gradconstD = zeros(N+1, 1); % inicializar vector de derivadas + + for i = 1:N+1 + u_forward = u0; + u_backward = u0; + + % evitar que eps*u0(i) sea cero si u0(i) lo es + delta = eps * max(1, abs(u0(i))); + + u_forward(i) = u_forward(i) + delta; + u_backward(i) = u_backward(i) - delta; + + constraint_forward = constraint(u_forward); + constraint_backward = constraint(u_backward); + + % derivada centrada + gradconstD(i) = (constraint_forward - constraint_backward) / (2 * delta); + end + + figure + plot(gradconst0(2:end)/(tf/N), '-+') + hold on + plot(gradconstD(2:end), '-+') + legend('Gradiente analítico', 'Gradiente centrado numérico') + xlabel('Índice de variable de control') + ylabel('Derivada') + title('Comparación entre gradiente analítico y numérico centrado') + + + [valid,err] = checkGradients(cost, u0, 'Tolerance', 1e-3, 'Display', 'on'); assignin('base', 'err', err); + [valid2,err2] = checkGradients(constraint, u0, 'Tolerance', 1e-3, 'Display', 'on') + assignin('base', 'err2', err2); - %[valid2,err2] = checkGradients(constraint, u0, 'Tolerance', 1e-3, 'Display', 'on') - %assignin('base', 'err2', err2); options = optimoptions("fmincon", ... "OutputFcn", @store_fmincon, ... @@ -118,8 +213,8 @@ %v = interp1(t_span, y(:,3), t); v = y(:,3); DFdu = -dDda(v,alpha')./m; - - gradJ = [-dydt_final(1); -DFdu.*p(:,3)]; + p3 = p((N:-1:1),3); + gradJ = [-dydt_final(1); -DFdu.*p3]; %gradJ = zeros(N+1,1); %gradJ(1) = -dydt_final(1); %for i = 1:N From 28573b428b47942e045df23b86705069b6872334 Mon Sep 17 00:00:00 2001 From: XaviPozo <168111392+XaviPozo@users.noreply.github.com> Date: Wed, 11 Jun 2025 17:13:49 +0200 Subject: [PATCH 11/22] pruebas --- OptimalControl/drag y lift/drag_data.mat | Bin 0 -> 42849 bytes .../drag y lift/main_constraint_draglift.m | 245 ++++++++++++++++++ OptimalControl/drag y lift/nodrag_data.mat | Bin 0 -> 46208 bytes OptimalControl/drag/main_constraint_drag.m | 148 +++++------ .../nodrag/main_constraint_nodrag.m | 6 +- OptimalControl/nodrag/nodrag_data.mat | Bin 65257 -> 42863 bytes 6 files changed, 313 insertions(+), 86 deletions(-) create mode 100644 OptimalControl/drag y lift/drag_data.mat create mode 100644 OptimalControl/drag y lift/main_constraint_draglift.m create mode 100644 OptimalControl/drag y lift/nodrag_data.mat diff --git a/OptimalControl/drag y lift/drag_data.mat b/OptimalControl/drag y lift/drag_data.mat new file mode 100644 index 0000000000000000000000000000000000000000..cb06a5c2390552258a057bde209f54c2f82b836a GIT binary patch literal 42849 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 DH$6aU literal 0 HcmV?d00001 diff --git a/OptimalControl/drag y lift/main_constraint_draglift.m b/OptimalControl/drag y lift/main_constraint_draglift.m new file mode 100644 index 0000000000..b725e849db --- /dev/null +++ b/OptimalControl/drag y lift/main_constraint_draglift.m @@ -0,0 +1,245 @@ +function main_constraint_draglift + persistent u_history J_history; + clc; close all + + g = 9.81; % Gravity [m/s^2] + rho = 1.225; % Air density [kg/m^3] + Sw = 0.6; % Wing/Aerodynamic surface [m^2] + Cd0 = 0.03; % Drag coefficient + m = 5; % Object mass [kg] + k = 0.05; + Clalpha = 5.7296; + Cl0 = 0; + + N = 50; % Discretization + + x1_0 = 0; x2_0 = 0; v0 = 15; + gamma0 = deg2rad(40); + t0 = 0; tf = 20; + alpha0 = deg2rad(3); + u0 = [tf; alpha0]; + lb = [0 deg2rad(-10)]; % Lower bounds for the control + ub = [500 deg2rad(10)]; % Upper bounds for the control + + u0 = [u0(1) ones(1,N)*u0(2)]; + lb = [lb(1) ones(1,N)*lb(2)]; + ub = [ub(1) ones(1,N)*ub(2)]; + + % Previous calculations (Derivatives) + + Cl = @(alpha) Cl0 + Clalpha*alpha; + Cd = @(alpha) Cd0 + k*Cl(alpha).^2; + D = @(V,alpha) 0.5*rho*Sw*V.^2.*Cd(alpha); + L = @(V,alpha) 0.5*rho*Sw*V.^2.*Cl(alpha); + + dCl = Clalpha; % Derivative respecto to alpha + dCd = @(alpha) 2*k*Cl(alpha)*dCl; % Derivative respect to alpha + dDda = @(V,alpha) 0.5*rho*Sw*V.^2.*dCd(alpha); % Derivative respect to alpha + + dDdv = @(V,alpha) rho*Sw*V.*Cd(alpha); % Derivative respect to velocity + dLdv = @(alpha) rho*Sw*Cl(alpha)/m; % Derivative respect to velocity + + cost = @(u) f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D, dDda, dDdv, N, m, L, dLdv); + constraint = @(u) groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, dDda, dDdv, N, m, L, dLdv); + % + % eps = 1e-6; + % [cost0, grad0] = cost(u0); + % for i=1:N+1 + % uI = u0; + % uI(i) = uI(i) + eps*u0(i); + % costI(i) = cost(uI); + % gradD(i) = (costI(i)-cost0)/(uI(i)-u0(i)); + % end + + % plot(grad0(1:end),'-+') + % hold on + % plot(gradD(1:end),'-+') + + % Coste centrada + + % eps = 1e-6; + % [cost0, grad0] = cost(u0); + % + % gradD = zeros(N+1, 1); % inicializar vector de derivadas + % + % for i = 1:N+1 + % u_forward = u0; + % u_backward = u0; + % + % % Asegura que el paso no sea nulo si u0(i) es cero + % delta = eps * max(1, abs(u0(i))); + % + % u_forward(i) = u_forward(i) + delta*u0(i); + % u_backward(i) = u_backward(i) - delta*u0(i); + % + % cost_forward = cost(u_forward); + % cost_backward = cost(u_backward); + % + % % Diferencia centrada + % gradD(i) = (cost_forward - cost_backward) / (2 * delta); + % end + % + % plot(grad0(2:end)/(tf/N), '-+') + % hold on + % plot(gradD(2:end), '-+') + % legend('Gradiente analítico', 'Gradiente centrado numérico') + % xlabel('Índice de variable de control') + % ylabel('Derivada') + % title('Comparación entre gradiente del coste analítico y numérico centrado') + + + % eps = 1e-6; + % [constraint0,gradconst0] = constraint(u0); + % for i=1:N+1 + % uI = u0; + % uI(i) = uI(i) + eps*u0(i); + % constraintI(i) = constraint(uI); + % gradconstD(i) = (constraintI(i)-constraint0)/(uI(i)-u0(i)); + % end + % + % figure + % plot(gradconst0/(tf/N),'-+') + % hold on + % plot(gradconstD,'-+') + + % Centrada + + % eps = 1e-6; + % [constraint0, gradconst0] = constraint(u0); + % + % gradconstD = zeros(N+1, 1); % inicializar vector de derivadas + % + % for i = 1:N+1 + % u_forward = u0; + % u_backward = u0; + % + % % evitar que eps*u0(i) sea cero si u0(i) lo es + % delta = eps * max(1, abs(u0(i))); + % + % u_forward(i) = u_forward(i) + delta; + % u_backward(i) = u_backward(i) - delta; + % + % constraint_forward = constraint(u_forward); + % constraint_backward = constraint(u_backward); + % + % % derivada centrada + % gradconstD(i) = (constraint_forward - constraint_backward) / (2 * delta); + % end + % + % figure + % plot(gradconst0(2:end)/(tf/N), '-+') + % hold on + % plot(gradconstD(2:end), '-+') + % legend('Gradiente analítico', 'Gradiente centrado numérico') + % xlabel('Índice de variable de control') + % ylabel('Derivada') + % title('Comparación entre gradiente analítico y numérico centrado') + % + % [valid,err] = checkGradients(cost, u0, 'Tolerance', 1e-3, 'Display', 'on'); + % assignin('base', 'err', err); + % [valid2,err2] = checkGradients(constraint, u0, 'Tolerance', 1e-3, 'Display', 'on') + % assignin('base', 'err2', err2); + + + options = optimoptions("fmincon", ... + "OutputFcn", @store_fmincon, ... + "Algorithm", "sqp", ... + "DerivativeCheck", "on","Display","iter"); + + [u_opt, ~] = fmincon(cost, u0, [], [], [], [], lb, ub, @(u) nonlcon(u,constraint), options); + + y0 = [x1_0 x2_0 v0 gamma0]; + t_span = linspace(t0, u_opt(1), N); + [~, y] = ode45(@(t, y) dynamics(t, y, tf, u_opt(2:N+1), g, D, N, m, L), t_span, y0); + + disp(["Maximum distance [m] = ", num2str(y(end, 1))]) + disp(["Initial angle [°]: ", num2str(rad2deg(u_opt(2)))]) + disp(["Final Time [s]: ", num2str(u_opt(1))]) + + figure; plot(y(:,1), y(:,2), 'b-', 'LineWidth', 2); + xlabel("Horizontal distance [m]"); ylabel("Vertical distance [m]"); grid on; + + figure; plot(u_history(:,1), 'b-o', 'LineWidth', 2); + xlabel('Iteration'); ylabel('Final time [s]'); grid on; + + figure; plot(rad2deg(u_history(:,2)), 'r-o', 'LineWidth', 2); + xlabel('Iteration'); ylabel('Initial angle [°]'); grid on; + + figure; plot(J_history, 'o-', 'LineWidth', 2); + xlabel('Iteration'); ylabel('Cost function J'); grid on; + + vars = whos; + nodrag_results = struct(); + for i = 1:length(vars) + nodrag_results.(vars(i).name) = eval(vars(i).name); + end + + function stop = store_fmincon(u, optimValues, state) + if optimValues.iteration == 0 + u_history = []; + J_history = []; + end + if strcmp(state, 'iter') + u_history = [u_history; u(:)']; + J_history = [J_history; optimValues.fval]; + assignin('base', 'u_iterations', u_history); + assignin('base', 'J_iterations', J_history); + end + stop = false; + end +end + +function [c, ceq] = nonlcon(u,constraint) + c = []; + Dc = []; + [ceq] = constraint(u); +end + +function [J] = f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D, dDdv, dDda, N, m, L, dLdv) + y0 = [x1_0 x2_0 v0 gamma0]; + tf = u(1); + alpha = u(2:N+1); + t_span = linspace(t0, tf, N)'; + [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, D, N, m, L), t_span, y0); + + J = -y(end,1); + +end + +function [ceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, dDdv, dDda, N, m, L, dLdv) + y0 = [x1_0 x2_0 v0 gamma0]'; + tf = u(1); + t_span = linspace(t0, tf, N); + alpha = u(2:N+1); + [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, D, N, m, L), t_span, y0); + + ceq = y(end,2); + +end + +function dpdt = adjoint(t, p, y, g, t_span, alpha, dDdv, m, dLdv) + v = interp1(t_span, y(:,3), t); + gamma = interp1(t_span, y(:,4), t); + alpha = interp1(t_span, alpha, t); + + J = [0 0 0 0; + 0 0 0 0; + cos(gamma) sin(gamma) -dDdv(v,alpha)./m (g/v^2)*cos(gamma)+dLdv(alpha); + -v*sin(gamma) v*cos(gamma) -g*cos(gamma) (g/v)*sin(gamma)]; + dpdt = -J*p; +end + +function dydt = dynamics(t, y, tf, alpha, g, D, N, m, L) + v = y(3); + gamma = y(4); + + t_span = linspace(0, tf, N); + alpha = interp1(t_span, alpha, t); + + dydt = [ + v*cos(gamma); + v*sin(gamma); + -g*sin(gamma)-D(v,alpha)/m; + -(g/v)*cos(gamma)+L(v,alpha)/(m*v); + ]; +end diff --git a/OptimalControl/drag y lift/nodrag_data.mat b/OptimalControl/drag y lift/nodrag_data.mat new file mode 100644 index 0000000000000000000000000000000000000000..0bb8bd9ca73b6d5dbedb9cb0ad56950fce42af2c GIT binary patch literal 46208 zcma&NRa6{2v^I=uaWC%f?pEB3dns1jT?PsiE$-gp?oeEd!{81>aUa|UX1@2FbMs&R zSu1PhBH59>ll|n`iH5A6x~v?HAQumfhO8c^orAM22aUF~mA9Rnr;8Ykw!EQ=rjP&! zjl8F=mA9=8jhm|&jiRRmjfPbK4GkX+FOQg@kQko`4IdAmAkF{JL`?$se+gbi1Lwa| z7BL*0fBuCLx;mjDX($JKTxD1>&3Kzhyzk#S)HZ|dBKjTwU*9iBeZFMb+WJLL&rVv^ zt*EBAZwxc-8C#pS3c6?$aH}&ehkbNu`>9_u`lZ;SPHCCAQq?|RxX0?Ev2m?jBYS4* z3EBaJB)RRtfESN4XnzwG$D@b2wzO&gokiMmPn-;5p}Kr!iBI7bHy2u&IIl{fhC=a# znaEn|G&AimaC75wxhALQnBvNwt2l-87SL<3D=L#!#Pd1ijVU>VeVYB3XJ_*AVN>~nXTylw%$1!5K zj#w!1q(ZK{#_gFuJs)sex{i33#OaVMjQ)wcB|I8^OSU4)8)_ciJ`t;x)9*T#Yw-Wx z6Jn0}*lY8szcn4X|M7IW3&K%b)0sqr>K-vsuH#50r!paCLvq3R}A8sH=Rj^Qsy@}zL1 zLe75*2k1@6opubp&3^>)I1h~1ooj~28_2y_g~$)*)v;G6_{toE%{pCg=ck?zZS7aQ z=xJ62=Z5CEqFJk|wnw{Ki8*T)xt1JWG%F5+@(sSVn>0B&RbU72k!(FbWV{^OPRfd7 zT(qiP-1ihbZLj69w+v5hy<}es@N3FTwaw)^Wgqb{^RGnN$@3MQHhbBp`hFZWT}Q9~ zAn!C0b{Zif2I*;s#-ef*~k4?D_(7q)70f zXX)9<_wjm~kwqd`Z7KFF=X*rjde<**>YA@Cwc=DT&gljnj%E72{(Crl z1dT=7bOHjvmxQcrr;=R&|2V?Ub3aY_8F_mIS;pRtB0JwHb(+djL%@Zd13Io=7d5kM zQ6A%8K#f$WXp2ApG*e~i)78yXfR8nL;8{c4OI+a7bh&PB6Vj%mmId`cQ&%iXJj zRSyGBDe1!k!tb#AkZ&$jSFhn)7OJBY=dDN?Z}#RpjZPD!-&F%|9;U8B^W_?Qk2~8! z$42`)*s##rv$9rhowXp%WNho~p{LG|6J$sk_dVdt*B;IPnlv5O5V)ympGr6#H>`)M zeph|duRZbQWr`~PV-e#4_ZWnB=P|Bf-rgQ6{jF9sTQu#9>A75C14YK$ik4!oupKU8 zKhQ5i)#D8r4h{yp%nA_E--L~6ePXq)ik$SG<{v9R4W^5lCQSX+^&^#m&6?4y>>HuS zybE21Dt^X_DxX3cgE=diTAcdv_+d9>`|}u!l}h3^;r*Q7Noi*IcNu=tdu=yK7uALJFU?_bAp}w((?Kd6;0y1M8{_=<#=7l zm^;^(U$b&OQa>iWC|KcSeOrbRXbHGgQa zq1#V6&ARm2z#k&Y+x@pLmgX6}!EJcF>Sgn}vH1r_U@u-5iq1X&zp0?;#Ed5F9??Y; zy8Zm?Z6X7_dce?e*X!Tv!q43KLXO^5IjQ36Ya064YU7c-Db~^g8NDegbPFkI!;FuR zzIs~exN|vKBH3pU22>e-q3FDn*DMR7sJbcY*Llk8uM8tQ`>($SSGQFW&zAF_{Nzfm z$LC#QBj3}u-W)8!6iTkXcjjVaDR~9Cp2z=HF$M7yZe7sPjizmej$xE{yQk*$7gcyC z(hGOXTa{Ls_e6YhWYX5upo-i%J}K93>%Buz}|?qXNZU`==fpLy7Mmx z@|jusjPJwOoWm5XOh_HHLwYiCBWbxS*ALzX1o1K1saLR7M|>>YQLh2}EN|Zsca}bKF9yGFlv2+Mm0GCN0>k!^$Zb{nPf)i-B~}81 zB$eJ}PSJyqHC!vUpTr`o`zr(V-tVoUrDx=hRQg5Q52*T<+7F2O)Y>malVCk4bY42c zvg%ExE_xE67g};ll2H^oEv*MFzC|p9rT6K+YP?k3XDt}2O0$NP-X|>xtM;>m{JxJ~ zAW@ZO2`SzyigRNNt$Hrq0~d|1QqNF89V8)^&@9-*+egcdR+xAnlluq>&Wl>)0Vqca z5`9;X=2`Sa5TNlUi|UKH0Cg@)6!QZu2IfF34Tr9Yu=utx{$em7g_Rfkyt!Ai)RKD> zc4!iz9&<%w=ON-Z9>*#!|CVt`?!#TV{Va>3>L0v7STQMksz+(RgL6y6SFItExoDLL z#tKqQ#aFMKlx*EnMW)*R(<9ujOJraW<Z*{@xNqdriw!j``Inmd>a4lnQUzws+mY3meISBKyj0 z$jM-dp#6SpG8G~A9a91Ra&)(&TRVEgd~~SGW=KQmaK6aT7VxWJFj{3}@G zVYcFGPtSS?2H7~vFUojuSR23~Jv8@8zPGQ6xYzt{tvdPW@Je(&w^t?vJTEiT!L%d@ znX~<7txlBiP+-Q}(i<9@#YHX`^`|hCw`{d^dW(-bAeihJj+7VDfAOvV(0w8S zkB9IwJVAo49FQUS%{vF~30`9VLLULa*6k|9=V#a&XOY)N1Hs%M*9SLSVYD^vCpmvh zJb29d3h8`6e3;92L1JCU#LE=*R!q0NOxR5;^5^U@2(p-0B8ahA@a!M3NDXa`I*8e# zBpq&EDKvf>OmNK@s1T_@rqX+i@_LAr55%?8sHZ9J9|3C+O^hW>tNhDATC-h9RMyA4 ze%mGMpJMRq8YLu^q>)kcwAbgIVDQ64X~}(qF>$-eGB7q!uXi;5XeANzy7dO{|7O06lfAGa zTOn}Zo%_(cZ@!Rs|`aMVlq!vc%f{-^x+FIig@&?-GRu`HImtAst& z+S$BchQo+uZ8y;9mA6^5K#oJto9fV`>-2F3scj*q8HZT4s52?M$;m8Rha8ua^wmfD zD<{+x*RQ=sD{tt})-%;@J>5+If-82oiR9%(4lb?MyM-3rmlF}fr-#Va{!PS(tGu@G z?zfm2@~4iP51TIse&l<$iPaH}XNm^;Xk=4DKU47+D48-7&);ZL=0p`Or1Rui26>HA z5#Lz$T_j})<|AVgS*Hg3QKQ~VhHl5YgTltYb;KEb^r zGH$$}@x|!IWMz6K8TomwO}K_soOtj056Jb<*)(!7iP4VhgGB;Xf`wt<_T-4+i(gTo z4Vp;MHri$>Ze#PMSky$AbuUuUX=xe9j}X;y&8yzz>oh*i{!+dM#XB=<=>H(yy|Yr2)Bi#3 z*j9sb-ZT*t=N;eYZNpQ7zfBn2Tu5f;J4?B(_vHuRMnZ~iSYXTzxMHCb;GF37su|Vg z);b^*Oxxs&z}^@oKapQ}LG&CbsdigX#n?`$>7xIwc_dnGjH(c)bqM0je(;gWXkQ3D zWe6Fyu4zJ%Q_WO`+{~uGT=KOQi#VIbuvluCSlD8x?s0m8SelruD>uh6etQdOuIkeK zcT<4y@sWMaD&o{UhWJagWz@N9A8Y$?#h5CvG;VF5HL*=K#p&|qx5Tz0tmbje+xkDd zSfYaU$wGHE_)+r%-mG^Yhq3)1UpScWhu~p&l)1a@Tfm3uk3NmU>l;tSvP8boj&UyN zI`C7*8Ud1ulf{Ozlp=U$MeLe-!1lR3{tCXlcv%YBVjwyt^_s;#+b`E9D z(@jQ3E=+{fsE+RpHouf~Zp`rHi37K*hxB@FXrLL@V4TwxG|Pif~I@12w*iwf0f`}(%-iOZ z0mocPnizyYayAD0)RR>om1L3DNr^@MwouxtnkC@MU((OqxMzXe;rBcw-!PyOdj@t5I{ka_8quPI29atUGpmUk)JBWG+(i@m4CfD?lO$y?~eS-TE^TFj=G8tYP2 zvA$+SNoYzFZ^fCi7vNKb&vBhvZ+_d&#{j`R#mTN7>dfuSbZ&NCo9FkB`csCn9w@Yp zOszLiJ1p=;ya+>YVainMnPvE;Bv4`DQkADI$1p(t5B`z{moX7T1JZ+{%6k)|dWp_F;yUGNr`j4(%2M}ULs%LLGg$k^wkPB&>$411LF&5_O z92nILG5PX}+k2SnkId~pf?K>xy*rj~Iv28&eBE*EKZ3MhxK)SKTpxdf%oa!6g8+(E ze)bd>MRU=as@QI3*=x}sU#vB~(H=`ox&;<1&EHvk5c-P(l%z3yOlfRf#KJZzoHUcP zC}o=NII}u@KF}zfn`^%2MpT*^_RhNB(Nq^dENa@~&_Pm79#}OZlx3LfyEOgLR3`GW zIyp(@jH##b*UzK1e<>yIt?kg-SWt?CEoN~|RL>;}KZ{2CasnKmOI^^mAM$`4ROE8! zMtiTuEk-Oo#T@6gD3~r?g=$I2iot7T%HndMJRnWz5n)}=olTqTpG4e>P`%!94E+bEp7}zr@M{jBxAmP?LHwzuhy<|LizA~#J z*XLN8UTmp)LB|vYoo8&kevje^UJu>OGy1j-S7QGsDymRg=C3ZODOpQ1&N5UO^Y7Ep z{k#RSoG&?-A5LSksZyDrL|#<(Vs(vWVq-GyCQX$~!hMj4@GBb*`RNO3EwYr5Skth# z<{pF4tol4kGsqu?U_ku~qObOQV%kR$jrG637Q9R^~{L9Tr@r`&|cXog6e>>|n zMTKU%eI$1&Dmbm>EBMKPZ%4{WY+usZLPDH7{iVd0w_{(Cf4x#4_AuUK?CjkXWGR(r zvoX>|REF<-kPqq+{whQsb%0JbrP{2MZBVo+m^!!}p+)xDnc=;u??yt!XOybOVZoV@ zC7T&nePL7VY>^-}Xz4hk3TRb=b;@Kr&v5u@bwq;M*pgGfoG0sNUuee~^zYMb5{Q#e zz*XZ8=no;W+Uw^2A9~uj;D71q96xtLAHp$E8LF}}P4b)?3%me=P%RPxf-L?393F>9 zr)g?L_okN{BD#_GphY7h+hhG2k+|-p`-YhH&6zuX||)X}w@$^fHPk z>c6o!4$f1J;Ngq*QK8zVieJ+xY#W3Xnilo)i5*JTIq~|51n7Rwm@wcjkROvD zZ5ip^oeQv5Uo-_y@jSQ;B^Y~o_bV*_`!eG8sr=k-+BY@Go}bJ&&b{*=!|y3B9MGybTtD#sa^Fsf)Wq`UdMi-o*BNM846va2Ir zKNU`;+sXxi8D&_O-7aZ}+A$XScpasL^<-5JOSUE;m)am%(*+4rzGachqysAxq??X7+{M5p4f?+a>BDQ2z3?u~bL8Bn`})H= zHJlbqFBwetACi|_lCc6)w#6`e1hj?pzGN3^o-@N=NltV;Go+{Fw+inQANRrG^|x+}jr=aN8E; zN5fyFL2PIsjWA@Il3t#uUV?Ex7)^cn%`=r^5Z<_F5zdhrWmIoMNH!|y{2LgfIhZQi zohv{S+qNjEEbWQv{b!Hg5wYhiHzSN|ubGC6e9v>O5E#gnq&4CAj$vfrWI5g(xU+RE zrgi-?;D^))_bj(7?m=x{&d;MT;Em_gg`oRE9i3;pSkv!Fyk&>P^C80Qoz{@`;3Li1 z6I?knPjA>M)&t}^xa&=37ZqNb^qE#d^QqT-`j&^PBK2vnk0rqEDn9jz7W{!sb~fsr z8vWrZ>J=jU{{9Pw8sj5|o2@fI@o6?-cSV#mTRu#bFnjn9V7-TH(qO{r*8$tOF!8Ov ze4j_Mo5X#$Vgkf{R|(M){*5&IoPNZg2@b$;O%UF2ctc}|y2Y@|gec57Ax4R8Ch4vl zo`>>Y!1au>n}iaIa?Kwu{R98$v}u4E_3dV$286p65{PiHFuqyQ@?Q?UeXM%zp4_g` zkOgl%hspSuCo3P z#pJmQ%fV4+UveuMdG}$vjt`T@dR`0&O%X@@^LKy~{%V@x+>>~u5Uc4p`A+k6>J|Aw za*QPPsjwgIwUO}F;zIy;cu&^Q8n@a)kyp4l&Y!!9fQrsGF4QB8FZD=vq5+TqK@Qfh}ARYXsc{0=h>I4${! zbsQqVSZMDQ20(eX4+j+XJOIM~%PBo~7mT-$LngPgEr#RbK#To=!Pf@)cj01ao;HlL z5+<|+Kt1cnd;mqfQp>z2rPfZ3X~PIAVXRBA503Q&?=XsI?l2hs^TQmhfo64e4(3)2 z1EoH3xG;c?Ukf2gkQ>y>e)KaK+5_M#c0T~X1cp43-1Y&47Yon(`)>bPB+IhGir@j5 z-uufP`Q$~+do7=O7St#_3Z@VDgVh!tqM`kaSw71+Pmsvke;m_ZQ7d>q6W7F2qnJ1; zR?;g^%ki|O&sP5hCw%wl?AIzgi-tgSix~6DYb}gTnp)oKSN!U4x6J^@FD=zVnk)`$ zJYszf!Q$;WTcBUd0oFp~dTxMheFLl{faR4lz<|SWHFLgOgj&3p3Nzl|r)mF}8?F^l zPyAa#9PFmE@quvdF>K9?iy?^1@2Rty{&-0GKc@+UU65+Hkt=v#FhtQ*euta)3{yp8 zbto8*H9@D%5Nq=Iy2RvKfWlU1^K-T3abY`WX1Z2-cK{iQLZ){J{svQ#NBpO+^Jz~N5q1eQ7&M90h%53jt#+x(mf~y`NhtM-s&IARWRT2|?uRKhN7}xS9zL%6}Y` zhry@b91>dcOBPUD>OH^5SiYJLcT*wgG>-5^qq*b>yO?F%SEB|Hw4#TMOMFwTc(}-I zEF{kbFwWL?)E{TQ6V*84k7m8A(+{`g7zhz;wUY&`+8s#dp@Y|^ui_T6@`~Mb7MVR_ z(672i?D4v(HInaS(&#<#NS?@kPoE5AUXlfo5>;-?DTZhFv42hBvEDoq51pxOr4@RV zaP6L(Aed(LNDzy{8jc#OVH!-(o!{42G4rDLr6i)J{d9@(qDfcu;|@CZ5-jlZiT^D? zO8RH8gp;I4ArNRF1@J5cYB3ZA*$Wf}5v+Kr-8GCTNcGd+1w`Oeuim|15Kml0q}O`} z3$zp+Kfr0SH$*#u3qTF!@!eAx0F}2*?~jpjGM;|F;^ivTSZFX`vB61CsIP>A5kEhq zyHonm{bq}C^Eq^d!}3MHQXn2NLucO@uj1GK`cbk_zAB5H1;rcd`>-FT&>h9va(P0< z51RK^TL!JuhtH}HB@dsmDJUy|;s5-TMF=bUq72CP#Tk|13!5u`6bO@ zP2?b6%#p_eJ%Sq?Um0hsfX{3SSpU>-tVJt38b?C$+H1us;b*QUAb(BsTrC?oH2wPI zU=*c?|Ha_2)9c5DQ(m-Z@CQ-JjU>{Yy;yEB+HJSP3wo3ju}V{1Bvh{yc;m* zh!Q1A6!bJ4X8caV8Tm^hs5vAQb+&>k7SQmRQtt^oE(FFiQ88sv(#5|1+h9(dtDe%f zu}Vl1@GMNo*?w>)5Tkaq@t8?hfZr2|NR|KY?iib7A@iL>uW$AHZ1PXJGA_fJ`Yq0+ zalFJnPSt!2!93GHRPtQUzu8h>B#jc2`8k5J^h9n{4d%mpA~}%|BPKP*la(zXk@6LE zD^B~njOho#1XH=OZa>5x7Slrg5?aIqU9$*X*Ga`_Ui?sem0$R7*Cq*lB}yhz{wRDS zUw8#HyD<+|fDO^+-!b0P(z#WFgWr#}q~GrD_Wgheuu{KiTOJA$d}h)n+ly|&PfxXo z$}UC(4LQ?+0z1E(v9Ep$;z#9nz?nix zL-RGV{eQ`yhfd~5p4d9@x{2{S4oaedh8SH)11g059>3jL_wakB~sga}`0WWD^W+)dL z0~->)oU_VuTsr~cTu$rzB;dp66 z;qb}XeWfDCosWf(jUnRV#^ym1eVm>O#;c|E? z7dL}i7$mBQ-BaA#!<_dfs_n5|j*u*;G=Xd!!M!ubtM0NXSi$k>vD_P9;dN?t0^+8m zV%km)w@o0VoSw3JRX2n96>TCk=afJri&x1RYhz!RQuks0iDYcPs1$|(x!CGykM5)V z+icC;mI%lAPEPok4MPfs65+n)|wYwOCvjN zON06&@5%Ho_^};aWEk{rS$mfmkQy81XZdNgKji6jssm!_MsbkugM75O77!x8!M7vj z>|-Go>>*y;qnkd~3oeorJe;W<1h$Sp1%D|_Fz;O*=uPp^6z+$A&y+))91Up$Py5 ziUd*|myF#ejjh?v{;38kEd?>2Nx`;y2)L*I;I#NQct{>x~& zI;M@iXqu`KEmfVNJYV)x`gv6qg5HAYq(+cCLTxqOvPz`4orE#fRn?zQQ+xU+#+hp@ zMykA6{`V4y%f0*aWTaT+>RR@=_`~Tefg#du`6q{;xT(3X0CQ8!ieQtBY1w;O%P$h6 zR8$|&P={kvw6-2ZF$xHCKtb4JV65JUCeBC@d>x_?Dg*W(a&4h6jxuv$S@4vI#3%=t zA{{Hmhynf;gTUS}PxwWI@5ntECxkuS;m1OYyNd+nw9)C_G^BFSzqg*93 zOV?rYq9l!=8v4`TtF}K+Ug>`A2k&1y7{DYG5QX0r_>yfTSHk}Xe6j~!7kNm>7ON=L zl^dt9X*{T7jAcPCq$q~Pzd-}ol|f9lYReqsC1dxq>%(C@%w?=K3#$7104 zjNBkA2ZuY-69QVdmU%z065x-~<+}JtkWviWx*&PS91*Ga#wnw#|9Uxh_t7qc3K%IND{p&*gr9$y^SM*U zu1!nWOVz<)>`sHVVB?q85{CUTl@9B+A0_o&rVpcz`%mDslQ@5@%I1U5@CoBRX5()-Rc009YLRc1i#W zARN7V)X7#VjtIoLLkUEwGd&AexqK8P(O6o_&*PfV29{G@%dBlDF5q^$o?1I z7jUC}XH%|XiAh>WBQQDpB>73XOfz33HXWCsqD+}xVSn2=Xyakp&Q2&65uZZj`z~63 zU<85tDLk!fB>*0`8dsQ0x!1#XwA%?h>v|n{S<3mfG~;+C?}-;Y)AM8}QSY#kwl@_e zwXXO{>k$~!K+}f~*g1%ariK+=Nvl;zG6kY|&wk39WfsqLH6vdve6(V9!{Yk^=ejR6 zXtn;A9Wr3o+&@d}k_5(ulxtm0O!*uh;vf8s9zA^f`pw)L{SFv;r1iqX^d{j>K~7d| zH~c3g^*KS|Il)1&W>!-d`YjSzsmS3}c@FE+>TY;Q4l+n#|JNyJMch5}vD9=0OC}|K zHaHZMHk1JU?Y|J#0=1j)am}8}$zA20)BS0~^y9M0-|&<8B5XzJ$~W5iq947|FXvYU z{os%%JA+s1(6^WWwl3`QY&ca~{S~JIG9}Lad@bqmCzDnI5>^sozTz^4w!~{i zL8czxZfj#q$DQ#JZqkgvYWga(JUur&1wX233 z(`9>9Po`woZPX!QwVPf2>2cmAE&oa&TK`eT>GCW*>C+ZQ`7 zt7Nrs7|!Gy7))klBRmDKwB@qjKdcj9BF=qvLLxZJ!J(PnJZR=qY1U}9i?tRq&l}@C zC%s{mVg0UGUqklyLObim#YhRs4UwRe!$>PC)wFDREig*@7p*WD#qoDcYc&rup&lKU z06l}ra-HbT^KWxz!W%^%S);Kug2k=~<62fGtcJrbYlNNkYIdWeVm_n~%gI0eozk+Y zK8q-^XlzhyZnK5O*E{MvL?9vhXP<3mFie}4PR6#lX1ENjHZcmI^JJiW zamO5{917>uh;rW^)Bc9*%mwe<7oom$;z@w&jc8?5rf7|xXCDG+F#vv{7BLe_;kTnn!YxsZUsY&4y`0=Us5e#&J*XSa@}qkW-7!mOTy>l( zLZT#ewwHD!jA) zTOjX>N$|mYpUp~P>3o>^Tk!KQV@OaR51=g5wdja0*ekd2%b0+-LeUk_4B#6)8GT3F z{p}+-osziueFy$mM-Ji#poMVIiJxrKYE*j>?v9`sneS?8acB;@^q_f7Y$M(hio@(` zbsy1FuJ_puIp*oo-@YfOiE|}+uV?cz(ik? z^)~3dN2)>Lo!yE~NLk8Pr%!|=@!S}6iqb1Ag#l(5dtttOsfkscwTZZ#`ij$OyfdNs zY8Lzw&hhars)1deu^V<;Ltn(5qnG9cNQyWQ+}M{|b+ zJyvk|kP=7p{46NcUtzS`Y~?l{z(q%-^qIVXe|y}y7p?(Ngm}BGfmu|}(O0!}rM3u# zHLo_UNntqmEx@3^KtsY1Mvi7_Tb?2cMf-)zRYRgaeAn;8Z(9meOp&867KKIVWA+uO zuo?^iI*`b&EXMx;M{$MsB0p~R`(T-`K%PqDox{@ha1V8X_uJh@#Psor)hf}y=k136 zwL*f;Cl$|OaNlRwKI;y-d5HNn;P?&1PHA-8fA8m(TjpCrQ*9xDaT&ZH+sC z9d}_*{}a&o?>3PQO2X&G9V5}Yik9X&4k$cHyP@3Mm-J*t%~q!Q$92=jfjpMp?%RD_ z2M7l=C$%>Yd=_r4|0H_JG-H>0KkO}bSHQ&?{v)hP;=}ji`qBE25XUVXJ1x;RHAjk4 zw|9y%U*SxN%$el!yIe23e-~sFE>CEApYLDWZQpgRd)vFshLG@*Cy3~cXg=;mNek@| zL{wbbsmr4$)GuuL2S9sm1yT{W%SUNwq^po0#g*||N)T$_4|($UiwAldBRuAg+fw`7+di%Gm_bwE*p zilVgXLZJ|LLe~_3CO0X1Y}RO+@k>m-zQ;Pkujjz$D_wY+&0pzFDIBcAb`rU3Dkhq3 zk)#ia?GUz353NS{L4wuy!)0@6s%tXawid#ltH}5WjdN}Mok#Kv9=p>)cGs;TDk+}z zu{ubIbDoP*5^w8YsBi73j>+mi)v&2#Q2?kmeW(=fk5T{6l#RDt4+ID` z%cZ-C&Tyo^$6?0c78}$kmdT-ABIi1E>l?CF%5l2$e!gLtO=wG`TrZTy-OHTny`aBF zlbGDO5WhxSOS9R#iBw@K@Rj|jrW3p+TBJ2A3Jtyxa?j&q5c@U!3pb{#9Gft0EBGXZl0ZA2kH&*5M;o*~j*1}m`9!;)@G2UmK2@HE=Ub=w zL0~$XVpGuMH*Zx4LyI49*8P%VD_5vK6y_67>GXqAHI(biIKg{=?cdpo{R;+9Wptu+ znKFPyF|7Vq!$FKJb-?###3VixeK%(yY#U0~^YlT2u}FIe88HS;N&5pC4VC&$DBA#J zWI*@U+ah!oi&lPzpE{Nwsj27%+#|FJdiB=_6ih9@#kV5uqA0rH%h8ScMX0$BEMW+IquHLVD-9JcdD)TUHg8B^~#*i=Nh4_v{Z``v=sHPvr6kR?7 zSFRnK?M;{WJt-A1Tj-Y;-*fH9O#hpQltQrv3(5F?nTHTo{tO;=5)Y{u=_5`1=E-7>)tPYTU{E3 ztbsD)&Ac_6aeFs?;Ux$BpBNOxr7#f2izVJf%m%)Rf$pvo|5KCJm^@V-OT}N67YssJZO;`AzKOGr35VcP?v_kWSd~jS1nm^@DEpe5l@$#j)3Lzv|JTz2)*#AYW$f z&+$H!tNIGx+?%xqEx;!C*fBXuUurnVSv2jX=gjOT0tIkD=k`M48-}V!Ja(=}u8;$R zHj8cY6H~tGDgCDMVOaP{avQStR0YCL)c5M>HYCiu+A6>}uCxoQ!a4Lde>P2~WnU zD`Xf)$imj{w`h1`OZ|&`*>BtyEJURi$70fCGe*g$j)Zoa79tfYaUd$OAS8F9{iLxi zz54Ey-ujbp_|9NMC(bWz6UXIT_>b#3G;MIT{n;dQ2E~N?OC#)0=4J;+P>}jFEJF14 z@nm2a=Ly_9DSF*) z?ho7NjQaq$g#NTWX6bJ3Qc`6K5!CdQ@sJfssWT~GOR3=NYaO>0YTKSV1UJl1#?V^p zRh3KZ&G?s_z&J~?(22LmB?g9Z=e|O_e}ggAw1>>sZww=jF^Y11iEcyN=Q8OTPp`K1V{nj(EW? z+qq`_!Zt^}#QQT(*BZUyLaUW=%O1h=j$@GNk2sCo2WV5!g~!6#BK#Iu=}vXX(@$HR zXPTLaMEnHh=@uK5;C{pF_b)f_h1-4()3A+-voQP>;LFUL`H|&aK*7tljDlnsPE;wt zfic^MjPhEh`#itlY|EJYx{h8kSl_-tNJj^Cm;R$R(acfK41SQ8rOPjgeK<4t&lPv^_4c3F0M0e znaJn%(Ip=B+WCzT5!D}D9KX-xM6z5JpWiUGAsDb8jis z4um@cI%WbjKaicjMAS;1>#a3ZLwg-=;AU@`vE^Au^(rC`4li_9`T=iK4`8xf>787` zo!Vlcz%M{Hyl8WHz#NEp30W55xXU%wppEOIaM^vQlMI`a=`d%n)1p`hdlKmT~ z<2`1bLW`=>qKSVdS@RiWRUL~F?VGn;!1X6Qurp%C45uR4t^0)j7&|syrLD*&JKtK$ zF|3=NHqo`OZ=dCOT|VekmoT_-HkAmYrFsZwt#~kA8nGgXZVA?)V0yGPx`PkS53v)R zZDK2I_7B~Gr1@(zF~M(-(00Xn_&@puy6nx(!CzAUA8s)M{E4CS&HU!nWez9~} z5&R%l))_fzri`;ft(b@-9MAls7LKrtJI80;Ql=bUN>Pzz9(2)^G^eyie}U(FDt_^2 zQ&IJ|LQ6FxyK6hV-L7&`9e6AWR7CyafDGrZ6_UAh{QH$7%$vi`lO9r+64IYLK^KPP z31_ervbpdd`|M`&Iz^@^27MFnhE{uAnTSlyOo(Va{O3JixDNu4{7US-r=PAQ3^6X+ ziY!$nZxzqq=cgZX83W^0-2~Ix0CFto7w)4ruiY|u2iknt3F?gHF{D6>F@fal`4Xv8 z^Y8fGI0FYFA=sn)rH7Yp?})R36hC$l)swFQYhqiQU0_&ifZtu->?V|D$R**QP?+WJ z7+c__I@s1)Oq$F7R%41=rcjaPA>G8llK__`^1qKd6&wwh!NxN-91GLFcU{V`<`Td< zDXlxHt)fHzHh%s&c4FotPe1`FL1%cC{ffCTjuC^$+5(J>s18?U?UffBZ*0(NPx&W= zJi9*e!l%=x6=_RMb+v4ioMdXLiL!w$;NQmGs_4zY6s8wdHZsnI=0t^4&fEBH{EhA` zDm{?Qf@dFTN~&Dx6;gsWDJ5d{mJ{>ki?l)6m9+O;jjc!UdClYNb^8HtbzIBE?l-c} zidyo-&f3Ks@NaHN6-kB4)v{|y4tai(Uu zsl}no&3nTQg4EdkYWzVVcaLZd=HG>n|F+yMkkA~LH9v>!t^GO->HUwAmUv*GkCFeF z@YpuS=x-_JZ=y-L5$D1FMbA@l`sNP8m5IYcXYTYq<9C-CG2-L#YUSbXt~jMIENHmD`ii8+{ocoWK1KP#7g{bf`j>EB;d+sJ`fCX#UUn z?zWHh4|Cx~DS$<2&))90moT2G_~KM*HxUtGjQ2mo#;wDe-}+{Q2ws&tuxpmye_Kaq zQmYcisl%S|`&yoc+1_k6JE}{W`D9M%SxT%H~_Bw@$|MXjHPTqlN%xw-~WZ_5eT4X!95gm5>=&^L+MS1)d zL_JQ}J8exqU%8e%dgJxTCNAE0(jk61MaKc6z$xPc+wD7l^WLX6X>+%HF!cVTy0B%p zO&^iH6lcrqBG&S}Tee<<7q%fM-K+G5czh_>?uTVof4j1l&!=YUKm?Uo2dx8WRm77Q z9QrNYtQb<11&M0*{!BSnJA}pGx5&81r5~pf|H)zBC+5d3NAMh1PQ&$EZQw!p*ERS_ zAkY>Hnf`BCeN!uNbx%DQtTm%n_Z#E&LG0Cgv-_Uye+VCZAO#gHb3A{o0>Bfl-DLw6EwzECj%J-q|@=&L~Q9$35IP1II}E!M24~QA9)*hdAD0> z_U!K=CA;rfm+$SL#=dbmd#tC79fHn{`}`JTbe~gXWR-Zn%PC9#KLEr)JHM1Xdu-wP z$ly`fhl0SN6Jf_=RD_H;KSn+ZvG@H5i$jdaDA#$vne!LrQGXu4Z_)Ffp-18SEW}Tx z5=i<4PpFTmSnyTt7lOudzkF?pYZ*EeKEgg0e7S#G1@U_QY=OLQ^W)|3tLEc~ouM!m z^MHCJ;&_G%^Rd-j=4)ttO?j8q(kePmf?#brisGt_m%7gDI)9VuT-R~K(9tsD6y8p5 zUo^Gfx@nB!`wLuNpXPklv*h81kq3px&=aaep}>rm%;!4>kHTa`Zkt@0E?d36W$-CH zVEiG1q?Dd_jd+FoWFn=Aso&v92uvqD*JI;*-{4dDQ8WxfHYCXJz>GTM8(8>0F!&T+ z_NjxA1qbYm<~sjuRO^3Ro;M903O^9Y=UKevd%7Q$@h@FpTOx1rX4h$vua0ntJW=Ow z9r?4h>un=m;R89h&!mtU;tL(Nc5NFx3Ll>b*n^}Kz!3UKps+K8Btl&AO)Y%;2A{&q z;~P`SN+EH4HbTVtnT1by06nxk?%S8tkv>-xwRhEd2Y`GJ@=W7v7PME7*_0W{d_`Tw z6!UfJ`Yh#A=k{i`@nx%nTi{~9DSX1w0UE=Ih&~?>**#N6MkxGG*C$2u*C8gdTz-Nf zhH}#3hn`*^8`bJV*KPKLsk@aZd=bw-*Q(V)JH0L2uXWmcoTRAztm zsgYlW`S_EsdOI`Om*E7{t{U!+H$~o)#j{`U{?;w$=UWE9!jLk0?z4z%I-gs3JcCE! z%j>`ujFBOmyGfb4ED+e2sm^b9iRGi!Lc8Ze1E^n`Y`FH&M=bm@@-5zS-V%QgV{w5a8#NSn zvb&)xXbHWr;(&4h)K!(CtXhP6%C^g@NPt#o3misToQY>+)nkvwo@`bK@fG&iBS$_0 zAB9W514nM)m+>TyH_FVU)3ggalI3}h-WQl@P2i#(snq!+l@Gibi3|XD@drZ&@d}^zTMQVgK7SA_)zS&tu|6 z2%cNI-P5h5+YQ||QTA*ZIe!|aZ<`+Uo>+P}9le&($@M_q$zESHt>3z)e;FLB>K!f7 zgZUpgdLU;G_fqNwf~!O@?;sKJfjHwcyE~1U-NpjDO=}$He^G#A%fSKiSBgZ^=>LxD z{ay>re-C8L&hWWh9WN&%l3Y=|b>#V{=G$PeSAgej2M@>xx^72U(GihTzZB)~hmIYP zzZ_wfVnsTdB!USwbSUq{IKhk&R%cy29+KeMBQZu(yw6d!xG$^gh8dgT*hI%C? zylMQ?UNisvhF)!4x!`0~9_Wjd59HOt*(=a5%MV3%-gWGNJgM4_K6eZ#;Ywcf!5Z~m z6(8JKGau9)S9^Y2OM;iv+nCeaKq3sU1im`X8!)zQ@DB^tYuj5j{;VIK=JEfp)J?m& z=6$rFPVIf;b>wAL{)Ln%vk%>J`~q@Fd3Qj=unSw!OPu5Fyez_T)6oYxl_crPG>#c1 z19Tmys}!eo^U!dK9?ai!^gzDMLzF9$aLl|&3<&dn5Xmzc5Br+fAXXvW*C+)ro+By@Z^UabZC_IYO8S_?vd{bTxH%kZRarwL5iFyG%;53l`M zu^z8^Z85K1G^+VAulJ8Ezs&e-%3}e;GB5v9d2Q!Q+sIUAnZ4@0+XRH9QEWh!*~fPr zJ0NFa>hx2+pLZ#rUeB+Z2NPQI3@dp+N}feZ8O}dYwK}T%{AkCkOkTKn{$3LgTwI@T zYT&o`g-?u>U;l9IA^%A8~V1pom5|Lj=JPTVjMb^>fcv~;Up zI902vl|ZNwMW{a*?tVe)*2=# z@jtF^Z>+xcx0V){mODOYjC9zMA3{!G$7d18VK=44V4*k4E{rDrLWnr@Kcyjxaj<3BiIIcpOHrt@PI2YCJwr z@{Yz!&J*BbPXWDk#WXM6IK=z_(_MLgH-h{C9J2UJ62U-!P2y?~n9p5Prm=y(35gTxR+utV3fy< zc#6~adzi0bMD{d(+^gf6W863SEW`8Az$4{#7UORM2_&lo@6%9(pP_hh)V;#qI3TFY z%{X4B*8mrBNO=Q?m?xL_O`}BL)%2&dH7VNf@1ydu!46T}1M`6fBu(&FRLaMcd)c1u zudW)6ieo2=YQs^MUx!_nB!C3Q^{&ex{JI@iN{;&eHRbnT74wqK@8$XZ#Hq$(o)4dB zycBu;Jf8;yCV6@s%CB{QX(|~fnP(4^r>715=^R9Y!-y37a?n1XHS9<^Tc%bg#e_e@ zw3W|$R6ppYZBJ!wPbO_oOWGOENvGOAs{23x2dL&3ca$uzlh5&+WAb*t6${e~(MAK@pd1{lnHjZ2iO5KW{w54BQ+Fv(xtm)VO6vsSddT;AhlZ>wS@yhw4_a&ZKVDQ zO}pX{sd6Ts#Je7QYJ1w`#1#&3=Ez6jg2X4_TkJw&s*i7V3I19L|HL|tw`9f=tQvg@O8go{aZ;}9r>F$0g(^`*LI z4eq@m^ThwU%^MjD;Xnepwl9vbe`wi1jGYkJ^Nmv)XKw_~2NsT&54KMBx3(7=0VZ+< z(}j558m~G6?_%gmS9E9hTFMZrT777hasaqOIgfz-GUa(&#Kg`2nb#a`Fj*7#X# z{H$4*YOidpoWc7cftMe$E;}#o8(IGo>|rS)oMHlJb_h;Bfiq`fly0xT*El-3lf+~7 zig?)m&qh1cfqclJWE{jYm6#$DuPn}^vo@qnm7~+< zQ|YUEm9rLy-a=U&Kv9npwtl?6y8cCDFdoBjb1B>$s1J$bICe#2SItir$9If;nutpr zr+$6uMJ}#0al6E_jp>=zpZQR>!6oA_g%6$NuyM}+yH+64W&G_4=g+KoDoA6a%hnwrX9kFKf2=zAzBRv= zB@cvL;i#p8ss3Do!i7y87v;+eK`rQXZ$2)5VX}Q)n49c;#qoKb*T;zC3#da;Y9r^R z8KsgBwkQ)4JE_du!LEA%J07Y8yU|_W}rrO{bk(xxltv<1ym*s#yha}~k zZqGPuh9@n3XtnyN@xq?+D3E?2%MMMetAuH#eYj2-QM1|@My;F)kfkoMA)~uKb|CrA zQmZmkRm6&rK9$l<1+^jv3y@N)DR(a*N%^Rzv~kVo+PBpK92Mw&Mcr!LX>ZeJhI%JZ zY)|u+XgLZejeW>!lKB<4OrWe#7s1G(Y8wi4M9~S8kkr(AF>Qq%)0}VSy4SKxe!m*V z*OTX94kVvf5l^4qe!TBz$#XkzWEWFN!1R1foO8K|e6civANMUBExU|gLf-sW_U$I@ z?EQ*ca=+sEOlvnye*E;;@4x>2=Wm<;1^ZEa@Ciugg_apbVvz=31MwsGIpi2N6kGpn zEtzl0c+Tao_A77hu6N$L#c_DRd)9iiytcafbYMBx@Fy8xe}q39Annga=+9FRc7{Ya z)>J4u4^&;17>VUrxy=IF4A1;+=X2Cve{&P@y6t+=d22GB^r4Y|p2_4%Ad@PAOtu6v z2@}ZVOdyjsflTHEGRYIjG9HBwD%u{J?;#(FstVv@%q?r6^i9H(*K+DNq3osVF4YCEtQaM3U{&Y32do)&md&>`y+c9BPD`rpMQgj`mxK0q z{PO?LFaH4m0RR8&Si5i3Fc?p-?}dj%g+M}x?XGG?+lc|_(d*-osCuFgy805QHTdk* zcG_M+VqpX^!^Fl0EFBPHLtXd-05Kr`03*eQ49TB@RaQlxzT^7Hqw6!SNLL+c+YBeQaWE_ z!rXVcT0F~5=F4jHDSd3voNc%qF#E)=HgDYk4Uh zJ9yXywxA4c0f8uKbKUNrc{THW>(ThX_&@rrXg*4>P(npekEG{H(tZB9cMq3ol5e-n z=zO4Gl^;(+hSuc*ti!@8wC{yHO(L*DC>O})R#YaD>&}AB!YUvu(6k^DYvCRSRm+rV zL=@~c#Pb4rF_wj@2X%~3mH^fxRx-nYQ=o(kru$Krx$@nZ2^3S?8Mq8p+fxGJ>gffc5ZX1Tj98$o!$L z7W)>eAQ86A%fMiXQF*>pq8RDKRzIln9nZpwuMW~pVrTZ z?cvSyDK74AD|$XC-9-f80H1Gy@7M53uki}>c({LQ7Dul(kJ4SrHUM*uWZez|m$ctF z?7kuGccb~#rJ8T0KN!&RQTph}$e@u<8}YQeJ_pe!CFb|OzvK5tzxA;rhTjcZH`v@D zaf7=J$~KtVAZUY^4LUYh*dSknbL#`rkq>tVqTFjxuEDeh!5X}3&}k8JjsS@c%=%bF z1|t208YlrF9g$rxrNT_ebBRHl5@!Ms=MHkjs&Xs8urx{e*2JfLoAPbS*Z(hHAD4aH zY#&_I>ZWw=0mflAemmq^yEnR|&8zeZ*vyU&xtLOB&U<+*x8J$e?)jYLo-Mt<*pu}B zBE7#z`>C{_I?nx6+7G4o7yIqUxOEGkH<>`ULhDyNnXEt9k%`>E8=%UIlu%ZuRe*@7 z5zYi)3_+%NtFq`hKqVCAiYE<`kn0CU@>@EM1~hC*gaPe$KRC8G^nzv4oDS!p$bgfv(7@sZ z80E7zv~#)sN{nJAC76W?Ba7X6 z;(U^A-e0nrkW|mh4r9Su!ndV`f~oT%u(EI+2suDC#&|AiHo@1Eey>VICexzHaV%NQQI(Rftz^EdYmlj%%7<@_(KasB`R0RR8w z8BK58MAVz4DFw9(A}s~+QF_{hmL^dT6;kQuqxp~$vSiazq?Mvsd%QcXcgC3+C)t1m z2aX^(0;k^K1YCMRh#Tr(0E8;UjSEt5TzRv$ckQv0b-Za>#7Nfq&GY-1_vXEM^LE4- zG?;B0rwqd=!7~icQ}7HK{x}xE1$a&cziNyGFlF)_a$Sd*sODgQ?wdlFPa%cRvBWjYgS%38X%0DFfqp~$+d#CAlNdr%F~W6F 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 Gfjyq@=caj`L9o%FVo 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 literal 0 HcmV?d00001 diff --git a/OptimalControl/drag/main_constraint_drag.m b/OptimalControl/drag/main_constraint_drag.m index 704113b512..5934b6fdf7 100644 --- a/OptimalControl/drag/main_constraint_drag.m +++ b/OptimalControl/drag/main_constraint_drag.m @@ -4,22 +4,22 @@ g = 9.81; % Gravity [m/s^2] rho = 1.225; % Air density [kg/m^3] - Sw = 2; % Wing/Aerodynamic surface [m^2] - Cd0 = 0.01; % Drag coefficient - m = 1; % Object mass [kg] + Sw = 0.6; % Wing/Aerodynamic surface [m^2] + Cd0 = 0.03; % Drag coefficient + m = 5; % Object mass [kg] k = 0.05; - Clalpha = 2*pi; + Clalpha = 5.7296; Cl0 = 0; - N = 100; % Discretization + N = 50; % Discretization x1_0 = 0; x2_0 = 0; v0 = 15; gamma0 = deg2rad(40); - t0 = 0; tf = 10; + t0 = 0; tf = 3; alpha0 = deg2rad(3); u0 = [tf; alpha0]; - lb = [0 0.01]; % Lower bounds for the control - ub = [50 deg2rad(10)]; % Upper bounds for the control + lb = [0 0]; % Lower bounds for the control + ub = [5 deg2rad(10)]; % Upper bounds for the control u0 = [u0(1) ones(1,N)*u0(2)]; lb = [lb(1) ones(1,N)*lb(2)]; @@ -39,19 +39,19 @@ cost = @(u) f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D, dDda, dDdv, N, m); constraint = @(u) groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, dDda, dDdv, N, m); + % + % eps = 1e-6; + % [cost0, grad0] = cost(u0); + % for i=1:N+1 + % uI = u0; + % uI(i) = uI(i) + eps*u0(i); + % costI(i) = cost(uI); + % gradD(i) = (costI(i)-cost0)/(uI(i)-u0(i)); + % end - eps = 1e-6; - [cost0, grad0] = cost(u0); - for i=1:N+1 - uI = u0; - uI(i) = uI(i) + eps*u0(i); - costI(i) = cost(uI); - gradD(i) = (costI(i)-cost0)/(uI(i)-u0(i)); - end - - plot(grad0(2:end)/(tf/N),'-+') - hold on - plot(gradD(2:end),'-+') + % plot(grad0(1:end),'-+') + % hold on + % plot(gradD(1:end),'-+') % Coste centrada @@ -102,43 +102,41 @@ % Centrada - eps = 1e-6; - [constraint0, gradconst0] = constraint(u0); - - gradconstD = zeros(N+1, 1); % inicializar vector de derivadas - - for i = 1:N+1 - u_forward = u0; - u_backward = u0; - - % evitar que eps*u0(i) sea cero si u0(i) lo es - delta = eps * max(1, abs(u0(i))); - - u_forward(i) = u_forward(i) + delta; - u_backward(i) = u_backward(i) - delta; - - constraint_forward = constraint(u_forward); - constraint_backward = constraint(u_backward); - - % derivada centrada - gradconstD(i) = (constraint_forward - constraint_backward) / (2 * delta); - end - - figure - plot(gradconst0(2:end)/(tf/N), '-+') - hold on - plot(gradconstD(2:end), '-+') - legend('Gradiente analítico', 'Gradiente centrado numérico') - xlabel('Índice de variable de control') - ylabel('Derivada') - title('Comparación entre gradiente analítico y numérico centrado') - - - - [valid,err] = checkGradients(cost, u0, 'Tolerance', 1e-3, 'Display', 'on'); - assignin('base', 'err', err); - [valid2,err2] = checkGradients(constraint, u0, 'Tolerance', 1e-3, 'Display', 'on') - assignin('base', 'err2', err2); + % eps = 1e-6; + % [constraint0, gradconst0] = constraint(u0); + % + % gradconstD = zeros(N+1, 1); % inicializar vector de derivadas + % + % for i = 1:N+1 + % u_forward = u0; + % u_backward = u0; + % + % % evitar que eps*u0(i) sea cero si u0(i) lo es + % delta = eps * max(1, abs(u0(i))); + % + % u_forward(i) = u_forward(i) + delta; + % u_backward(i) = u_backward(i) - delta; + % + % constraint_forward = constraint(u_forward); + % constraint_backward = constraint(u_backward); + % + % % derivada centrada + % gradconstD(i) = (constraint_forward - constraint_backward) / (2 * delta); + % end + % + % figure + % plot(gradconst0(2:end)/(tf/N), '-+') + % hold on + % plot(gradconstD(2:end), '-+') + % legend('Gradiente analítico', 'Gradiente centrado numérico') + % xlabel('Índice de variable de control') + % ylabel('Derivada') + % title('Comparación entre gradiente analítico y numérico centrado') + % + % [valid,err] = checkGradients(cost, u0, 'Tolerance', 1e-3, 'Display', 'on'); + % assignin('base', 'err', err); + % [valid2,err2] = checkGradients(constraint, u0, 'Tolerance', 1e-3, 'Display', 'on') + % assignin('base', 'err2', err2); options = optimoptions("fmincon", ... @@ -189,17 +187,17 @@ end end -function [c, ceq, Dc, Dceq] = nonlcon(u,constraint) +function [c, ceq] = nonlcon(u,constraint) c = []; Dc = []; - [ceq, Dceq] = constraint(u); + [ceq] = constraint(u); end -function [J, gradJ] = f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D, dDdv, dDda, N, m) +function [J] = f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D, dDdv, dDda, N, m) y0 = [x1_0 x2_0 v0 gamma0]; tf = u(1); alpha = u(2:N+1); - t_span = linspace(t0, tf, N); + t_span = linspace(t0, tf, N)'; [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, D, N, m), t_span, y0); J = -y(end,1); @@ -208,21 +206,14 @@ pT = [1 0 0 0]; [~, p] = ode45(@(t, p) adjoint(t, p, y, g, t_span, alpha, dDdv, m), flip(t_span), pT); - % ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; - % v = y(ind,3); - %v = interp1(t_span, y(:,3), t); v = y(:,3); DFdu = -dDda(v,alpha')./m; p3 = p((N:-1:1),3); - gradJ = [-dydt_final(1); -DFdu.*p3]; - %gradJ = zeros(N+1,1); - %gradJ(1) = -dydt_final(1); - %for i = 1:N - %gradJ(i+1) = DFdu(i) * p(i,3); - %end + gradJ = [-dydt_final(1); -DFdu.*p3]; + end -function [ceq, Dceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, dDdv, dDda, N, m) +function [ceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, dDdv, dDda, N, m) y0 = [x1_0 x2_0 v0 gamma0]'; tf = u(1); t_span = linspace(t0, tf, N); @@ -234,10 +225,7 @@ pT = [0 -1 0 0]; [~, p] = ode45(@(t, p) adjoint(t, p, y, g, t_span, alpha, dDdv, m), flip(t_span), pT); - - % v = interp1(t_span, y(:,3), t); - % ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; - % v = y(ind,3); + v = y(:,3); DFdu = -dDda(v,alpha'); @@ -249,11 +237,6 @@ gamma = interp1(t_span, y(:,4), t); alpha = interp1(t_span, alpha, t); - % ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; - % v = y(ind,3); - % gamma = y(ind,4); - % alpha = alpha(ind); - J = [0 0 0 0; 0 0 0 0; cos(gamma) sin(gamma) -dDdv(v,alpha)./m (g/v^2)*cos(gamma); @@ -265,10 +248,7 @@ v = y(3); gamma = y(4); - t_span = linspace(0, tf, N); - % ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; - % alpha = alpha(ind); - + t_span = linspace(0, tf, N); alpha = interp1(t_span, alpha, t); dydt = [ diff --git a/OptimalControl/nodrag/main_constraint_nodrag.m b/OptimalControl/nodrag/main_constraint_nodrag.m index 6a803e97ef..f134905faf 100644 --- a/OptimalControl/nodrag/main_constraint_nodrag.m +++ b/OptimalControl/nodrag/main_constraint_nodrag.m @@ -101,7 +101,8 @@ function [J, gradJ] = f_cost(u, g, t0, v0, x1_0, x2_0) y0 = [x1_0 x2_0 v0 u(2)]; - t_span = linspace(t0, u(1), 1000); + tf = u(1); + t_span = linspace(t0, tf, 1000); [~, y] = ode45(@(t, y) dynamics(y, g), t_span, y0); J = -y(end,1); @@ -116,7 +117,8 @@ function [ceq, Dceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0) y0 = [x1_0 x2_0 v0 u(2)]'; - t_span = linspace(t0, u(1), 1000); + tf = u(1); + t_span = linspace(t0, tf, 1000); [~, y] = ode45(@(t, y) dynamics(y, g), t_span, y0); ceq = y(end,2); diff --git a/OptimalControl/nodrag/nodrag_data.mat b/OptimalControl/nodrag/nodrag_data.mat index c817f0d25a51c3a0da67341484855dc26eb6515b..007d5e8b9721e5c98b64d2e25057fffe0ddbdc7d 100644 GIT binary patch delta 26432 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 Date: Wed, 11 Jun 2025 18:09:31 +0200 Subject: [PATCH 12/22] "ch" --- .../drag y lift/main_constraint_draglift.m | 27 +++++++++++++++---- OptimalControl/drag/main_constraint_drag.m | 6 +++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/OptimalControl/drag y lift/main_constraint_draglift.m b/OptimalControl/drag y lift/main_constraint_draglift.m index b725e849db..94f23295aa 100644 --- a/OptimalControl/drag y lift/main_constraint_draglift.m +++ b/OptimalControl/drag y lift/main_constraint_draglift.m @@ -11,15 +11,15 @@ Clalpha = 5.7296; Cl0 = 0; - N = 50; % Discretization + N = 100; % Discretization x1_0 = 0; x2_0 = 0; v0 = 15; gamma0 = deg2rad(40); - t0 = 0; tf = 20; - alpha0 = deg2rad(3); + t0 = 0; tf = 7; + alpha0 = deg2rad(0); u0 = [tf; alpha0]; - lb = [0 deg2rad(-10)]; % Lower bounds for the control - ub = [500 deg2rad(10)]; % Upper bounds for the control + lb = [0.1 deg2rad(-10)]; % Lower bounds for the control + ub = [10 deg2rad(10)]; % Upper bounds for the control u0 = [u0(1) ones(1,N)*u0(2)]; lb = [lb(1) ones(1,N)*lb(2)]; @@ -200,10 +200,27 @@ tf = u(1); alpha = u(2:N+1); t_span = linspace(t0, tf, N)'; + [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, D, N, m, L), t_span, y0); J = -y(end,1); + figure(100); plot(y(:,1), y(:,2), 'b-+', 'LineWidth', 2); + xlabel("Horizontal distance [m]"); ylabel("Vertical distance [m]"); grid on; + xlim([0 200]) + ylim([-50 50]) + + figure(101); plot(t_span, rad2deg(u(2:end)), 'b-+', 'LineWidth', 2); + xlabel("Time [t]"); ylabel("angle of attack [deg]"); grid on; + xlim([0 tf]) + ylim([0 10]) + + figure(102); plot(t_span, (y(:,3)), 'b-+', 'LineWidth', 2); + xlabel("Time [t]"); ylabel("Velocity [m/s]"); grid on; + xlim([0 tf]) + ylim([-50 50]) + + end function [ceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, dDdv, dDda, N, m, L, dLdv) diff --git a/OptimalControl/drag/main_constraint_drag.m b/OptimalControl/drag/main_constraint_drag.m index 5934b6fdf7..89f59b6547 100644 --- a/OptimalControl/drag/main_constraint_drag.m +++ b/OptimalControl/drag/main_constraint_drag.m @@ -211,6 +211,12 @@ p3 = p((N:-1:1),3); gradJ = [-dydt_final(1); -DFdu.*p3]; + + figure(100); plot(y(:,1), y(:,2), 'b-', 'LineWidth', 2); + xlabel("Horizontal distance [m]"); ylabel("Vertical distance [m]"); grid on; + xlim([0 30]) + ylim([-1 5]) + end function [ceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, dDdv, dDda, N, m) From a989933ec6606ed02fea59a6f6b411c208b66d4a Mon Sep 17 00:00:00 2001 From: AlexFerrer <32134913+FerrerFerreAlex@users.noreply.github.com> Date: Wed, 11 Jun 2025 18:12:25 +0200 Subject: [PATCH 13/22] Update main_constraint_draglift.m --- OptimalControl/drag y lift/main_constraint_draglift.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OptimalControl/drag y lift/main_constraint_draglift.m b/OptimalControl/drag y lift/main_constraint_draglift.m index 94f23295aa..615d0046c4 100644 --- a/OptimalControl/drag y lift/main_constraint_draglift.m +++ b/OptimalControl/drag y lift/main_constraint_draglift.m @@ -143,7 +143,7 @@ options = optimoptions("fmincon", ... "OutputFcn", @store_fmincon, ... - "Algorithm", "sqp", ... + "Algorithm", "interior-point", ... "DerivativeCheck", "on","Display","iter"); [u_opt, ~] = fmincon(cost, u0, [], [], [], [], lb, ub, @(u) nonlcon(u,constraint), options); From b66d13a2d7b85646958ddf5338c254f702e63a2d Mon Sep 17 00:00:00 2001 From: XaviPozo <168111392+XaviPozo@users.noreply.github.com> Date: Thu, 12 Jun 2025 00:36:19 +0200 Subject: [PATCH 14/22] draglift con resultado falcon --- OptimalControl/drag y lift/drag_data.mat | Bin 42849 -> 0 bytes .../drag y lift/main_constraint_draglift.m | 185 +++--------------- OptimalControl/drag y lift/nodrag_data.mat | Bin 46208 -> 0 bytes OptimalControl/drag y lift/resultsfalcon.mat | Bin 0 -> 2482 bytes OptimalControl/drag/main_constraint_drag.m | 6 - 5 files changed, 27 insertions(+), 164 deletions(-) delete mode 100644 OptimalControl/drag y lift/drag_data.mat delete mode 100644 OptimalControl/drag y lift/nodrag_data.mat create mode 100644 OptimalControl/drag y lift/resultsfalcon.mat diff --git a/OptimalControl/drag y lift/drag_data.mat b/OptimalControl/drag y lift/drag_data.mat deleted file mode 100644 index cb06a5c2390552258a057bde209f54c2f82b836a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42849 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 DH$6aU diff --git a/OptimalControl/drag y lift/main_constraint_draglift.m b/OptimalControl/drag y lift/main_constraint_draglift.m index 615d0046c4..bc567ad989 100644 --- a/OptimalControl/drag y lift/main_constraint_draglift.m +++ b/OptimalControl/drag y lift/main_constraint_draglift.m @@ -2,149 +2,48 @@ persistent u_history J_history; clc; close all + data = load('resultsfalcon.mat'); + resultsfalcon = data.results; + clear data g = 9.81; % Gravity [m/s^2] rho = 1.225; % Air density [kg/m^3] Sw = 0.6; % Wing/Aerodynamic surface [m^2] Cd0 = 0.03; % Drag coefficient m = 5; % Object mass [kg] k = 0.05; - Clalpha = 5.7296; + %Clalpha = 5.7296; % en radianes + Clalpha = 0.1; % en grados Cl0 = 0; - N = 100; % Discretization + N = 50; % Discretization x1_0 = 0; x2_0 = 0; v0 = 15; - gamma0 = deg2rad(40); - t0 = 0; tf = 7; - alpha0 = deg2rad(0); - u0 = [tf; alpha0]; - lb = [0.1 deg2rad(-10)]; % Lower bounds for the control - ub = [10 deg2rad(10)]; % Upper bounds for the control - - u0 = [u0(1) ones(1,N)*u0(2)]; + gamma0 = deg2rad(30); + t0 = 0; tf = 10; + alpha0 = deg2rad(30); + u0 = [resultsfalcon.tfinal resultsfalcon.u.alpha]; + lb = [0 deg2rad(-10)]; % Lower bounds for the control + ub = [15 deg2rad(11)]; % Upper bounds for the control + + %u0 = [u0(1) ones(1,N)*u0(2)]; lb = [lb(1) ones(1,N)*lb(2)]; ub = [ub(1) ones(1,N)*ub(2)]; % Previous calculations (Derivatives) - Cl = @(alpha) Cl0 + Clalpha*alpha; + Cl = @(alpha) Cl0 + Clalpha*rad2deg(alpha); Cd = @(alpha) Cd0 + k*Cl(alpha).^2; D = @(V,alpha) 0.5*rho*Sw*V.^2.*Cd(alpha); - L = @(V,alpha) 0.5*rho*Sw*V.^2.*Cl(alpha); - - dCl = Clalpha; % Derivative respecto to alpha - dCd = @(alpha) 2*k*Cl(alpha)*dCl; % Derivative respect to alpha - dDda = @(V,alpha) 0.5*rho*Sw*V.^2.*dCd(alpha); % Derivative respect to alpha - - dDdv = @(V,alpha) rho*Sw*V.*Cd(alpha); % Derivative respect to velocity - dLdv = @(alpha) rho*Sw*Cl(alpha)/m; % Derivative respect to velocity - - cost = @(u) f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D, dDda, dDdv, N, m, L, dLdv); - constraint = @(u) groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, dDda, dDdv, N, m, L, dLdv); - % - % eps = 1e-6; - % [cost0, grad0] = cost(u0); - % for i=1:N+1 - % uI = u0; - % uI(i) = uI(i) + eps*u0(i); - % costI(i) = cost(uI); - % gradD(i) = (costI(i)-cost0)/(uI(i)-u0(i)); - % end - - % plot(grad0(1:end),'-+') - % hold on - % plot(gradD(1:end),'-+') - - % Coste centrada - - % eps = 1e-6; - % [cost0, grad0] = cost(u0); - % - % gradD = zeros(N+1, 1); % inicializar vector de derivadas - % - % for i = 1:N+1 - % u_forward = u0; - % u_backward = u0; - % - % % Asegura que el paso no sea nulo si u0(i) es cero - % delta = eps * max(1, abs(u0(i))); - % - % u_forward(i) = u_forward(i) + delta*u0(i); - % u_backward(i) = u_backward(i) - delta*u0(i); - % - % cost_forward = cost(u_forward); - % cost_backward = cost(u_backward); - % - % % Diferencia centrada - % gradD(i) = (cost_forward - cost_backward) / (2 * delta); - % end - % - % plot(grad0(2:end)/(tf/N), '-+') - % hold on - % plot(gradD(2:end), '-+') - % legend('Gradiente analítico', 'Gradiente centrado numérico') - % xlabel('Índice de variable de control') - % ylabel('Derivada') - % title('Comparación entre gradiente del coste analítico y numérico centrado') - - - % eps = 1e-6; - % [constraint0,gradconst0] = constraint(u0); - % for i=1:N+1 - % uI = u0; - % uI(i) = uI(i) + eps*u0(i); - % constraintI(i) = constraint(uI); - % gradconstD(i) = (constraintI(i)-constraint0)/(uI(i)-u0(i)); - % end - % - % figure - % plot(gradconst0/(tf/N),'-+') - % hold on - % plot(gradconstD,'-+') - - % Centrada - - % eps = 1e-6; - % [constraint0, gradconst0] = constraint(u0); - % - % gradconstD = zeros(N+1, 1); % inicializar vector de derivadas - % - % for i = 1:N+1 - % u_forward = u0; - % u_backward = u0; - % - % % evitar que eps*u0(i) sea cero si u0(i) lo es - % delta = eps * max(1, abs(u0(i))); - % - % u_forward(i) = u_forward(i) + delta; - % u_backward(i) = u_backward(i) - delta; - % - % constraint_forward = constraint(u_forward); - % constraint_backward = constraint(u_backward); - % - % % derivada centrada - % gradconstD(i) = (constraint_forward - constraint_backward) / (2 * delta); - % end - % - % figure - % plot(gradconst0(2:end)/(tf/N), '-+') - % hold on - % plot(gradconstD(2:end), '-+') - % legend('Gradiente analítico', 'Gradiente centrado numérico') - % xlabel('Índice de variable de control') - % ylabel('Derivada') - % title('Comparación entre gradiente analítico y numérico centrado') - % - % [valid,err] = checkGradients(cost, u0, 'Tolerance', 1e-3, 'Display', 'on'); - % assignin('base', 'err', err); - % [valid2,err2] = checkGradients(constraint, u0, 'Tolerance', 1e-3, 'Display', 'on') - % assignin('base', 'err2', err2); + L = @(V,alpha) 0.5*rho*Sw*V.^2.*Cl(alpha); + cost = @(u) f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D, N, m, L); + constraint = @(u) groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, N, m, L); options = optimoptions("fmincon", ... "OutputFcn", @store_fmincon, ... - "Algorithm", "interior-point", ... - "DerivativeCheck", "on","Display","iter"); + "Algorithm", "sqp", ... + "DerivativeCheck", "off","Display","iter","FiniteDifferenceType","central", ... + "FiniteDifferenceStepSize", 1e-4); [u_opt, ~] = fmincon(cost, u0, [], [], [], [], lb, ub, @(u) nonlcon(u,constraint), options); @@ -153,27 +52,8 @@ [~, y] = ode45(@(t, y) dynamics(t, y, tf, u_opt(2:N+1), g, D, N, m, L), t_span, y0); disp(["Maximum distance [m] = ", num2str(y(end, 1))]) - disp(["Initial angle [°]: ", num2str(rad2deg(u_opt(2)))]) disp(["Final Time [s]: ", num2str(u_opt(1))]) - figure; plot(y(:,1), y(:,2), 'b-', 'LineWidth', 2); - xlabel("Horizontal distance [m]"); ylabel("Vertical distance [m]"); grid on; - - figure; plot(u_history(:,1), 'b-o', 'LineWidth', 2); - xlabel('Iteration'); ylabel('Final time [s]'); grid on; - - figure; plot(rad2deg(u_history(:,2)), 'r-o', 'LineWidth', 2); - xlabel('Iteration'); ylabel('Initial angle [°]'); grid on; - - figure; plot(J_history, 'o-', 'LineWidth', 2); - xlabel('Iteration'); ylabel('Cost function J'); grid on; - - vars = whos; - nodrag_results = struct(); - for i = 1:length(vars) - nodrag_results.(vars(i).name) = eval(vars(i).name); - end - function stop = store_fmincon(u, optimValues, state) if optimValues.iteration == 0 u_history = []; @@ -187,20 +67,19 @@ end stop = false; end + end function [c, ceq] = nonlcon(u,constraint) c = []; - Dc = []; [ceq] = constraint(u); end -function [J] = f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D, dDdv, dDda, N, m, L, dLdv) +function [J] = f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D, N, m, L) y0 = [x1_0 x2_0 v0 gamma0]; tf = u(1); alpha = u(2:N+1); - t_span = linspace(t0, tf, N)'; - + t_span = linspace(t0, tf, N)'; [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, D, N, m, L), t_span, y0); J = -y(end,1); @@ -220,10 +99,12 @@ xlim([0 tf]) ylim([-50 50]) + figure(103); plot(J); + hold on end -function [ceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, dDdv, dDda, N, m, L, dLdv) +function [ceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, N, m, L) y0 = [x1_0 x2_0 v0 gamma0]'; tf = u(1); t_span = linspace(t0, tf, N); @@ -234,18 +115,6 @@ end -function dpdt = adjoint(t, p, y, g, t_span, alpha, dDdv, m, dLdv) - v = interp1(t_span, y(:,3), t); - gamma = interp1(t_span, y(:,4), t); - alpha = interp1(t_span, alpha, t); - - J = [0 0 0 0; - 0 0 0 0; - cos(gamma) sin(gamma) -dDdv(v,alpha)./m (g/v^2)*cos(gamma)+dLdv(alpha); - -v*sin(gamma) v*cos(gamma) -g*cos(gamma) (g/v)*sin(gamma)]; - dpdt = -J*p; -end - function dydt = dynamics(t, y, tf, alpha, g, D, N, m, L) v = y(3); gamma = y(4); diff --git a/OptimalControl/drag y lift/nodrag_data.mat b/OptimalControl/drag y lift/nodrag_data.mat deleted file mode 100644 index 0bb8bd9ca73b6d5dbedb9cb0ad56950fce42af2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46208 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%0DFfqp~$+d#CAlNdr%F~W6F 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 Gfjyq@=caj`L9o%FVo ze_EYbCy|Mz5}8;nk%{Yfk>z*cwD$V zC8C^?@MwLv-iw3JUTkm31tc0u5H(bEbU;Ia5FMi72LPf#`~W06TI}1svlDZ(a*=Ph8msIc#Jj7YQ8@UasgQvth*XlWT&Z&;dXf!q>j zQVAzPGhbP;r}dZ*lpm<6Dg&A_mGg!)`*n}E_Hqy)m zR6)%wBkB?of?#3%s>d};B9LkU*9d0|$R&Yn`BN5rr8Euv)#r(;imc+xq)uYHE$VP$ zjjB*wk3pQppyG$~i7Oon%OFGKG;O6+($> z%yBnV>ci1S^X3T!$b2jDfQ7#8)z7GY2J|zepT20d{z&f8&z|VhjD1?-o|g%CwgWei zfa~eN4M+3g_r~>xo$TsX4wAL}Q$Hgrq z+&^+|zXNBVS8H^hS1UegacT17!MB%Be!P2e;cvi~oz3HX*oo(bkvYS%z=C=Oi+S%V z62x2v^5j@&zIDcPxOa2AdZTZd-nZhzVkW%*G&TP9n-8D9-1&TdEAQEW6;C5q^bP6C zY{XQ(gnbJlY%pz+wB9- zroXP=ySNkY$B+~E$H;YExv3}~Y44S^dH!+m7p}L9zx~>yBawVg|9AomvWiRzXIJwR z1l1Uqid5|?*8C~ZHDPHPu^NUN!V)#or>Nn;v5WqH{PBMoY3lXOs^z?1&ghMqIVr?0LafSkAW)pYv_bw>e+`zkL0#L&mI0RR8& zn9pw0FdWCzt{YTHz-0%JxEI7>yX}Owwd+=Cqh;*|*IyH-^>FQAJKOpW@D98IT=oWN zZ^M}@_L8WH>#kEbga)=`H9vp*as2zErunUSp7&7AikFP#)GnphrF8viYKNEtQJ;_1 z+*EVr8op}q+7_R%h#W)oL(*JPcp`vn%|q_&#K{%w%6CzUQM}ki}TzzKbxN~&R=|6{c)2zt`z*K zcvL0luIka2xBTx-IkmHetN1^e@Z~xFF01oCPwh+P$QC(+vDjmj@j9bIa==vTM0nf4 zIYzt#97ab`01{d=UoHCfHEPmFTCPt;4nOZ^ZF3z08J~HS``ry z7<K05=hqvg6SYt2-Ae=rdBxe84b392Jdko zhZ9AW(>|uC%l+Xt4f0G;X~g`hO0=SHic}O-p^l38>BjviS>GZ9#<3h`U+6JXXSS54 ziVB@gQJI^;B&8jj6|a=EfGv#5>5ScyoX%FZ`eI7?VB1S6;|Qw&S=1webk!1qh@qI# z%8%PT{~YHy$2rb%j&q#j9QS{7wbF#k^o*+*+@gKD?CtF){lZ5EuWj>vZP9aNZ+DCI zJ@mhO*MD&R2XnaogX=#`6xV;4^}H!L&T)>rcbxZ+pYy)>_b0jE00030|Lj=JZyQAv z-?T{}5~^I0iVuN+n;jaFR6X=k>U=qg)L;{*rPr}{)}D4evz?hu>i z=>Z{bsQ&^W4v0ShsW-07^X}Tav(v<0nDM3X5L<9;f#r@zCDXz}}R_-b|t&{x2uSHEsF-QsVzYL^H15M!ru; z6E!H#;$zb@ozgSyG`yBPN&6R5dM-NL^Cmj}Z%4#^>lnLN47)%tFD)&wpwqyj>fJ?x zfOQ$^yOGd0YtfgSXLC`1ule7U{|kT4y1w>^@yd;_(=CrBU;c7D`El(}Nd6@7{^IW^ zkN)~kbR`cK3;3%<^yNY)(L7c zE){7?C*9VG=jpt()<&#_vmC;#9O+Zkb+WBO7>Mm+T36V&aQ3=BHe~{K7g5t=Xqy7L zYn(|XOgq4-Htt(Is0PXpRHex>oEqiOZvx=-aDLb#4=gsItQ z)Psf}_OH+u7euw=A2d3los8Fg&Pv08G&z<#zKc|Us%|jIK^2T7X%I?OcZa(nQwK*o z&3h3F5PYrifWg=Rw;EFV(?k_8umBKp>L1o@oDXd=y?9=h&vw73zcQVfwBHAMiQD?aGz?>luw0tO35&N<< zf*&s!dVu!0c!Y#|Dsh{HoEfjUCF2$2lUMGv>xyyZYtGR)zviUp1<;&fSgre#E1PfKSta>p8sz1ufxx7oy7V`o<|E2-O&}Vitw1k{p2X~{J8z`EyG`+rH_Qf zMf)~c8g9P6W9S9CgAR(zS3SzP$m)IXS}D2z`p4+MY3K)fd1(PmWOw$sXPe>vs(3f< zT8KG{Wg8{{{`d!Jau(^&oa#Z{;DAlbcN_+IEHH%EHGze?g+i=0?>Wi5Q_369 z=mu)2alLHF16}nM>A<$y)#qv~kPgAnIN9=le0P!7Hk>}2e}h0~{mYZj{{;X5|Nrb* zZBN@U5H8br*&71J5bT%i26E=`)$PDqH*Hl|pL zs`J&4@6LD6IT#epP<)N?GoN%TV*{rS>r#!qg@FrfFe>)l; z%Ac*=> zq-0cL?aZ%zmnhn*jQ38%L-|w?Fs@HYz{U*e=F)Q?yMG>U-rqm>GxJUVZ2D)@Kb!tp zr+@zGeo%%}l^^%E?&rrWzcl>V@Z;a+$9)YC<)rx6(Hg#e%6$9O-wz(^J?NqL`ZBwk zdvntl{>Q%1@c6&U<7GHc_1;{kJ|=S}98VbQpXIFI$gJOl9kMd6|8?@P_3vZ(V$1X= z9YtSwifbuladQ-X-zjG9Vh%38<(Yl8rE82EL2++4zj~&ls9wy9OoyJ!8BGD(nS7j% zgkjC0=Xyp{*oBJvh*`-Qw1T@w%8sUOI`5^U&3}+Z5Jfz-FA89HMxF18L2DuHQORxz z+8g~Rt6^j+yg)HWKRL`NIHT^2h$%HSOyp?bsJ{@d?|}o&TAHhSiW&%~8GC8I9&8}J3^g_9+I>;yp8*F9705o8APH-YkWOcEoJ=TuZ> zA58k3sDYRO|E&C(k$?^b9eIjyEEy)IE427n^?l5e?*chsuz;&DeZXO?m$fxZO-f#? zfv25c!KgtxGBq)~)PR>?BY7g&$x4HjbkYJB;_)b5p)ECKP( zf$`3>4GM1=>|cfNq426o&H(XN!0}!pEFYKoc@*9iifbB$cMa^{b&B^03h#!J5)khu z81EKg>-i30>+debJqCq$4~)0UwkW*&gss0dFx~^g^1Dvhe(;E~P2+4ycdLhpZ{-oFO^)#v445*S9!UsH$CIeOt+v^bgv; zdnjl$w)$Sn`{2ucA%kSD_3@LiL+4O5`)=s;Tt~>!Tx)kX5aHmt$e#@@zLNQSe@wob z$If88nr2s=5Pym1<8i#XnEhh$>g#6lMl{ZwjuY8;XXL%i`nr<36^cDy9uc*>Rxf7% zopa!X1I8Pk?e+u3>|mW&nx9J<>y)*1s;qZ>S4hjVMKJQWHUX!Y!in_2wp>fn2|u!U zGHINrDy7HqmudLYaZF|m!B=%ozHZYbmQL1TR(^H=lH6eOI^8}<=QXkWPP66ZBI|2P z-dk>847=1|)Vspof4yfpUJwp%Ps&d+vhp+U{+>0igzu<7XS4iw`7(^y?%RxURalRH z>%w*4Na@SYQ7@@mJ)UX%%eEghJk`R~YiJnHqWkk-t;5s4^=JClXRFXSbt~C fF4oCtG!uLM|M4_=EwCQ_HtVf+f)kCOj_ikw6YLS< diff --git a/OptimalControl/drag y lift/resultsfalcon.mat b/OptimalControl/drag y lift/resultsfalcon.mat new file mode 100644 index 0000000000000000000000000000000000000000..93b6ca2776ad2eedc69377fc0bb3b3f73a1b82b1 GIT binary patch literal 2482 zcmV;j2~GA*K~zjZLLfCRFd$7qR4ry{Y-KDUP;6mzW^ZzBIv`L(S4mDbG%O%Pa%Ew3 zWn>_4ZaN@TXmub;b#5RrG9WN8Ix{soFf$-BFfuhDARr(hARr(hARr(hARr(hARr(h zARr(hARr(hARr(hARr(hARr(B00000000000ZB~{0000g2><|ioTZitRE&EYz^7%J zsgY2o6&Fo2({|HBL+<}+p_I^6$oHXrq0r_QTF|~IO5{p~HmzFKjkl?3Q&Cr?BvO)8 zgxnVD-s+w6-Fv?Co$q|d_dn-(fA91BpY5FI|1L`j1j0ClKoFWId0zMl_#*OjzP|}+ zUOXH;yP9JE-%?;G7G@l?Lz>sW zG)Opw)sha%z``803IBbLeE&Ab1^eIQPmun%^M>067kw9Wsd>Rqmha;AZd6?!9xEs{YuwP=y8u2V%#(Z0}*z}UFTh3AevBUsJt84Bj*Jq#&*Mo?DWkU zmV01T(EGPZMSDPIuT0$KWoB@)I5)T4)ePd#J`K=rFoVpH;kA0}*&uLOF^=TV29oa8 zSLI!7C}>XkXSjwrFlsBCZeK8m@10{#>*$@++LtN}Utic{mNSL~g~Q|=6uzQ!MYLyr z7x|%YXw*gMoDf7u)hCkzh2fcJocHxK3WSp^EyF3I@TAMLQl?Q9WXQ%c)Cp0@Jk`Fb zJVg}bZY%x3eYFJqr8~O98z`W$H*!kQK?Hs@E+M|JCBx<`bK8EK5&{}pZ>lIlgrdq* z0w;(9u!6B)O!Er?*qiQca;Td{E!=07j|!$y=0vcnZp9bWF{rYA?Wd1OZa8h($(B*% z)4n;e)c6gOTBf|2>(z&B4r-oPtL;R$eOrpd)0&ZBZq$hLzyp+DUh#16qfBH`TU{o6 z=qwU^7u4UsQ3eyIp{BCxIHc@gQqfqFkKE*%3X|+HRBmJ4Zzj=*0=Ru@_ww41A>~p; z>S!mjmDTvrI@*KYaI>XzRQph3QK3it^egnn)ZV2^YXFI}!fS%-1`wtBqW_`z0Yn}X zFx86gNAbb%Fz$9AVYbIIsI6Zx~BC)L}Lq?}Xb{^42_qNlRWP0FC+|9ju7!cd^v zU}LH>y!h;uH*j1D+AeSR*?mM2k{b2Z`eK+6FMe$L?h6L&u*#g(vS5JH{eK)a8KXm; z96Q%Goet9d)UD~K=^&vJZo-6)*p)5AE==%IZg_hvfC;_7Sw^3WWWulAbNpJ-On6U?uuVPB1Qzkltr0gS z%vBpLhxxca2#PsQvP_`dlAK9=$$+QkPMr@D8K5j+LoP63KynV}rTZiu!tGxMFq7%f zzzAlq*hUA#U==@)5d}E%I7#C|yaKF#zM(x)PXPo9UiaOZq`|F`Df!G28WQ{*=@nkEfAq|EfG>uI2qzM|yb8XDZ#X%gGaq(OS1&$%q1!A_CR6GnEl z?|vQ~JXN&WoIX?+Q>SPy(~GE`yR2I?y3qJx-dSyjdS0o>+qxFUPQ_ zcKtee4=~>Z_8OgC984@$mylgnjYTK=TyRXS!8i=@)YZ~lY_M=rut156ePLBZH@&XG z_Lcr($K6$f*}tiOdB&p}EBq)Ebz~n0x{Bc<8F!PO>JrD z+;X30*@_f2lqq4j!XzH$AKK=$PRRqge={iRyd8mMX_pg>4yRzPDpo1?F5JPERqB-Y zdK6-3_`}wkhL>SUF>K5Gc9mHA;Jtzq$E&b~IggT-9}|D+7~q{zGM##QO0Sg%4bmv$|%d z#MWBW@ph%m@U>dhZbP|vQKSwXpI})_?W;q@s}3zPpJ=^Eq9aanC{EfHoREUEG!5sc wOq@6G;9QxF(~+n9@%F`d{+`J=w3;YEIpJ-Em}0U8leE~wwbivR!s literal 0 HcmV?d00001 diff --git a/OptimalControl/drag/main_constraint_drag.m b/OptimalControl/drag/main_constraint_drag.m index 89f59b6547..5934b6fdf7 100644 --- a/OptimalControl/drag/main_constraint_drag.m +++ b/OptimalControl/drag/main_constraint_drag.m @@ -211,12 +211,6 @@ p3 = p((N:-1:1),3); gradJ = [-dydt_final(1); -DFdu.*p3]; - - figure(100); plot(y(:,1), y(:,2), 'b-', 'LineWidth', 2); - xlabel("Horizontal distance [m]"); ylabel("Vertical distance [m]"); grid on; - xlim([0 30]) - ylim([-1 5]) - end function [ceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, dDdv, dDda, N, m) From fefbf7730b70d5e3b27816701b39ad7b87eaae9b Mon Sep 17 00:00:00 2001 From: XaviPozo <168111392+XaviPozo@users.noreply.github.com> Date: Fri, 13 Jun 2025 01:00:39 +0200 Subject: [PATCH 15/22] buena pinta --- .../drag y lift/main_constraint_draglift.m | 76 +++++++++--------- OptimalControl/drag y lift/resultsfalcon.mat | Bin 2482 -> 4601 bytes 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/OptimalControl/drag y lift/main_constraint_draglift.m b/OptimalControl/drag y lift/main_constraint_draglift.m index bc567ad989..6cd6919e12 100644 --- a/OptimalControl/drag y lift/main_constraint_draglift.m +++ b/OptimalControl/drag y lift/main_constraint_draglift.m @@ -11,19 +11,19 @@ Cd0 = 0.03; % Drag coefficient m = 5; % Object mass [kg] k = 0.05; - %Clalpha = 5.7296; % en radianes - Clalpha = 0.1; % en grados + Clalpha = 0.1*360/(2*pi); % en radianes + %Clalpha = 0.1; % en grados Cl0 = 0; - N = 50; % Discretization + N = 100; % Discretization x1_0 = 0; x2_0 = 0; v0 = 15; gamma0 = deg2rad(30); - t0 = 0; tf = 10; - alpha0 = deg2rad(30); + t0 = 0; tf_guess = 10; + alpha0 = deg2rad(3); u0 = [resultsfalcon.tfinal resultsfalcon.u.alpha]; - lb = [0 deg2rad(-10)]; % Lower bounds for the control - ub = [15 deg2rad(11)]; % Upper bounds for the control + lb = [0.1 deg2rad(-10)]; % Lower bounds for the control + ub = [15 deg2rad(10)]; % Upper bounds for the control %u0 = [u0(1) ones(1,N)*u0(2)]; lb = [lb(1) ones(1,N)*lb(2)]; @@ -31,13 +31,13 @@ % Previous calculations (Derivatives) - Cl = @(alpha) Cl0 + Clalpha*rad2deg(alpha); + Cl = @(alpha) Cl0 + Clalpha*alpha; Cd = @(alpha) Cd0 + k*Cl(alpha).^2; D = @(V,alpha) 0.5*rho*Sw*V.^2.*Cd(alpha); L = @(V,alpha) 0.5*rho*Sw*V.^2.*Cl(alpha); cost = @(u) f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D, N, m, L); - constraint = @(u) groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, N, m, L); + nonlcon_fun = @(u) nonlcon_full(u, g, t0, v0, x1_0, x2_0, gamma0, D, N, m, L); options = optimoptions("fmincon", ... "OutputFcn", @store_fmincon, ... @@ -45,15 +45,19 @@ "DerivativeCheck", "off","Display","iter","FiniteDifferenceType","central", ... "FiniteDifferenceStepSize", 1e-4); - [u_opt, ~] = fmincon(cost, u0, [], [], [], [], lb, ub, @(u) nonlcon(u,constraint), options); + [u_opt, ~] = fmincon(cost, u0, [], [], [], [], lb, ub, nonlcon_fun, options); y0 = [x1_0 x2_0 v0 gamma0]; - t_span = linspace(t0, u_opt(1), N); + tf = u_opt(1); + t_span = linspace(t0, tf, N); [~, y] = ode45(@(t, y) dynamics(t, y, tf, u_opt(2:N+1), g, D, N, m, L), t_span, y0); disp(["Maximum distance [m] = ", num2str(y(end, 1))]) disp(["Final Time [s]: ", num2str(u_opt(1))]) + figure + plot(y(:,1),y(:,2)) + function stop = store_fmincon(u, optimValues, state) if optimValues.iteration == 0 u_history = []; @@ -70,11 +74,6 @@ end -function [c, ceq] = nonlcon(u,constraint) - c = []; - [ceq] = constraint(u); -end - function [J] = f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D, N, m, L) y0 = [x1_0 x2_0 v0 gamma0]; tf = u(1); @@ -84,33 +83,34 @@ J = -y(end,1); - figure(100); plot(y(:,1), y(:,2), 'b-+', 'LineWidth', 2); - xlabel("Horizontal distance [m]"); ylabel("Vertical distance [m]"); grid on; - xlim([0 200]) - ylim([-50 50]) - - figure(101); plot(t_span, rad2deg(u(2:end)), 'b-+', 'LineWidth', 2); - xlabel("Time [t]"); ylabel("angle of attack [deg]"); grid on; - xlim([0 tf]) - ylim([0 10]) - - figure(102); plot(t_span, (y(:,3)), 'b-+', 'LineWidth', 2); - xlabel("Time [t]"); ylabel("Velocity [m/s]"); grid on; - xlim([0 tf]) - ylim([-50 50]) - - figure(103); plot(J); - hold on + % figure(100); plot(y(:,1), y(:,2), 'b-+', 'LineWidth', 2); + % xlabel("Horizontal distance [m]"); ylabel("Vertical distance [m]"); grid on; + % xlim([0 200]) + % ylim([-50 50]) + % + % figure(101); plot(t_span, rad2deg(u(2:end)), 'b-+', 'LineWidth', 2); + % xlabel("Time [t]"); ylabel("angle of attack [deg]"); grid on; + % xlim([0 tf]) + % ylim([0 10]) + % + % figure(102); plot(t_span, (y(:,3)), 'b-+', 'LineWidth', 2); + % xlabel("Time [t]"); ylabel("Velocity [m/s]"); grid on; + % xlim([0 tf]) + % ylim([-50 50]) + % + % figure(103); plot(J); + % hold on end -function [ceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, N, m, L) - y0 = [x1_0 x2_0 v0 gamma0]'; - tf = u(1); +function [c, ceq] = nonlcon_full(u, g, t0, v0, gamma0, x1_0, x2_0, D, N, m, L) + tf = u(1); + alpha = u(2:end); t_span = linspace(t0, tf, N); - alpha = u(2:N+1); - [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, D, N, m, L), t_span, y0); + y0 = [x1_0; x2_0; v0; gamma0]; + [~, y] = ode45(@(t,y)dynamics(t,y,tf,alpha,g,D,N,m,L), t_span, y0); + c = -y(:,2); ceq = y(end,2); end diff --git a/OptimalControl/drag y lift/resultsfalcon.mat b/OptimalControl/drag y lift/resultsfalcon.mat index 93b6ca2776ad2eedc69377fc0bb3b3f73a1b82b1..dbb413e847e74d0ac694f2726d518598349ea96c 100644 GIT binary patch delta 4545 zcmV;y5kBs+6Zs>MG#Ey5X&_2iT&*ydS^E~&t_rB-c&wOUM>FDUp1?cEl*2uOt z80e@MGtH*|kHNY&PP+K|d;0l*uB|iuwg1eEtqnh_o1d$@my;*mDXQg9_g@$HpE!*F zj>Gal#5qFapNoBMY-0Skzh-0HavMuAqOt)wNOmo3i+f75yHUr<2TNfFeYE+PXr|}u z*SBrMwDmC*yZ&}y4sn9EZxRW#)%n}Hzo+e=Mt6h9d~x?a()?zTk{r{2$-0?2n*SGc z*o(hPRp=}2oOzVrBBjEox-?<~}fLiZ5kkopAd-U{99-!9E14=jZ zT8kQaX!Y}g{;VhIy%8@>2VU5(v+bOC4=+s*J~(!3@x7HDA59lN2%USRA2-2A(}y3f z=!WIiALFO##19!M+N|H^`DuFLq4W!jn|uhKrW+ob_1jvUnFMJ13BbUeE7Hjq1!y`7 zz|_1|Y!_aTrl%l(tQZQvW4R+p(^U{S(_icEA_&p+6@m>*={dd+glIYo!8T(T<^m;Q zn%=^olSy_Ntre!}E&|revrU3}A~gL)z}2)w%A`|-_BpJFQ`rGA(KhShPhY9h{qKE6 z|KIxR&-{P-7jgaH`ky+_^mp$cTlmj8e`kaK-UI&L-JFhpA9wo4{my$)Cps>Jb!Vk3 zuM#=&BU)fexmk2(6@>?-wXP&G!K>22mrPDLkV`yzcQX$!fTRyj+yf7tjdEq?bwXe} zWU-@|Qxr1%6J8kZ-2mGz^qPscZ-U}uZ`6i7B!FYxD^EIBDYzQf{;fQn0K3@fBxF^I z;At{!ccX)U1iw8FD9JdKX3P`nG636C0zBQznpcdUrl0>M&{U6=HlENL^UcNI

=`lA;Dz(7bD130Ygf@^z^^oi(ZD6=Ml6r7i8)O9-*an<+ zVDpuK&W;Pub>QPwhB#mK-N4%WcvDR7Zr~B?q?GXMLeqzy#rbeucwYGFqWX+35QGED zLu~b+SuSfKzex`+Bp;D2SI`IPhS*zIZtH`jo#Pmp%>XzG)HwZo4IsP8`D=mB%68H{3o zt2t*5->u>ZCc$iAwcu;I{xad?0%_Sip9B^v>GL0=B;BjJ+ttE43~JQ~aUZe|Hl2j8}ghFC&s%ju(y`IZpB=zc7_-xB8MHAwP{JWoNjcL``?Hb&v~cF=fZdJTCAm{#10ufeTu_>V62X zaDo{b&nO?k2{OUzk6XUrV0dcNz{AnEE7kT%@{x|Fp#5|E`%EJ!p+~y8k zQD%cp?U~PWEm=W2H1!R?D+}0viST|xCz)Zyz&7UmDJIC(I5mwPKGxq1U$;gIA@4k)oG>RZzjNc(lthYJuB73w^tq?X2zp5JfueN2tF7O>f9H&Kj>n zJ_o|Mx4fbtS59n4+m%-2^I0WMDWn4}hkdy4YdhECJ%S!GDUW6rj3V+XYqD5>&={Ixe|2bCY8;V% zb|oYgjH3z70P;PS33O32KS@q`0$tZT9O|(~sCt#j%shdH1<&Tqr;Q^$5pIf`_4`{@=C|B+PgW+D$J+Xx!>a^&F6myEZA zY;sWM&L=q)APX9;CUebmGGL40-K>3OfFqbK&4XSBbQG`N?Y%{YhUwLMD-AMK?=I_2 zog%@pGj`n0sU$dLi!a^nK!VDvA)=#FBoOwsfBtNN2v3xM?5l3H6T!qj(CO(tBK+2r zQTuX@2LZ;Ao*SqC^7UBKx5u<|OE~(^CH7L4x)S*GZ2vBuEyH0$r@nl%QlLX;)2b*elli)@ik@#^%LltKX>f40@-9q}h6mT|Lh3!G;TJjo zr@pQwJnjzdK|y0i(fZ}hkGTMGg>a}GQyb0++M z z@g!oBS6<21r+SL>eE==2@1xu@y4SAj7^vZZ#exRt_c&EGu=e^MZs!Q84e^2Q80hm z%uB906s*|yU`4$>1v@Ju|D>FOf_?wIyH_iz5gYiuHGI#8MvT)eEG0Xk0aI7=W5oTg z$HMx}6UcV;SfkKl&i1_+)?rS6r`bGIiw!?}P55b4gS8g^9w^FsjQKlQ3a7rS!UDZt zh#kjQV!0gehDznjvA86qi0|7=v3Y~H^pB;Au@lqIZ9Oc7*x^$@j2BY#F~twB^Q-uB zuppT}dT!@*EZoL^*YxI_n6|{X=HqM^Fru=~K0jR_Y{XY5irvl!nR6w7<0HDyAsnvE z>*dRMlz61u`d3;q5~?-~n6phs!Hkn9LK(A=-9w3j!96)hR!O=iZ%ZyxP?3)o%+Etp zhK9PmRrx67Vt+T$z5v~E(>IyFR)A_nhV1J07obJ(dtO(XkGAriDHu)9L)D%a$Q=^7 zX!d7T$Y=E&M8vlCh0bMvqU25!cOR{E)O)6H^QPm;sA{vZX=`3Q>bmB0XE^2@5>^-r zHs0ief(pwj#)nQ|kp_bs9j)Uq`3;eI3=xS~;Dc~?I{tKQ=jc*dEK?4~%QZFhl%oKf z>3t_ZD*6x;-sAH5lVAx}{NS8?P)ZqgeekDSqhKW_R(YU?81o2!E4=0DtT9rJX_2op z^hwrXv%LH2*ogJmpT0_B{Aa)0{?N(u#8D@@fBwJB`i#-vhc8AVBgC_06c>x+4qlJU zHol6IBF?(ir6!>7XOn_|D5apI?XkqtGwFyy$=2BDLKgB%{-`#6_bwvQPm9a-ZdvCGVpay{%Ne%5X#4HRo0;Vlq$%TNmDox_HS=MF+Lsh`ym8<3jcE!h&;QVOW0`^uhV9Rk zXKg~^;`R-HPX(G#KFjq79a2qbRRgb`w4({J>UxMq>oy_Y%f&y(_cbAND~nxho=s@$ z<{v~9)r5A=GkbO=HzD5`^AP%qCbVK3Fo*ALLe-7MFO3$PP)7wxVoanNO+;b6{MyZ^ zSwhZR+^ZSo;WlnoNo_{T%nA!hFV>!m?MJ$Ta4l$md}U#NonZ@FwOZ#Wysrf%=$QSb zR-@ftlCK{8OS2P){<5H($`V$`zicH_$)-i+BMT~}4pMo`jml{+DsTHy$rVIpPzcQq zr*bNSO7SQvYiMkz(Ue9MN##wNpI#`H%BQK+37}HbhsqHTD(enYsbNdyK_e<7RH)1s fqw@V2Jhe`nhg5DSP}v{t@Ru$%R)6^~Yhtpvt8eHW delta 2409 zcmV-v36}QxBeD~aG#FH9bs$Q0ZXhu-ATTgGGc`IeGaxcBGBuG=BavVQk#rD$DhU7p zc$}q{2~>=G8^EV!nyHacrWF@WGt+j{LPPHVX`z(RRLJ+CeWB3i7Fy80C`#l?g*L5P z)s45QX;V>Gr6f|4RD|3X>fY*|^WA&C^PTT}$M-+yd4KQo{GaWd=l?EC2?WA8g+LIR zCwX4@3HT!NbiTg{XyP59SZIxkgx zf7KEC4|UXeTv)>M63h2jeB&8nLFgt9!r6vYw~)h3o^0(h)!0Rmq@1!DITI<-9&tz!^e_b7lJq zUO(bsv_E7(^Q}0qF9}$GSrBq4_p1c2zm?EW3hkzeQF(n*A@6Xg#f^26ynZF&bXn+Q z>P9JE-%?;G7G@l?Lz>sWG)Opw)sha%z``803IBbLeE&Ab1^eIQPmun%^M>067kw9W zsd>Rqmha;AX~ z?5v2Vr7YZS@r~A;{sGP&eI{L?BM*v-Y<=64bYRBw-F%y&2zSpzxBL?o;AbY(iu$R6 zTckkHQ89JMhWZUmnlYOz#nZ73j>s8>w0AklH8EH+^a z5W>3bpKsg>K57Pkf|bvH0{QLgN>p8dFvsAxLGw4ilWezykLkkAZ-OnKYxO`rc&;oo zSs(6u_iXs;YXDXelj2hr+u(kmqmi82cDSWlL7NdVgbYM|C^cvZHzkj?{C?jEvfFzD zB`)uP^^C@Rz9Yua(G_HAuVVt#GZ*ToDLcVJ|1$kb*G}kvagP{c+%yFP5q8L3=UreR znoww{yc^gf=LICjcEg73^vxNTdtg=2`?pC&dq8HdOx)#VW^l4NH@Do?4C2o|4bW~d zgUpcOwR-E>AaGbQj^xhlIlgrdq*0w;(9u!6B)O!EtW0oa@FZE~oaMJ?QCm5&OhQRYOj zs&2&>)G?^CeeI`@NNzZ7*~yks7Q;zflGgr=g~@>NuqAU{cXol8@ZvnhKNb zF;s4UW8H5i(TD=LeQNje+K?gTQbg)#C$g2*_|Q7qgWhnnrE^sKP-0P`NBs0F^v2ZQ zrAli6iL=6Mg6jqlrTL=&q4)tr9uqLtitb18!SFEdb{}HpeX(=N=s^?tv!5r`+mWQ4 zQ|12QS`?zEvdvA(pyK~~->bqg3kK}4%AD1*V1Uy7e;hR#qeGn>JJ&Xy4$}S9t?8%fAf{?NwBCgdFTBm?J|3Y% zR87+nQ$IQsJ@1A5>vT|1o|^8ir9)2DMX#4%=-@9-GhVC60EH6S)uz@Am}L1`>`h>Q zz)}?(%VQ52;5=)~`ZmLW(z?Kt@d`|c)Y>vJZo-6)*p)5AE==%IZg_hvfC;_7Sw^3W zWWulAbNpJ-On6U?uuVPB1Qzkltr0gS%vBpLhxxca2#PsQvP_`dlAK9=$$+QkPMr@D z8K5j+LoP63KynV}rTZiu!tGxMFq7$j(7*_0uh>Qh!(bIZj}Zkp@;FK3Lc9X3e!ihS zQBMH`3SRf!nWVw3ktzAi5*ipGzuPQ-8n`|8&@X4x;8Wx`Gnyt1JfzI@sq1N=lfI(l z-WnR**l7~m%%nkjpwGE1putX&&J#v`nC;D7) zOs&B<4Dr;}(p+q?a8j^9iHm)IVO2yoy{^IbmHuMK-Bp9xzo~zD#-kc5{3sK3WFH6P z#KpU13shmUb1L<_rYbQ?`7^fHe4X4Nmx_j}609n>Lrd`1U981wNI}~94#pau&>MfB zf|=}YNJhU#VQb7J-u*Or9F6Mn!^Bh^>OOVgZszqAx{Bc<8F!PO>JrD+;X30*@_f2lqq4j!XzH$AKK=$PRRqg ze={iRyd8mMX_pg>4yRzPDpo1?F5JPERqB-YdK6-3_`}wkhL>SUF>K5Gc9mHA;Jtzq z$E&b~Ig{PMGJ5z@`}EE-QLMeY6(NBLsP(fK52h4unGIWib)Q$GxcHi0b@dt~ zQYAil!?Omx(pbuuoK}NoBO3E2nro1y`L*%i$7)bpV0Bsa5-$2V#ChFDWiHwmH7dSj z4;QVQXN8WB-0!Pvcg From 46e985b5c6d6f9e48c43d04526e9d4e7a587abe8 Mon Sep 17 00:00:00 2001 From: XaviPozo <168111392+XaviPozo@users.noreply.github.com> Date: Fri, 13 Jun 2025 01:36:43 +0200 Subject: [PATCH 16/22] buena pinta 2 --- .../drag y lift/main_constraint_draglift.m | 25 +++++++++++++----- OptimalControl/drag y lift/resultsfalcon.mat | Bin 4601 -> 10978 bytes 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/OptimalControl/drag y lift/main_constraint_draglift.m b/OptimalControl/drag y lift/main_constraint_draglift.m index 6cd6919e12..c429c6a5d3 100644 --- a/OptimalControl/drag y lift/main_constraint_draglift.m +++ b/OptimalControl/drag y lift/main_constraint_draglift.m @@ -15,15 +15,16 @@ %Clalpha = 0.1; % en grados Cl0 = 0; - N = 100; % Discretization + N = 250; % Discretization x1_0 = 0; x2_0 = 0; v0 = 15; gamma0 = deg2rad(30); - t0 = 0; tf_guess = 10; - alpha0 = deg2rad(3); + t0 = 0; tf_guess = 6; + alpha0 = deg2rad(10); u0 = [resultsfalcon.tfinal resultsfalcon.u.alpha]; + %u0 = [tf_guess alpha0] lb = [0.1 deg2rad(-10)]; % Lower bounds for the control - ub = [15 deg2rad(10)]; % Upper bounds for the control + ub = [15 deg2rad(10.1)]; % Upper bounds for the control %u0 = [u0(1) ones(1,N)*u0(2)]; lb = [lb(1) ones(1,N)*lb(2)]; @@ -36,6 +37,13 @@ D = @(V,alpha) 0.5*rho*Sw*V.^2.*Cd(alpha); L = @(V,alpha) 0.5*rho*Sw*V.^2.*Cl(alpha); + [~,y0traj] = ode45(@(t,y)dynamics(t,y,u0(1),u0(2:end),g,D,N,m,L), ... + linspace(t0,u0(1),N), ... + [x1_0; x2_0; v0; gamma0]); + +minAlt = min(y0traj(:,2)); +fprintf('Altura mínima con u0 = %.4f m\n',minAlt); + cost = @(u) f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D, N, m, L); nonlcon_fun = @(u) nonlcon_full(u, g, t0, v0, x1_0, x2_0, gamma0, D, N, m, L); @@ -57,6 +65,9 @@ figure plot(y(:,1),y(:,2)) + xlabel("Horizontal displacement [m]") + ylabel("Vertical displacement [m]") + title("Trajectory") function stop = store_fmincon(u, optimValues, state) if optimValues.iteration == 0 @@ -79,7 +90,8 @@ tf = u(1); alpha = u(2:N+1); t_span = linspace(t0, tf, N)'; - [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, D, N, m, L), t_span, y0); + ode_opts = odeset('RelTol',1e-5,'AbsTol',1e-7); + [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, D, N, m, L), t_span, y0, ode_opts); J = -y(end,1); @@ -108,7 +120,8 @@ alpha = u(2:end); t_span = linspace(t0, tf, N); y0 = [x1_0; x2_0; v0; gamma0]; - [~, y] = ode45(@(t,y)dynamics(t,y,tf,alpha,g,D,N,m,L), t_span, y0); + ode_opts = odeset('RelTol',1e-5,'AbsTol',1e-7); + [~, y] = ode45(@(t,y)dynamics(t,y,tf,alpha,g,D,N,m,L), t_span, y0, ode_opts); c = -y(:,2); ceq = y(end,2); diff --git a/OptimalControl/drag y lift/resultsfalcon.mat b/OptimalControl/drag y lift/resultsfalcon.mat index dbb413e847e74d0ac694f2726d518598349ea96c..fcc606ddc5af01d4af1f212c7bbd5b8512f7bef5 100644 GIT binary patch delta 10960 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 TP}v{t@Ru$%R)6^~Yhtpvxi#fX From 30a0a56bf66151d7a052f2958c19a128811effcb Mon Sep 17 00:00:00 2001 From: XaviPozo <168111392+XaviPozo@users.noreply.github.com> Date: Mon, 16 Jun 2025 01:24:23 +0200 Subject: [PATCH 17/22] Drag y Lift funcionando --- OptimalControl/DragAndLift.m | 192 +++++++++++++++ OptimalControl/{ => old}/cesc/Shooting.m | 0 .../{ => old}/cesc/Trapezoidal_direct.m | 0 .../cesc/fm_mex_source_zermelo.mexw64 | Bin .../fm_mex_source_zermelo/cpp/_clang-format | 0 .../fm_mex_source_zermelo/cpp/buildInfo.mat | Bin .../fm_mex_source_zermelo/cpp/codeInfo.mat | Bin .../cpp/codedescriptor.dmr | Bin .../fm_mex_source_zermelo/cpp/compileInfo.mat | Bin .../cpp/examples/main.cpp | 0 .../fm_mex_source_zermelo/cpp/examples/main.h | 0 .../_coder_mb_fm_mex_source_zermelo_api.cpp | 0 .../_coder_mb_fm_mex_source_zermelo_api.h | 0 .../_coder_mb_fm_mex_source_zermelo_info.cpp | 0 .../_coder_mb_fm_mex_source_zermelo_info.h | 0 .../_coder_mb_fm_mex_source_zermelo_mex.cpp | 0 .../_coder_mb_fm_mex_source_zermelo_mex.h | 0 .../cpp/mb_fm_mex_source_zermelo.cpp | 0 .../cpp/mb_fm_mex_source_zermelo.h | 0 .../cpp/mb_fm_mex_source_zermelo_CALL.cpp | 0 .../cpp/mb_fm_mex_source_zermelo_rtw.bat | 0 .../cpp/mb_fm_mex_source_zermelo_rtw.mk | 0 .../cpp/mb_fm_mex_source_zermelo_rtw.rsp | 0 .../cpp/mb_fm_mex_source_zermelo_rtw_comp.rsp | 0 .../cpp/mb_fm_mex_source_zermelo_rtw_ref.rsp | 0 .../cpp/mb_fm_mex_source_zermelo_types.h | 0 .../fm_mex_source_zermelo/cpp/rtw_proj.tmw | 0 .../fm_mex_source_zermelo/cpp/rtwtypes.h | 0 .../fm_mex_source_zermelo/cpp/setup_mingw.bat | 0 .../diff/mb_fm_mex_source_zermelo.m | 0 ...398ef064917340965807c0c11f1a7ead-meta.json | 0 ...sys_398ef064917340965807c0c11f1a7ead_jac.m | 0 OptimalControl/{ => old}/cesc/main.m | 0 .../{ => old}/cesc/source_zermelo.m | 0 .../{ => old}/drag pruebas/drag_data.mat | Bin .../drag pruebas/main_constraint_drag.m | 0 .../{ => old}/drag pruebas/nodrag_data.mat | Bin .../drag y lift/main_constraint_draglift.m | 69 ++++-- .../old/drag y lift/opt_tiro_sens.m | 223 ++++++++++++++++++ .../{ => old}/drag y lift/resultsfalcon.mat | Bin OptimalControl/{ => old}/drag/drag_data.mat | Bin .../{ => old}/drag/main_constraint_drag.m | 0 OptimalControl/{ => old}/drag/nodrag_data.mat | Bin .../{ => old}/nodrag/main_constraint_nodrag.m | 0 .../{ => old}/nodrag/nodrag_data.mat | Bin 45 files changed, 464 insertions(+), 20 deletions(-) create mode 100644 OptimalControl/DragAndLift.m rename OptimalControl/{ => old}/cesc/Shooting.m (100%) rename OptimalControl/{ => old}/cesc/Trapezoidal_direct.m (100%) rename OptimalControl/{ => old}/cesc/fm_mex_source_zermelo.mexw64 (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/_clang-format (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/buildInfo.mat (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/codeInfo.mat (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/codedescriptor.dmr (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/compileInfo.mat (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/examples/main.cpp (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/examples/main.h (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_api.cpp (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_api.h (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_info.cpp (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_info.h (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_mex.cpp (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_mex.h (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo.cpp (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo.h (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_CALL.cpp (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.bat (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.mk (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.rsp (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw_comp.rsp (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw_ref.rsp (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_types.h (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/rtw_proj.tmw (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/rtwtypes.h (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/cpp/setup_mingw.bat (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/diff/mb_fm_mex_source_zermelo.m (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/diff/sys_398ef064917340965807c0c11f1a7ead-meta.json (100%) rename OptimalControl/{ => old}/cesc/fm_models/fm_mex_source_zermelo/diff/sys_398ef064917340965807c0c11f1a7ead_jac.m (100%) rename OptimalControl/{ => old}/cesc/main.m (100%) rename OptimalControl/{ => old}/cesc/source_zermelo.m (100%) rename OptimalControl/{ => old}/drag pruebas/drag_data.mat (100%) rename OptimalControl/{ => old}/drag pruebas/main_constraint_drag.m (100%) rename OptimalControl/{ => old}/drag pruebas/nodrag_data.mat (100%) rename OptimalControl/{ => old}/drag y lift/main_constraint_draglift.m (64%) create mode 100644 OptimalControl/old/drag y lift/opt_tiro_sens.m rename OptimalControl/{ => old}/drag y lift/resultsfalcon.mat (100%) rename OptimalControl/{ => old}/drag/drag_data.mat (100%) rename OptimalControl/{ => old}/drag/main_constraint_drag.m (100%) rename OptimalControl/{ => old}/drag/nodrag_data.mat (100%) rename OptimalControl/{ => old}/nodrag/main_constraint_nodrag.m (100%) rename OptimalControl/{ => old}/nodrag/nodrag_data.mat (100%) diff --git a/OptimalControl/DragAndLift.m b/OptimalControl/DragAndLift.m new file mode 100644 index 0000000000..fcf999d8c5 --- /dev/null +++ b/OptimalControl/DragAndLift.m @@ -0,0 +1,192 @@ +% Launch with drag and lift + +clc; clear; close all + +%% Physical parameters + +g = 9.81; +m = 5.0; +rho = 1.225; +S = 0.6; +Cd0 = 0.03; +k = 0.05; +Cl0 = 0.0; +Clalpha = 0.1*360/(2*pi); + +%% Discretization + +N = 50; % Number of nodes + +%% Initial state + +x0 = 0; y0 = 0; v0 = 15; gamma0 = deg2rad(30); % State initial conditions +alpha0 = deg2rad(5); % Initial guess for angle of attack [rad] +tf0 = 7; % Initial guess for final time [s] + +%% Decision variables vector + +z0 = repmat([x0; y0; v0; gamma0; alpha0], N, 1); +z0 = [z0; tf0]; + +%% Bounds for the variables + +alpha_min = deg2rad(-10); +alpha_max = deg2rad(10); +tf_min = 2; +tf_max = 30; + +lb = repmat([-Inf; 0; 0; -pi/2; alpha_min], N, 1); % Lower bounds +ub = repmat([ Inf; Inf; Inf; pi/2; alpha_max], N, 1); % Upper bounds +lb = [lb; tf_min]; +ub = [ub; tf_max]; + +%% Cost function: maximize range + +obj = @(z) -z((N-1)*5 + 1); % Cost function x(t_f) + +%% Restrictions + +nonlcon = @(z) collocation_constraints_tf(z, N, rho, S, Cd0, k, Cl0, Clalpha, m, g, v0, gamma0); + +%% Optimization + +opts = optimoptions('fmincon', ... + 'Display','iter-detailed', ... + 'MaxFunctionEvaluations', 1e6, ... + 'MaxIterations', 1000, ... + 'StepTolerance', 1e-6, ... + 'ScaleProblem', true, ... + 'Algorithm', 'interior-point'); + +[z_opt, fval] = fmincon(obj, z0, [], [], [], [], lb, ub, nonlcon, opts); + +%% Final results + +tf_opt = z_opt(end); % Optimal final time [s] +Z = reshape(z_opt(1:end-1), 5, N); +x = Z(1,:); y = Z(2,:); v = Z(3,:); gamma = Z(4,:); alpha = Z(5,:); +t = linspace(0, tf_opt, N); + +q = 0.5*rho.*v.^2; +Cl = Cl0+Clalpha.*alpha; +Cd = Cd0+k.*Cl.^2; +L = q.*S.*Cl; +D = q.*S.*Cd; + +fprintf('Máximum range: %.2f m\n', x(end)); +fprintf('Optimal final time: %.2f s\n', tf_opt); + +%% Postprocess + +set(groot,'defaultLineLineWidth',1.5); % thicker lines for all plots + +% Optimal trajectory +figure +plot(x, y, 'LineWidth', 2,'DisplayName','Trajectory') +hold on +plot(x(1), y(1), 'go', 'MarkerSize', 7, 'MarkerFaceColor', 'g', 'DisplayName','Launch'); +plot(x(end),y(end),'ro', 'MarkerSize', 7, 'MarkerFaceColor','r','DisplayName','Impact'); +xlim([0 1.05*max(x)]) +ylim([min(0,1.05*min(y)) 1.05*max(y)]) +grid on; box on +xlabel('x [m]','Interpreter','latex') +ylabel('y [m]','Interpreter','latex') +title('Optimal trajectory','Interpreter','latex') +legend('Location','best') +set(gca,'FontSize',12) + +% Angle-of-attack profile +figure +stairs(t, rad2deg(alpha), 'Marker','o') +grid on; box on +xlim([0 t(end)]) +ylim([min(rad2deg(alpha))-2 max(rad2deg(alpha))+2]) +xlabel('Time [s]','Interpreter','latex') +ylabel('$\alpha$ [$^\circ$]','Interpreter','latex') +title('Angle of attack profile','Interpreter','latex') +set(gca,'FontSize',12) + +% Speed vs. time +figure +plot(t, v, 'LineWidth', 2) +grid on; +xlabel('Time [s]','Interpreter','latex') +ylabel('$v$ [m/s]','Interpreter','latex') +title('Velocity profile','Interpreter','latex') +set(gca,'FontSize',12) + +% Flight-path angle vs. time +figure +plot(t, rad2deg(gamma), 'LineWidth', 2) +grid on; box on +xlabel('Time [s]','Interpreter','latex') +ylabel('$\gamma$ [$^\circ$]','Interpreter','latex') +title('Flight path angle','Interpreter','latex') +set(gca,'FontSize',12) + +% Lift & Drag vs. time + +figure +plot(t, L,'DisplayName','Lift','LineWidth',2); +hold on +plot(t, D, 'DisplayName','Drag','LineWidth',2); +grid on; box on +xlabel('Time [s]','Interpreter','latex') +ylabel('Force [N]','Interpreter','latex') +title('Aerodynamic forces','Interpreter','latex') +legend('Location','best') +set(gca,'FontSize',12) + +%% ---------- FUNCTIONS ---------- + +function [c, ceq] = collocation_constraints_tf(z, N, rho, S, Cd0, k, Cl0, Clalpha, m, g, v0, gamma0) + tf = z(end); + dt = tf / (N - 1); + Z = reshape(z(1:end-1), 5, N); + x = Z(1,:); y = Z(2,:); v = Z(3,:); gamma = Z(4,:); alpha = Z(5,:); + + ceq = []; + for i = 1:N-1 + % States at i and i+1 + xi = x(i); yi = y(i); vi = v(i); gi = gamma(i); ai = alpha(i); + xj = x(i+1); yj = y(i+1); vj = v(i+1); gj = gamma(i+1); aj = alpha(i+1); + + % Derivatives + [dxi, dyi, dvi, dgi] = dynamics(xi, yi, vi, gi, ai, rho, S, Cd0, k, Cl0, Clalpha, m, g); + [dxj, dyj, dvj, dgj] = dynamics(xj, yj, vj, gj, aj, rho, S, Cd0, k, Cl0, Clalpha, m, g); + + % Collocation equations (trapezoidal) + ceq = [ceq; + xj-xi-dt/2*(dxi + dxj); + yj-yi-dt/2*(dyi + dyj); + vj-vi-dt/2*(dvi + dvj); + gj-gi-dt/2*(dgi + dgj)]; + end + + % Initial conditions + ceq = [ceq; + x(1)-0; + y(1)-0; + v(1)-v0; + gamma(1)-gamma0]; + + % Equality constraint: y(tf) = 0 + ceq = [ceq; + y(end)]; + + % Inequality constraint: y_i ≥ 0 + c = -y; +end + +function [dx, dy, dv, dgamma] = dynamics(~, y, v, gamma, alpha, rho, S, Cd0, k, Cl0, Clalpha, m, g) + Cl = Cl0+Clalpha*alpha; + Cd = Cd0+k* Cl^2; + q = 0.5*rho*v^2; + L = q*S*Cl; + D = q*S*Cd; + + dx = v*cos(gamma); + dy = v*sin(gamma); + dv = -D/m-g*sin(gamma); + dgamma = L/(m*v)-g*cos(gamma)/v; +end diff --git a/OptimalControl/cesc/Shooting.m b/OptimalControl/old/cesc/Shooting.m similarity index 100% rename from OptimalControl/cesc/Shooting.m rename to OptimalControl/old/cesc/Shooting.m diff --git a/OptimalControl/cesc/Trapezoidal_direct.m b/OptimalControl/old/cesc/Trapezoidal_direct.m similarity index 100% rename from OptimalControl/cesc/Trapezoidal_direct.m rename to OptimalControl/old/cesc/Trapezoidal_direct.m diff --git a/OptimalControl/cesc/fm_mex_source_zermelo.mexw64 b/OptimalControl/old/cesc/fm_mex_source_zermelo.mexw64 similarity index 100% rename from OptimalControl/cesc/fm_mex_source_zermelo.mexw64 rename to OptimalControl/old/cesc/fm_mex_source_zermelo.mexw64 diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/_clang-format b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/_clang-format similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/_clang-format rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/_clang-format diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/buildInfo.mat b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/buildInfo.mat similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/buildInfo.mat rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/buildInfo.mat diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/codeInfo.mat b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/codeInfo.mat similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/codeInfo.mat rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/codeInfo.mat diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/codedescriptor.dmr b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/codedescriptor.dmr similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/codedescriptor.dmr rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/codedescriptor.dmr diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/compileInfo.mat b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/compileInfo.mat similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/compileInfo.mat rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/compileInfo.mat diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/examples/main.cpp b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/examples/main.cpp similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/examples/main.cpp rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/examples/main.cpp diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/examples/main.h b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/examples/main.h similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/examples/main.h rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/examples/main.h diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_api.cpp b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_api.cpp similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_api.cpp rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_api.cpp diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_api.h b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_api.h similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_api.h rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_api.h diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_info.cpp b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_info.cpp similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_info.cpp rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_info.cpp diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_info.h b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_info.h similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_info.h rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_info.h diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_mex.cpp b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_mex.cpp similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_mex.cpp rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_mex.cpp diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_mex.h b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_mex.h similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_mex.h rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/interface/_coder_mb_fm_mex_source_zermelo_mex.h diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo.cpp b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo.cpp similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo.cpp rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo.cpp diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo.h b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo.h similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo.h rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo.h diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_CALL.cpp b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_CALL.cpp similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_CALL.cpp rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_CALL.cpp diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.bat b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.bat similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.bat rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.bat diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.mk b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.mk similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.mk rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.mk diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.rsp b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.rsp similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.rsp rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw.rsp diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw_comp.rsp b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw_comp.rsp similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw_comp.rsp rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw_comp.rsp diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw_ref.rsp b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw_ref.rsp similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw_ref.rsp rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_rtw_ref.rsp diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_types.h b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_types.h similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_types.h rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/mb_fm_mex_source_zermelo_types.h diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/rtw_proj.tmw b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/rtw_proj.tmw similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/rtw_proj.tmw rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/rtw_proj.tmw diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/rtwtypes.h b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/rtwtypes.h similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/rtwtypes.h rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/rtwtypes.h diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/setup_mingw.bat b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/setup_mingw.bat similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/cpp/setup_mingw.bat rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/cpp/setup_mingw.bat diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/diff/mb_fm_mex_source_zermelo.m b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/diff/mb_fm_mex_source_zermelo.m similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/diff/mb_fm_mex_source_zermelo.m rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/diff/mb_fm_mex_source_zermelo.m diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/diff/sys_398ef064917340965807c0c11f1a7ead-meta.json b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/diff/sys_398ef064917340965807c0c11f1a7ead-meta.json similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/diff/sys_398ef064917340965807c0c11f1a7ead-meta.json rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/diff/sys_398ef064917340965807c0c11f1a7ead-meta.json diff --git a/OptimalControl/cesc/fm_models/fm_mex_source_zermelo/diff/sys_398ef064917340965807c0c11f1a7ead_jac.m b/OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/diff/sys_398ef064917340965807c0c11f1a7ead_jac.m similarity index 100% rename from OptimalControl/cesc/fm_models/fm_mex_source_zermelo/diff/sys_398ef064917340965807c0c11f1a7ead_jac.m rename to OptimalControl/old/cesc/fm_models/fm_mex_source_zermelo/diff/sys_398ef064917340965807c0c11f1a7ead_jac.m diff --git a/OptimalControl/cesc/main.m b/OptimalControl/old/cesc/main.m similarity index 100% rename from OptimalControl/cesc/main.m rename to OptimalControl/old/cesc/main.m diff --git a/OptimalControl/cesc/source_zermelo.m b/OptimalControl/old/cesc/source_zermelo.m similarity index 100% rename from OptimalControl/cesc/source_zermelo.m rename to OptimalControl/old/cesc/source_zermelo.m diff --git a/OptimalControl/drag pruebas/drag_data.mat b/OptimalControl/old/drag pruebas/drag_data.mat similarity index 100% rename from OptimalControl/drag pruebas/drag_data.mat rename to OptimalControl/old/drag pruebas/drag_data.mat diff --git a/OptimalControl/drag pruebas/main_constraint_drag.m b/OptimalControl/old/drag pruebas/main_constraint_drag.m similarity index 100% rename from OptimalControl/drag pruebas/main_constraint_drag.m rename to OptimalControl/old/drag pruebas/main_constraint_drag.m diff --git a/OptimalControl/drag pruebas/nodrag_data.mat b/OptimalControl/old/drag pruebas/nodrag_data.mat similarity index 100% rename from OptimalControl/drag pruebas/nodrag_data.mat rename to OptimalControl/old/drag pruebas/nodrag_data.mat diff --git a/OptimalControl/drag y lift/main_constraint_draglift.m b/OptimalControl/old/drag y lift/main_constraint_draglift.m similarity index 64% rename from OptimalControl/drag y lift/main_constraint_draglift.m rename to OptimalControl/old/drag y lift/main_constraint_draglift.m index c429c6a5d3..8e5112c697 100644 --- a/OptimalControl/drag y lift/main_constraint_draglift.m +++ b/OptimalControl/old/drag y lift/main_constraint_draglift.m @@ -15,16 +15,22 @@ %Clalpha = 0.1; % en grados Cl0 = 0; - N = 250; % Discretization - + N = 50; % Discretization + x1_0 = 0; x2_0 = 0; v0 = 15; gamma0 = deg2rad(30); - t0 = 0; tf_guess = 6; - alpha0 = deg2rad(10); - u0 = [resultsfalcon.tfinal resultsfalcon.u.alpha]; - %u0 = [tf_guess alpha0] + t0 = 0; tf_guess = 3; + alpha0 = deg2rad(3); + tf_falcon = resultsfalcon.tfinal; + t_span_falcon = linspace(0,tf_falcon,250); + t_span = linspace(0,tf_falcon,N); + alpha_falcon = interp1(t_span_falcon,resultsfalcon.u.alpha,t_span); + + %u0 = [tf_falcon+rand(1,1)*0*norm(tf_falcon) alpha_falcon+rand(1,1)*0*norm(alpha_falcon)]; + %u0 = [tf_guess alpha0*ones(1,N)]; + u0 = [tf_falcon alpha_falcon]; lb = [0.1 deg2rad(-10)]; % Lower bounds for the control - ub = [15 deg2rad(10.1)]; % Upper bounds for the control + ub = [15 deg2rad(15)]; % Upper bounds for the control %u0 = [u0(1) ones(1,N)*u0(2)]; lb = [lb(1) ones(1,N)*lb(2)]; @@ -37,21 +43,43 @@ D = @(V,alpha) 0.5*rho*Sw*V.^2.*Cd(alpha); L = @(V,alpha) 0.5*rho*Sw*V.^2.*Cl(alpha); - [~,y0traj] = ode45(@(t,y)dynamics(t,y,u0(1),u0(2:end),g,D,N,m,L), ... - linspace(t0,u0(1),N), ... - [x1_0; x2_0; v0; gamma0]); - -minAlt = min(y0traj(:,2)); -fprintf('Altura mínima con u0 = %.4f m\n',minAlt); - cost = @(u) f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D, N, m, L); nonlcon_fun = @(u) nonlcon_full(u, g, t0, v0, x1_0, x2_0, gamma0, D, N, m, L); - options = optimoptions("fmincon", ... - "OutputFcn", @store_fmincon, ... - "Algorithm", "sqp", ... - "DerivativeCheck", "off","Display","iter","FiniteDifferenceType","central", ... - "FiniteDifferenceStepSize", 1e-4); + options = optimoptions('fmincon', ... + 'Algorithm', 'sqp', ... + 'TolX', 1e-8, ... % precisión en las variables + 'TolFun', 1e-8, ... % precisión en el valor de la función objetivo + 'TolCon', 1e-6, ... % precisión en las restricciones + 'MaxIter', 500, ... % aumentar número de iteraciones + 'MaxFunEvals', 5000, ... % aumentar evaluaciónes de la función + 'Display', 'iter', ... + 'FiniteDifferenceType', 'central', ... + 'FiniteDifferenceStepSize', 1e-6); + + % Antes de llamar a fmincon, tras definir u0, lb, ub, etc.: +t_nodes = linspace(t0, tf_guess, N); % nodos de control iniciales +% (en cada iteración de fmincon habrá que actualizar tf y volver a crear el interpolant; +% lo hacemos dentro de la función no-lineal y en f_cost) + +% Y definimos un interpolante cúbico: +alpha = @(t, alpha_vec, tf) ... + griddedInterpolant( ... + linspace(0,tf, numel(alpha_vec)), ... % vector de tiempo + [alpha_vec; alpha_vec(end)], ... % extiendo para t=tf + 'pchip', ... % shape-preserving spline + 'nearest' ... % extrapolación constante + ); + +% Luego, en tu función dynamics, en lugar de: +% t_span = linspace(0, tf, N); +% alpha = interp1(t_span, alpha_vec, t); +% +% harías algo como: +% +% F = alphaInterp(t, alpha_vec, tf); +% alpha = F(t); + [u_opt, ~] = fmincon(cost, u0, [], [], [], [], lb, ub, nonlcon_fun, options); @@ -123,7 +151,8 @@ ode_opts = odeset('RelTol',1e-5,'AbsTol',1e-7); [~, y] = ode45(@(t,y)dynamics(t,y,tf,alpha,g,D,N,m,L), t_span, y0, ode_opts); - c = -y(:,2); + minY = min(y(:,2)); + c = -minY; % cumple si minY ≥ 0 ceq = y(end,2); end diff --git a/OptimalControl/old/drag y lift/opt_tiro_sens.m b/OptimalControl/old/drag y lift/opt_tiro_sens.m new file mode 100644 index 0000000000..9ad14ce746 --- /dev/null +++ b/OptimalControl/old/drag y lift/opt_tiro_sens.m @@ -0,0 +1,223 @@ +function opt_tiro_sens +%------------------------------------------------------------- +% ÓPTIMO DE TIRO PARABÓLICO CON DRAG & LIFT +% Derivadas analíticas (sensibilidades variacionales) +%------------------------------------------------------------- +clc; close all; + +%% ------------------ PARÁMETROS FÍSICOS ------------------- +pars.g = 9.81; % gravedad [m/s^2] +pars.rho = 1.225; % densidad aire [kg/m^3] +pars.Sw = 0.6; % superficie alar [m^2] +pars.Cd0 = 0.03; +pars.k = 0.05; +pars.m = 5; % masa [kg] +pars.Cl0 = 0; +pars.Clalpha = 0.1*360/(2*pi); % [1/rad] (0.1 por grado) + +%% ------------------ DISCRETIZACIÓN ------------------------- +N = 200; % nº nodos de alfa(t) +pars.N = N; +pars.s_nodes = linspace(0,1,N); % malla normalizada 0…1 +nu = N + 1; % nº variables de decisión + +%% ------------------ CONDICIONES INICIALES ----------------- +x1_0 = 0; x2_0 = 0; v0 = 15; +gamma0 = deg2rad(30); % ángulo de disparo +y0 = [x1_0; x2_0; v0; gamma0]; + +%% ------------------ VARIABLES DE DECISIÓN ----------------- +tf0 = 10; % conjetura tf +alpha0 = deg2rad(4); % conjetura α(t) +u0 = [ tf0, ones(1,N)*alpha0 ]; + +lb = [ 0.1, ones(1,N)*deg2rad(-10) ]; +ub = [ 15 , ones(1,N)*deg2rad( 10) ]; +u0 = max(lb, min(ub,u0)); % clip → dentro de límites + +%% ------------------ OPCIONES FMINCON ---------------------- +options = optimoptions('fmincon', ... + 'Algorithm', 'sqp', ... + 'SpecifyObjectiveGradient', true, ... + 'SpecifyConstraintGradient', true, ... + 'UseParallel', true, ... + 'FiniteDifferenceType', 'central', ... % sólo por si falláramos + 'Display', 'iter'); + +%% ------------------ OPTIMIZACIÓN -------------------------- +costfun = @(u) cost_with_grad (u,y0,pars); +confun = @(u) con_with_grad (u,y0,pars); + +[u_opt,~,exitflag,output] = ... + fmincon(costfun,u0,[],[],[],[],lb,ub,confun,options); + +%% ------------------ RESULTADOS ---------------------------- +fprintf('\n· Alcance máximo = %.3f m\n', -costfun(u_opt)); +fprintf('· Tiempo de vuelo = %.3f s\n', u_opt(1)); +fprintf('· Iteraciones = %d\n', output.iterations); +fprintf('· Mensaje solver : %s\n\n', output.message); + +% Trayectoria óptima para visualizar +[Y,~] = simulate_state_sens(u_opt,y0,pars); +figure; plot(Y(:,1),Y(:,2),'LineWidth',1.6); +xlabel('Distancia horizontal x [m]'); +ylabel('Altura y [m]'); grid on; title('Trayectoria óptima'); +end +%% ===================================================================== +% COSTE + GRADIENTE +% ====================================================================== +function [J, gradJ] = cost_with_grad(u,y0,pars) +[Y,S] = simulate_state_sens(u,y0,pars); + +J = -Y(end,1); % max alcance → min ( -x(tf) ) +gradJ = -S(end,1,:); % d(-x)/du = - ∂x/∂u +gradJ = gradJ(:); % columna +end +%% ===================================================================== +% RESTRICCIONES + GRADIENTES ANALÍTICOS +% ====================================================================== +function [c,ceq,gradc,gradceq] = con_with_grad(u,y0,pars) +[Y,S] = simulate_state_sens(u,y0,pars); + +% --- Desigualdades: y(t) >= 0 → -y <= 0 +c = -Y(:,2); % tamaño N×1 +St = squeeze(S(:,2,:)); % (N × nu) +gradc = -St.'; % (nu × N) + +% --- Igualdad final: y(tf) = 0 +ceq = Y(end,2); % escalar +gradceq = squeeze(S(end,2,:)); % (nu × 1) +end +%% ===================================================================== +% SIMULACIÓN DEL SISTEMA + SENSIBILIDADES (con cache) +% ====================================================================== +function [Y,S] = simulate_state_sens(u,y0,pars) +% Devuelve: +% Y : (N × 4) estados en los nodos +% S : (N × 4 × nu) sensibilidades +persistent u_last Y_last S_last +if ~isempty(u_last) && isequal(u,u_last) + Y = Y_last; S = S_last; return % reutiliza integración +end + +tf = u(1); +alpha_n = u(2:end); % N valores +nu = numel(u); + +z0 = zeros(4 + 4*nu,1); % estado + sens. +z0(1:4) = y0; + +t_span = linspace(0,tf,pars.N); % nodos reales (N tiempos) + +odeopts = odeset('RelTol',1e-6,'AbsTol',1e-8); + +odefun = @(t,z) aug_dynamics(t,z,tf,alpha_n,pars); + +[~,Z] = ode45(odefun,t_span,z0,odeopts); + +Y = Z(:,1:4); % N × 4 +Sens = Z(:,5:end); % N × 4·nu +S = reshape(Sens,[],4,nu); % N × 4 × nu + +% Guarda en cache +u_last = u; Y_last = Y; S_last = S; +end +%% ===================================================================== +% DINÁMICA AUMENTADA (estado+sens.) +% ====================================================================== +function dzdt = aug_dynamics(t,z,tf,alpha_n,pars) +% --- desempaqueta -------------------------------------------- +N = pars.N; +nu = N + 1; +y = z(1:4); % estado +S = reshape(z(5:end),4,nu); % 4×nu sensibilidades + +x = y(1); y_pos = y(2); %#ok +v = y(3); gamma = y(4); + +% --- α(t), dα/dtf y pesos dα/dα_k ----------------------------- +[alpha, w, dalpha_dtf] = alpha_info(t,tf,alpha_n,pars); + +% ---- COEFICIENTES AERODINÁMICOS ------------------------------ +g = pars.g; rho = pars.rho; Sw = pars.Sw; +m = pars.m; Cd0 = pars.Cd0; k = pars.k; +Cl0 = pars.Cl0; Clalpha = pars.Clalpha; + +Cl = Cl0 + Clalpha*alpha; +Cd = Cd0 + k*Cl.^2; + +D = 0.5*rho*Sw*v^2*Cd; +L = 0.5*rho*Sw*v^2*Cl; + +% --- DINÁMICA f(y,α) ------------------------------------------ +f = [ ... + v*cos(gamma); ... + v*sin(gamma); ... + -g*sin(gamma) - D/m; ... + -(g/v)*cos(gamma) + L/(m*v) ]; + +%% --------------- MATRIZ A = ∂f/∂y ------------------------- +A = zeros(4,4); +A(1,3) = cos(gamma); +A(1,4) = -v*sin(gamma); + +A(2,3) = sin(gamma); +A(2,4) = v*cos(gamma); + +c1 = 0.5*rho*Sw*Cd; +A(3,3) = -(1/m) * 2*c1*v; +A(3,4) = -g*cos(gamma); + +k2 = (0.5*rho*Sw*Cl)/m; +A(4,3) = g*cos(gamma)/v^2 + k2; +A(4,4) = (g/v)*sin(gamma); + +%% -------- B = ∂f/∂u_j (α_k y t_f) ------------------------- +% d f / d α +dCd_dalp = 2*k*Cl*Clalpha; +dD_dalp = 0.5*rho*Sw*v^2*dCd_dalp; +dL_dalp = 0.5*rho*Sw*v^2*Clalpha; + +df_dalp = [ 0; 0; + -(1/m)*dD_dalp; + (1/(m*v))*dL_dalp ]; + +B = zeros(4,nu); +% primera columna → t_f +B(:,1) = df_dalp * dalpha_dtf; % 4×1 +% columnas 2..N+1 → α_k +B(:,2:end) = df_dalp .* w; % 4×N (broadcast) + +%% ------------ Ecuación de sensibilidades -------------------- +dSdt = A*S + B; % 4×nu + +%% ------------ Empaqueta derivadas --------------------------- +dzdt = [ f ; dSdt(:) ]; +end +%% ===================================================================== +% α(t), pesos dα/dα_k y derivada dα/dt_f (malla s = t/tf) +% ====================================================================== +function [alpha, w, dalpha_dtf] = alpha_info(t,tf,alpha_n,pars) +N = pars.N; +s = min(max(t/tf,0),1); % s ∈ [0,1] +% nodos uniformes en s +i = floor(s*(N-1))+1; % índice base (1…N) +if i>=N + i = N-1; lambda = 1; % extremo derecho +elseif i<=0 + i = 1; lambda = 0; % extremo izquierdo +else + s_i = (i-1)/(N-1); + lambda = (s - s_i) * (N-1); % ∈ [0,1] +end +% pesos lineales +w = zeros(1,N); +w(i) = 1 - lambda; +w(i+1) = lambda; + +alpha = w*alpha_n.'; % α(t) + +% ←—— derivada respecto tf ——————————————— +dalpha_ds = (N-1)*(alpha_n(i+1) - alpha_n(i)); % pendiente local +dalpha_dtf = - (s/tf) * dalpha_ds; % dα/dtf +end diff --git a/OptimalControl/drag y lift/resultsfalcon.mat b/OptimalControl/old/drag y lift/resultsfalcon.mat similarity index 100% rename from OptimalControl/drag y lift/resultsfalcon.mat rename to OptimalControl/old/drag y lift/resultsfalcon.mat diff --git a/OptimalControl/drag/drag_data.mat b/OptimalControl/old/drag/drag_data.mat similarity index 100% rename from OptimalControl/drag/drag_data.mat rename to OptimalControl/old/drag/drag_data.mat diff --git a/OptimalControl/drag/main_constraint_drag.m b/OptimalControl/old/drag/main_constraint_drag.m similarity index 100% rename from OptimalControl/drag/main_constraint_drag.m rename to OptimalControl/old/drag/main_constraint_drag.m diff --git a/OptimalControl/drag/nodrag_data.mat b/OptimalControl/old/drag/nodrag_data.mat similarity index 100% rename from OptimalControl/drag/nodrag_data.mat rename to OptimalControl/old/drag/nodrag_data.mat diff --git a/OptimalControl/nodrag/main_constraint_nodrag.m b/OptimalControl/old/nodrag/main_constraint_nodrag.m similarity index 100% rename from OptimalControl/nodrag/main_constraint_nodrag.m rename to OptimalControl/old/nodrag/main_constraint_nodrag.m diff --git a/OptimalControl/nodrag/nodrag_data.mat b/OptimalControl/old/nodrag/nodrag_data.mat similarity index 100% rename from OptimalControl/nodrag/nodrag_data.mat rename to OptimalControl/old/nodrag/nodrag_data.mat From ad8dc1126cbb4b344e23a49894073b3e50f486ea Mon Sep 17 00:00:00 2001 From: XaviPozo <168111392+XaviPozo@users.noreply.github.com> Date: Tue, 17 Jun 2025 01:01:24 +0200 Subject: [PATCH 18/22] Definitivo --- OptimalControl/TrapezoidalDynamics.m | 195 ++++++++++++++++++ .../drag y lift/main_constraint_draglift.m | 24 --- 2 files changed, 195 insertions(+), 24 deletions(-) create mode 100644 OptimalControl/TrapezoidalDynamics.m diff --git a/OptimalControl/TrapezoidalDynamics.m b/OptimalControl/TrapezoidalDynamics.m new file mode 100644 index 0000000000..7c35c4e5a8 --- /dev/null +++ b/OptimalControl/TrapezoidalDynamics.m @@ -0,0 +1,195 @@ +clc; clear; close all + +%% Physical parameters + +g = 9.81; % gravity [m/s^2] +rho = 1.225; % air density [kg/m^3] +Sw = 0.6; % aerodynamic surface [m^2] +Cd0 = 0.03; +m = 5; % mass [kg] +k = 0.05; +Clalpha = 0.1*360/(2*pi); +Cl0 = 0; + +%% Discretization + +N = 200; % number of nodes + +%% Initial state + +x1_0 = 0; x2_0 = 0; v0 = 15; gamma0 = deg2rad(30); +t0 = 0; % Initial time [s] +tf0 = 7; % Initial guess for final time [s] +alpha0 = deg2rad(5); % Initial guess for the angle of attack [rad] + +%% Control vector + +u0 = [tf0 alpha0*ones(1,N)]; + +%% Bounds for the control + +alpha_min = deg2rad(-10); +alpha_max = deg2rad(10); +tf_min = 0.1; +tf_max = 15; + +lb = [tf_min alpha_min*ones(1,N)]; % lower bound +ub = [tf_max alpha_max*ones(1,N)]; % upper bound + +%% Cost function: maximize range + +cost = @(u) f_cost(u, v0, gamma0, x1_0, x2_0, g, Cl0, Clalpha, Cd0, k, Sw, m, N, rho); + +%% Restrictions + +nonlcon_fun = @(u) nonlcon(u, v0, x1_0, x2_0, gamma0, g, Cl0, Clalpha, Cd0, k, Sw, m, N, rho); + +%% Optimization solver + +options = optimoptions('fmincon','Algorithm', 'interior-point', ... + 'TolCon', 1e-6,'Display', 'iter','MaxFunctionEvaluations',1e6, ... + 'ScaleProblem',true,'StepTolerance',1e-6,'MaxIter',2000); + +[u_opt, ~] = fmincon(cost, u0, [], [], [], [], lb, ub, nonlcon_fun, options); + +%% Final results + +tf = u_opt(1); +alpha = u_opt(2:N+1); +t_span = linspace(t0, tf, N); +dt = tf / (N-1); + +z = trapezoidal(tf, alpha, N, x1_0, x2_0, v0, gamma0, g, Cl0, Clalpha, Cd0, k, Sw, m, rho); % State vector solution +x = z(1,:); % Horizontal displacement [m] +y = z(2,:); % Vertical displacement [m] +v = z(3,:); % Velocity [m/s] +gamma = z(4,:); % Flight path angle [°] + +q = 0.5*rho.*v.^2; +Cl = Cl0+Clalpha.*alpha; +Cd = Cd0+k.*Cl.^2; +L = q.*Sw.*Cl; +D = q.*Sw.*Cd; + +disp(["Maximum distance [m] = ", num2str(x(end))]) +disp(["Final Time [s]: ", num2str(tf)]) + +[c_val, ceq_val] = nonlcon(u_opt, v0, x1_0, x2_0, gamma0, g, Cl0, Clalpha, Cd0, k, Sw, m, N, rho); +max_ineq = max(c_val); +final_eq = ceq_val; + +disp(['Max. violation of inequality constraint: ', num2str(max_ineq)]) +disp(['Violation of equality constraint y(tf)=0: ', num2str(final_eq)]) + +%% Postprocess + +% Optimal trajectory +figure +plot(x, y, 'LineWidth', 2,'DisplayName','Trajectory') +hold on +plot(x(1), y(1), 'go', 'MarkerSize', 7, 'MarkerFaceColor', 'g', 'DisplayName','Launch'); +plot(x(end),y(end),'ro', 'MarkerSize', 7, 'MarkerFaceColor','r','DisplayName','Impact'); +xlim([0 1.05*max(x)]) +ylim([min(0,1.05*min(y)) 1.05*max(y)]) +grid on; box on +xlabel('x [m]','Interpreter','latex') +ylabel('y [m]','Interpreter','latex') +title('Optimal trajectory','Interpreter','latex') +legend('Location','best') +set(gca,'FontSize',12) + +% Angle-of-attack profile +figure +stairs(t_span, rad2deg(alpha), 'Marker','o') +grid on; box on +xlim([0 t_span(end-1)]) +ylim([min(rad2deg(alpha))-2 max(rad2deg(alpha))+2]) +xlabel('Time [s]','Interpreter','latex') +ylabel('$\alpha$ [$^\circ$]','Interpreter','latex') +title('Angle of attack profile','Interpreter','latex') +set(gca,'FontSize',12) + +% Speed vs. time +figure +plot(t_span, v, 'LineWidth', 2) +grid on; +xlabel('Time [s]','Interpreter','latex') +ylabel('$v$ [m/s]','Interpreter','latex') +title('Velocity profile','Interpreter','latex') +set(gca,'FontSize',12) + +% Flight-path angle vs. time +figure +plot(t_span, rad2deg(gamma), 'LineWidth', 2) +grid on; box on +xlabel('Time [s]','Interpreter','latex') +ylabel('$\gamma$ [$^\circ$]','Interpreter','latex') +title('Flight path angle','Interpreter','latex') +set(gca,'FontSize',12) + +% Lift & Drag vs. time + +figure +plot(t_span, L,'DisplayName','Lift','LineWidth',2); +hold on +plot(t_span, D, 'DisplayName','Drag','LineWidth',2); +grid on; box on +xlabel('Time [s]','Interpreter','latex') +ylabel('Force [N]','Interpreter','latex') +title('Aerodynamic forces','Interpreter','latex') +legend('Location','best') +set(gca,'FontSize',12) + +%% ---------- FUNCTIONS ---------- + +function [J] = f_cost(u, v0, gamma0, x1_0, x2_0, g, Cl0, Clalpha, Cd0, k, Sw, m, N, rho) + tf = u(1); + alpha = u(2:N+1); + + y = trapezoidal(tf, alpha, N, x1_0, x2_0, v0, gamma0, g, Cl0, Clalpha, Cd0, k, Sw, m, rho); + J = -y(1,end); % maximize range +end + +function [c, ceq] = nonlcon(u, v0, x1_0, x2_0, gamma0, g, Cl0, Clalpha, Cd0, k, Sw, m, N, rho) + tf = u(1); + alpha = u(2:N+1); + y = trapezoidal(tf, alpha, N, x1_0, x2_0, v0, gamma0, g, Cl0, Clalpha, Cd0, k, Sw, m, rho); + c = -y(2,:); % y >= 0 + ceq = y(2,end); % y(tf) = 0 +end + +function y = trapezoidal(tf, alpha, N, x1_0, x2_0, v0, gamma0, g, Cl0, Clalpha, Cd0, k, Sw, m, rho) + t_span = linspace(0, tf, N); + dt = tf / (N-1); + y = zeros(4,N); + y(:,1) = [x1_0; x2_0; v0; gamma0]; + for i = 1:N-1 + ti = t_span(i); + alphai = alpha(i); + alphai1 = alpha(i+1); + yi = y(:,i); + + fi = dynamics_vector(ti, yi, alphai, g, Cl0, Clalpha, Cd0, k, Sw, m, rho); + y_pred = yi + dt*fi; + fi1 = dynamics_vector(t_span(i+1), y_pred, alphai1, g, Cl0, Clalpha, Cd0, k, Sw, m, rho); + y(:,i+1) = yi + (dt/2)*(fi + fi1); + end +end + +function dydt = dynamics_vector(~, y, alpha, g, Cl0, Clalpha, Cd0, k, Sw, m, rho) + v = y(3); + gamma = y(4); + + Cl = Cl0+Clalpha*alpha; + Cd = Cd0+k*Cl^2; + q = 0.5*rho*v^2; + D = q*Sw*Cd; + L = q*Sw*Cl; + + dydt = [ + v*cos(gamma); + v*sin(gamma); + -g*sin(gamma) - D/m; + -(g/v)*cos(gamma) + L/(m*v) + ]; +end diff --git a/OptimalControl/old/drag y lift/main_constraint_draglift.m b/OptimalControl/old/drag y lift/main_constraint_draglift.m index 8e5112c697..a0298f008a 100644 --- a/OptimalControl/old/drag y lift/main_constraint_draglift.m +++ b/OptimalControl/old/drag y lift/main_constraint_draglift.m @@ -57,30 +57,6 @@ 'FiniteDifferenceType', 'central', ... 'FiniteDifferenceStepSize', 1e-6); - % Antes de llamar a fmincon, tras definir u0, lb, ub, etc.: -t_nodes = linspace(t0, tf_guess, N); % nodos de control iniciales -% (en cada iteración de fmincon habrá que actualizar tf y volver a crear el interpolant; -% lo hacemos dentro de la función no-lineal y en f_cost) - -% Y definimos un interpolante cúbico: -alpha = @(t, alpha_vec, tf) ... - griddedInterpolant( ... - linspace(0,tf, numel(alpha_vec)), ... % vector de tiempo - [alpha_vec; alpha_vec(end)], ... % extiendo para t=tf - 'pchip', ... % shape-preserving spline - 'nearest' ... % extrapolación constante - ); - -% Luego, en tu función dynamics, en lugar de: -% t_span = linspace(0, tf, N); -% alpha = interp1(t_span, alpha_vec, t); -% -% harías algo como: -% -% F = alphaInterp(t, alpha_vec, tf); -% alpha = F(t); - - [u_opt, ~] = fmincon(cost, u0, [], [], [], [], lb, ub, nonlcon_fun, options); y0 = [x1_0 x2_0 v0 gamma0]; From cc0af42b6dc6d6280bde16f2fba5e8d88d5e4ffc Mon Sep 17 00:00:00 2001 From: XaviPozo <168111392+XaviPozo@users.noreply.github.com> Date: Thu, 19 Jun 2025 02:12:14 +0200 Subject: [PATCH 19/22] ENTREGAR --- .../{ => Drag and Lift}/DragAndLift.m | 0 .../{ => Drag and Lift}/TrapezoidalDynamics.m | 10 +- OptimalControl/Thrust/Thrust10.m | 234 ++++++++++++++++++ OptimalControl/Thrust/Thrust2_5.m | 230 +++++++++++++++++ 4 files changed, 470 insertions(+), 4 deletions(-) rename OptimalControl/{ => Drag and Lift}/DragAndLift.m (100%) rename OptimalControl/{ => Drag and Lift}/TrapezoidalDynamics.m (94%) create mode 100644 OptimalControl/Thrust/Thrust10.m create mode 100644 OptimalControl/Thrust/Thrust2_5.m diff --git a/OptimalControl/DragAndLift.m b/OptimalControl/Drag and Lift/DragAndLift.m similarity index 100% rename from OptimalControl/DragAndLift.m rename to OptimalControl/Drag and Lift/DragAndLift.m diff --git a/OptimalControl/TrapezoidalDynamics.m b/OptimalControl/Drag and Lift/TrapezoidalDynamics.m similarity index 94% rename from OptimalControl/TrapezoidalDynamics.m rename to OptimalControl/Drag and Lift/TrapezoidalDynamics.m index 7c35c4e5a8..8345ed455d 100644 --- a/OptimalControl/TrapezoidalDynamics.m +++ b/OptimalControl/Drag and Lift/TrapezoidalDynamics.m @@ -13,7 +13,7 @@ %% Discretization -N = 200; % number of nodes +N = 250; % number of nodes %% Initial state @@ -47,7 +47,7 @@ %% Optimization solver options = optimoptions('fmincon','Algorithm', 'interior-point', ... - 'TolCon', 1e-6,'Display', 'iter','MaxFunctionEvaluations',1e6, ... + 'TolCon', 1e-8,'Display', 'iter','MaxFunctionEvaluations',1e6, ... 'ScaleProblem',true,'StepTolerance',1e-6,'MaxIter',2000); [u_opt, ~] = fmincon(cost, u0, [], [], [], [], lb, ub, nonlcon_fun, options); @@ -81,6 +81,8 @@ disp(['Max. violation of inequality constraint: ', num2str(max_ineq)]) disp(['Violation of equality constraint y(tf)=0: ', num2str(final_eq)]) +validateGradient(u0, v0, gamma0, x1_0, x2_0, g, Cl0, Clalpha, Cd0, k, Sw, m, N, rho) + %% Postprocess % Optimal trajectory @@ -130,9 +132,9 @@ % Lift & Drag vs. time figure -plot(t_span, L,'DisplayName','Lift','LineWidth',2); +plot(t_span(1:end-1), L(1:end-1),'DisplayName','Lift','LineWidth',2); hold on -plot(t_span, D, 'DisplayName','Drag','LineWidth',2); +plot(t_span(1:end-1), D(1:end-1), 'DisplayName','Drag','LineWidth',2); grid on; box on xlabel('Time [s]','Interpreter','latex') ylabel('Force [N]','Interpreter','latex') diff --git a/OptimalControl/Thrust/Thrust10.m b/OptimalControl/Thrust/Thrust10.m new file mode 100644 index 0000000000..57772742bf --- /dev/null +++ b/OptimalControl/Thrust/Thrust10.m @@ -0,0 +1,234 @@ +clc; clear; close all + +%% Physical parameters + +g = 9.81; % gravity [m/s^2] +rho = 1.225; % air density [kg/m^3] +Sw = 0.6; % aerodynamic surface [m^2] +mstruct = 4.5; % structural mass [kg] +Cd0 = 0.03; +k = 0.05; +Clalpha = 0.1*360/(2*pi); +Cl0 = 0; + +%% Discretization + +N = 200; % number of nodes +% load("resultsN300.mat") +% u_opt300 = u_opt; clear u_opt +% alpha0 = interp1(linspace(0,u_opt300(1),300),u_opt300(2:301),linspace(0,u_opt300(1),N)); +% T0 = interp1(linspace(0,u_opt300(1),300),u_opt300(302:end),linspace(0,u_opt300(1),N)); + +%% Initial state + +x1_0 = 0; x2_0 = 0; v0 = 15; gamma0 = deg2rad(30); m0 = 5; +t0 = 0; % Initial time [s] +tf0 = 10; % Initial guess for final time [s] +alpha0 = deg2rad(5); % Initial guess for the angle of attack [rad] +T0 = 8; +mfuel = m0 - mstruct; % fuel mass [kg] + +%% Control vector + +u0 = [tf0 alpha0*ones(1,N) T0*ones(1,N)]; + +%% Bounds for the control + +alpha_min = deg2rad(-10); +alpha_max = deg2rad(10); +tf_min = 0.1; +tf_max = 15; +Tmin = 0; +Tmax = 10; + +lb = [tf_min alpha_min*ones(1,N) Tmin*ones(1,N)]; % lower bound +ub = [tf_max alpha_max*ones(1,N) Tmax*ones(1,N)]; % upper bound + +%% Cost function: maximize range + +cost = @(u) f_cost(u, v0, gamma0, x1_0, x2_0, g, Cl0, Clalpha, Cd0, k, Sw, N, m0, rho); + +%% Restrictions + +nonlcon_fun = @(u) nonlcon(u, v0, x1_0, x2_0, gamma0, g, Cl0, Clalpha, Cd0, k, Sw, N, m0, rho, mstruct); + +%% Optimization solver + +options = optimoptions('fmincon','Algorithm', 'interior-point', ... + 'TolCon', 1e-9,'Display', 'iter','MaxFunctionEvaluations',1e6, ... + 'ScaleProblem',true,'StepTolerance',1e-6,'MaxIter',2000); + +[u_opt, ~] = fmincon(cost, u0, [], [], [], [], lb, ub, nonlcon_fun, options); + +%% Final results + +tf = u_opt(1); +alpha = u_opt(2:N+1); +T = u_opt(N+2:end); +t_span = linspace(t0, tf, N); +dt = tf / (N-1); + +z = trapezoidal(tf, alpha, N, x1_0, x2_0, v0, gamma0, g, Cl0, Clalpha, Cd0, k, Sw, m0, rho, T); % State vector solution +x = z(1,:); % Horizontal displacement [m] +y = z(2,:); % Vertical displacement [m] +v = z(3,:); % Velocity [m/s] +gamma = z(4,:); % Flight path angle [°] +m = z(5,:); + +q = 0.5*rho.*v.^2; +Cl = Cl0+Clalpha.*alpha; +Cd = Cd0+k.*Cl.^2; +L = q.*Sw.*Cl; +D = q.*Sw.*Cd; + +disp(["Maximum distance [m] = ", num2str(x(end))]) +disp(["Final Time [s]: ", num2str(tf)]) + +[c_val, ceq_val] = nonlcon(u_opt, v0, x1_0, x2_0, gamma0, g, Cl0, Clalpha, Cd0, k, Sw, N, m0, rho, mstruct); +max_ineq = max(c_val); +final_eq = ceq_val; + +%disp(['Max. violation of inequality constraint: ', num2str(max_ineq)]) +%disp(['Violation of equality constraint y(tf)=0: ', num2str(final_eq)]) + +%% Postprocess + +% Optimal trajectory +figure +%plot(x, y, 'LineWidth', 5,'DisplayName','Trajectory','HandleVisibility','off') +hold on +plot(x(1), y(1), 'go', 'MarkerSize', 7, 'MarkerFaceColor', 'g', 'DisplayName','Launch'); +plot(x(end),y(end),'ro', 'MarkerSize', 7, 'MarkerFaceColor','r','DisplayName','Impact'); +xlim([0 1.05*max(x)]) +ylim([min(0,1.05*min(y)) 1.05*max(y)]) +grid on; box on +xlabel('x [m]','Interpreter','latex') +ylabel('y [m]','Interpreter','latex') +title('Optimal trajectory','Interpreter','latex') +legend('Location','best') +set(gca,'FontSize',12) +patch([x NaN], [y NaN], [T NaN],'EdgeColor','interp', 'LineWidth', 4, ... + 'FaceColor','none','HandleVisibility','off'); +colormap("turbo") +c = colorbar; +c.Label.String = 'Thrust [N]'; + +% Angle-of-attack profile +figure +stairs(t_span, rad2deg(alpha), 'Marker','o') +grid on; box on +xlim([0 t_span(end-1)]) +ylim([min(rad2deg(alpha))-2 max(rad2deg(alpha))+2]) +xlabel('Time [s]','Interpreter','latex') +ylabel('$\alpha$ [$^\circ$]','Interpreter','latex') +title('Angle of attack profile','Interpreter','latex') +set(gca,'FontSize',12) + +% Speed vs. time +figure +plot(t_span, v, 'LineWidth', 2) +grid on; +xlabel('Time [s]','Interpreter','latex') +ylabel('$v$ [m/s]','Interpreter','latex') +title('Velocity profile','Interpreter','latex') +set(gca,'FontSize',12) + +% Flight-path angle vs. time +figure +plot(t_span(1:end-1), rad2deg(gamma(1:end-1)), 'LineWidth', 2) +grid on; box on +xlabel('Time [s]','Interpreter','latex') +ylabel('$\gamma$ [$^\circ$]','Interpreter','latex') +title('Flight path angle','Interpreter','latex') +set(gca,'FontSize',12) + +% Lift & Drag vs. time + +figure +plot(t_span(1:end-1), L(1:end-1),'DisplayName','Lift','LineWidth',2); +hold on +plot(t_span(1:end-1), D(1:end-1), 'DisplayName','Drag','LineWidth',2); +grid on; box on +xlabel('Time [s]','Interpreter','latex') +ylabel('Force [N]','Interpreter','latex') +title('Aerodynamic forces','Interpreter','latex') +legend('Location','best') +set(gca,'FontSize',12) + +% Thrust vs. time + +figure +plot(t_span,T,'DisplayName','Thrust','LineWidth',2) +grid on +xlabel('Time [s]','Interpreter','latex') +ylabel('Thrust [N]','Interpreter','latex') +title('Thrust profile','Interpreter','latex') + +% Mass vs. time + +figure +plot(t_span, m,'LineWidth',2) +grid on +xlabel('Time [s]','Interpreter','latex') +ylabel('Thrust [N]','Interpreter','latex') +title('Mass over time','Interpreter','latex') + +%% ---------- FUNCTIONS ---------- + +function [J] = f_cost(u, v0, gamma0, x1_0, x2_0, g, Cl0, Clalpha, Cd0, k, Sw, N, m0, rho) + tf = u(1); + alpha = u(2:N+1); + T = u(N+2:end); + + y = trapezoidal(tf, alpha, N, x1_0, x2_0, v0, gamma0, g, Cl0, Clalpha, Cd0, k, Sw, m0, rho, T); + J = -y(1,end); % maximize range +end + +function [c, ceq] = nonlcon(u, v0, x1_0, x2_0, gamma0, g, Cl0, Clalpha, Cd0, k, Sw, N, m0, rho, mstruct) + tf = u(1); + alpha = u(2:N+1); + T = u(N+2:end); + y = trapezoidal(tf, alpha, N, x1_0, x2_0, v0, gamma0, g, Cl0, Clalpha, Cd0, k, Sw, m0, rho, T); + c = [-y(2,:); mstruct-y(5,:)]; % y >= 0 + ceq = [y(2,end); y(5,end)-mstruct]; % y(tf) = 0 +end + +function y = trapezoidal(tf, alpha, N, x1_0, x2_0, v0, gamma0, g, Cl0, Clalpha, Cd0, k, Sw, m0, rho, T) + t_span = linspace(0, tf, N); + dt = tf / (N-1); + y = zeros(5,N); + y(:,1) = [x1_0; x2_0; v0; gamma0; m0]; + for i = 1:N-1 + ti = t_span(i); + alphai = alpha(i); + alphai1 = alpha(i+1); + Ti = T(i); + Ti1 = T(i+1); + yi = y(:,i); + + fi = dynamics_vector(ti, yi, alphai, g, Cl0, Clalpha, Cd0, k, Sw, rho, Ti); + y_pred = yi + dt*fi; + fi1 = dynamics_vector(t_span(i+1), y_pred, alphai1, g, Cl0, Clalpha, Cd0, k, Sw, rho, Ti1); + y(:,i+1) = yi + (dt/2)*(fi + fi1); + end +end + +function dydt = dynamics_vector(~, y, alpha, g, Cl0, Clalpha, Cd0, k, Sw, rho, T) + v = y(3); + gamma = y(4); + m = y(5); + + Cl = Cl0+Clalpha*alpha; + Cd = Cd0+k*Cl^2; + q = 0.5*rho*v^2; + D = q*Sw*Cd; + L = q*Sw*Cl; + + dydt = [ + v*cos(gamma); + v*sin(gamma); + -g*sin(gamma) - D/m + T/m; + -(g/v)*cos(gamma) + L/(m*v); + -T/20; + ]; +end diff --git a/OptimalControl/Thrust/Thrust2_5.m b/OptimalControl/Thrust/Thrust2_5.m new file mode 100644 index 0000000000..da2597b9e5 --- /dev/null +++ b/OptimalControl/Thrust/Thrust2_5.m @@ -0,0 +1,230 @@ +clc; clear; close all + +%% Physical parameters + +g = 9.81; % gravity [m/s^2] +rho = 1.225; % air density [kg/m^3] +Sw = 0.6; % aerodynamic surface [m^2] +mstruct = 4.5; % structural mass [kg] +Cd0 = 0.03; +k = 0.05; +Clalpha = 0.1*360/(2*pi); +Cl0 = 0; + +%% Discretization + +N = 250; % number of nodes + +%% Initial state + +x1_0 = 0; x2_0 = 0; v0 = 15; gamma0 = deg2rad(30); m0 = 5; +t0 = 0; % Initial time [s] +tf0 = 10; % Initial guess for final time [s] +alpha0 = deg2rad(5); % Initial guess for the angle of attack [rad] +T0 = 2; +mfuel = m0 - mstruct; % fuel mass [kg] + +%% Control vector + +u0 = [tf0 alpha0*ones(1,N) T0*ones(1,N)]; + +%% Bounds for the control + +alpha_min = deg2rad(-10); +alpha_max = deg2rad(10); +tf_min = 0.1; +tf_max = 15; +Tmin = 0; +Tmax = 2.5; + +lb = [tf_min alpha_min*ones(1,N) Tmin*ones(1,N)]; % lower bound +ub = [tf_max alpha_max*ones(1,N) Tmax*ones(1,N)]; % upper bound + +%% Cost function: maximize range + +cost = @(u) f_cost(u, v0, gamma0, x1_0, x2_0, g, Cl0, Clalpha, Cd0, k, Sw, N, m0, rho); + +%% Restrictions + +nonlcon_fun = @(u) nonlcon(u, v0, x1_0, x2_0, gamma0, g, Cl0, Clalpha, Cd0, k, Sw, N, m0, rho, mstruct); + +%% Optimization solver + +options = optimoptions('fmincon','Algorithm', 'interior-point', ... + 'TolCon', 1e-9,'Display', 'iter','MaxFunctionEvaluations',1e6, ... + 'ScaleProblem',true,'StepTolerance',1e-6,'MaxIter',2000); + +[u_opt, ~] = fmincon(cost, u0, [], [], [], [], lb, ub, nonlcon_fun, options); + +%% Final results + +tf = u_opt(1); +alpha = u_opt(2:N+1); +T = u_opt(N+2:end); +t_span = linspace(t0, tf, N); +dt = tf / (N-1); + +z = trapezoidal(tf, alpha, N, x1_0, x2_0, v0, gamma0, g, Cl0, Clalpha, Cd0, k, Sw, m0, rho, T); % State vector solution +x = z(1,:); % Horizontal displacement [m] +y = z(2,:); % Vertical displacement [m] +v = z(3,:); % Velocity [m/s] +gamma = z(4,:); % Flight path angle [°] +m = z(5,:); + +q = 0.5*rho.*v.^2; +Cl = Cl0+Clalpha.*alpha; +Cd = Cd0+k.*Cl.^2; +L = q.*Sw.*Cl; +D = q.*Sw.*Cd; + +disp(["Maximum distance [m] = ", num2str(x(end))]) +disp(["Final Time [s]: ", num2str(tf)]) + +[c_val, ceq_val] = nonlcon(u_opt, v0, x1_0, x2_0, gamma0, g, Cl0, Clalpha, Cd0, k, Sw, N, m0, rho, mstruct); +max_ineq = max(c_val); +final_eq = ceq_val; + +%disp(['Max. violation of inequality constraint: ', num2str(max_ineq)]) +%disp(['Violation of equality constraint y(tf)=0: ', num2str(final_eq)]) + +%% Postprocess + +% Optimal trajectory +figure +%plot(x, y, 'LineWidth', 5,'DisplayName','Trajectory','HandleVisibility','off') +hold on +plot(x(1), y(1), 'go', 'MarkerSize', 7, 'MarkerFaceColor', 'g', 'DisplayName','Launch'); +plot(x(end),y(end),'ro', 'MarkerSize', 7, 'MarkerFaceColor','r','DisplayName','Impact'); +xlim([0 1.05*max(x)]) +ylim([min(0,1.05*min(y)) 1.05*max(y)]) +grid on; box on +xlabel('x [m]','Interpreter','latex') +ylabel('y [m]','Interpreter','latex') +title('Optimal trajectory','Interpreter','latex') +legend('Location','best') +set(gca,'FontSize',12) +patch([x NaN], [y NaN], [T NaN],'EdgeColor','interp', 'LineWidth', 4, ... + 'FaceColor','none','HandleVisibility','off'); +colormap("turbo") +c = colorbar; +c.Label.String = 'Thrust [N]'; + +% Angle-of-attack profile +figure +stairs(t_span, rad2deg(alpha), 'Marker','o') +grid on; box on +xlim([0 t_span(end-1)]) +ylim([min(rad2deg(alpha))-2 max(rad2deg(alpha))+2]) +xlabel('Time [s]','Interpreter','latex') +ylabel('$\alpha$ [$^\circ$]','Interpreter','latex') +title('Angle of attack profile','Interpreter','latex') +set(gca,'FontSize',12) + +% Speed vs. time +figure +plot(t_span, v, 'LineWidth', 2) +grid on; +xlabel('Time [s]','Interpreter','latex') +ylabel('$v$ [m/s]','Interpreter','latex') +title('Velocity profile','Interpreter','latex') +set(gca,'FontSize',12) + +% Flight-path angle vs. time +figure +plot(t_span(1:end-1), rad2deg(gamma(1:end-1)), 'LineWidth', 2) +grid on; box on +xlabel('Time [s]','Interpreter','latex') +ylabel('$\gamma$ [$^\circ$]','Interpreter','latex') +title('Flight path angle','Interpreter','latex') +set(gca,'FontSize',12) + +% Lift & Drag vs. time + +figure +plot(t_span(1:end-1), L(1:end-1),'DisplayName','Lift','LineWidth',2); +hold on +plot(t_span(1:end-1), D(1:end-1), 'DisplayName','Drag','LineWidth',2); +grid on; box on +xlabel('Time [s]','Interpreter','latex') +ylabel('Force [N]','Interpreter','latex') +title('Aerodynamic forces','Interpreter','latex') +legend('Location','best') +set(gca,'FontSize',12) + +% Thrust vs. time + +figure +plot(t_span,T,'DisplayName','Thrust','LineWidth',2) +grid on +xlabel('Time [s]','Interpreter','latex') +ylabel('Thrust [N]','Interpreter','latex') +title('Thrust profile','Interpreter','latex') + +% Mass vs. time + +figure +plot(t_span, m,'LineWidth',2) +grid on +xlabel('Time [s]','Interpreter','latex') +ylabel('Thrust [N]','Interpreter','latex') +title('Mass over time','Interpreter','latex') + +%% ---------- FUNCTIONS ---------- + +function [J] = f_cost(u, v0, gamma0, x1_0, x2_0, g, Cl0, Clalpha, Cd0, k, Sw, N, m0, rho) + tf = u(1); + alpha = u(2:N+1); + T = u(N+2:end); + + y = trapezoidal(tf, alpha, N, x1_0, x2_0, v0, gamma0, g, Cl0, Clalpha, Cd0, k, Sw, m0, rho, T); + J = -y(1,end); % maximize range +end + +function [c, ceq] = nonlcon(u, v0, x1_0, x2_0, gamma0, g, Cl0, Clalpha, Cd0, k, Sw, N, m0, rho, mstruct) + tf = u(1); + alpha = u(2:N+1); + T = u(N+2:end); + y = trapezoidal(tf, alpha, N, x1_0, x2_0, v0, gamma0, g, Cl0, Clalpha, Cd0, k, Sw, m0, rho, T); + c = [-y(2,:); mstruct-y(5,:)]; % y >= 0 + ceq = [y(2,end); y(5,end)-mstruct]; % y(tf) = 0 +end + +function y = trapezoidal(tf, alpha, N, x1_0, x2_0, v0, gamma0, g, Cl0, Clalpha, Cd0, k, Sw, m0, rho, T) + t_span = linspace(0, tf, N); + dt = tf / (N-1); + y = zeros(5,N); + y(:,1) = [x1_0; x2_0; v0; gamma0; m0]; + for i = 1:N-1 + ti = t_span(i); + alphai = alpha(i); + alphai1 = alpha(i+1); + Ti = T(i); + Ti1 = T(i+1); + yi = y(:,i); + + fi = dynamics_vector(ti, yi, alphai, g, Cl0, Clalpha, Cd0, k, Sw, rho, Ti); + y_pred = yi + dt*fi; + fi1 = dynamics_vector(t_span(i+1), y_pred, alphai1, g, Cl0, Clalpha, Cd0, k, Sw, rho, Ti1); + y(:,i+1) = yi + (dt/2)*(fi + fi1); + end +end + +function dydt = dynamics_vector(~, y, alpha, g, Cl0, Clalpha, Cd0, k, Sw, rho, T) + v = y(3); + gamma = y(4); + m = y(5); + + Cl = Cl0+Clalpha*alpha; + Cd = Cd0+k*Cl^2; + q = 0.5*rho*v^2; + D = q*Sw*Cd; + L = q*Sw*Cl; + + dydt = [ + v*cos(gamma); + v*sin(gamma); + -g*sin(gamma) - D/m + T/m; + -(g/v)*cos(gamma) + L/(m*v); + -T/20; + ]; +end From 81016bb7aae3b418472165ebf9e93411361c70e1 Mon Sep 17 00:00:00 2001 From: FerrerFerreAlex <32134913+FerrerFerreAlex@users.noreply.github.com> Date: Fri, 20 Jun 2025 08:43:24 +0200 Subject: [PATCH 20/22] Update main_constraint_drag.m --- .../old/drag pruebas/main_constraint_drag.m | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/OptimalControl/old/drag pruebas/main_constraint_drag.m b/OptimalControl/old/drag pruebas/main_constraint_drag.m index 967f019cc9..b2117f3391 100644 --- a/OptimalControl/old/drag pruebas/main_constraint_drag.m +++ b/OptimalControl/old/drag pruebas/main_constraint_drag.m @@ -103,11 +103,12 @@ y0 = [x1_0 x2_0 v0 gamma0]; tf = u(1); alpha = u(2:N+1); - t_span = linspace(t0, tf, N); - [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, D, N, m), t_span, y0); + t_span = linspace(t0, tf, N); + f = @(t,y,alpha) dynamics(t, y, alpha, g, D, m); + [~, y] = ode45(f, t_span, y0,alpha); J = -y(end,1); - dydt_final = dynamics(tf, y(end,:)', tf, alpha, g, D, N, m); + dydt_final = dynamics(tf, y(end,:)', alpha, g, D, m); pT = [1 0 0 0]; [~, p] = ode45(@(t, p) adjoint(t, p, y, g, t_span, alpha, dDdv, m), flip(t_span), pT); @@ -125,15 +126,34 @@ end end +function y = trapezoidal(f,t_span, y0, alpha) + dt = tf / (N-1); + y = zeros(4,N); + y(:,1) = y0; + for i = 1:N-1 + ti = t_span(i); + ti1 = t_span(i+1); + alphai = alpha(i); + alphai1 = alpha(i+1); + yi = y(:,i); + + fi = f(ti, yi,alphai); + y_pred = yi + dt*fi; + fi1 = f(ti1, y_pred, alphai1); + y(:,i+1) = yi + (dt/2)*(fi + fi1); + end +end + + function [ceq, Dceq] = groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, dDdv, dDda, N, m) y0 = [x1_0 x2_0 v0 gamma0]'; tf = u(1); t_span = linspace(t0, tf, N); alpha = u(2:N+1); - [~, y] = ode45(@(t, y) dynamics(t, y, tf, alpha, g, D, N, m), t_span, y0); + [~, y] = ode45(@(t, y,alpha) dynamics(t, y,alpha, g, D, m), t_span, y0,alpha); ceq = y(end,2); - dydt_final = dynamics(t_span(end), y(end,:)', tf, alpha, g, D, N, m); + dydt_final = dynamics(t_span(end), y(end,:)', alpha, g, D, m); pT = [0 -1 0 0]; [~, p] = ode45(@(t, p) adjoint(t, p, y, g, t_span, alpha, dDdv, m), flip(t_span), pT); @@ -164,15 +184,16 @@ dpdt = -J*p; end -function dydt = dynamics(t, y, tf, alpha, g, D, N, m) + +function dydt = dynamics(t, y, alpha, g, D, m) v = y(3); gamma = y(4); - t_span = linspace(0, tf, N); + % t_span = linspace(0, tf, N); % ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; % alpha = alpha(ind); - alpha = interp1(t_span, alpha, t); + % alpha = interp1(t_span, alpha, t); dydt = [ v*cos(gamma); From 15d2aeecf4a1d7c399084e20d42647edb3b3773e Mon Sep 17 00:00:00 2001 From: FerrerFerreAlex <32134913+FerrerFerreAlex@users.noreply.github.com> Date: Fri, 20 Jun 2025 16:46:49 +0200 Subject: [PATCH 21/22] Update main_constraint_drag.m --- .../old/drag pruebas/main_constraint_drag.m | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/OptimalControl/old/drag pruebas/main_constraint_drag.m b/OptimalControl/old/drag pruebas/main_constraint_drag.m index b2117f3391..0cc25971d8 100644 --- a/OptimalControl/old/drag pruebas/main_constraint_drag.m +++ b/OptimalControl/old/drag pruebas/main_constraint_drag.m @@ -37,11 +37,12 @@ dDdv = @(V,alpha) rho*Sw*V.*Cd(alpha); % Derivative respect to velocity - cost = @(u) f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D, dDda, dDdv, N, m); + y0 = [x1_0 x2_0 v0 gamma0]; + cost = @(u) f_cost(u, g, t0, y0, D, dDda, dDdv, N, m); constraint = @(u) groundConstraint(u, g, t0, v0, x1_0, x2_0, gamma0, D, dDda, dDdv, N, m); - [valid,err] = checkGradients(cost, u0, 'Tolerance', 1e-3, 'Display', 'on'); - assignin('base', 'err', err); +% [valid,err] = checkGradients(cost, u0, 'Tolerance', 1e-3, 'Display', 'on'); +% assignin('base', 'err', err); %[valid2,err2] = checkGradients(constraint, u0, 'Tolerance', 1e-3, 'Display', 'on') %assignin('base', 'err2', err2); @@ -54,7 +55,9 @@ y0 = [x1_0 x2_0 v0 gamma0]; t_span = linspace(t0, u_opt(1), N); - [~, y] = ode45(@(t, y) dynamics(t, y, tf, u_opt(2:N+1), g, D, N, m), t_span, y0); + alpha = u_opt(2:N+1); + f = @(t,y,alpha) dynamics(t, y, alpha, g, D, m); + [~, y] = trapezoidal(f, t_span, y0,alpha); disp(["Maximum distance [m] = ", num2str(y(end, 1))]) disp(["Initial angle [°]: ", num2str(rad2deg(u_opt(2)))]) @@ -99,19 +102,19 @@ [ceq, Dceq] = constraint(u); end -function [J, gradJ] = f_cost(u, g, t0, v0, gamma0, x1_0, x2_0, D, dDdv, dDda, N, m) - y0 = [x1_0 x2_0 v0 gamma0]; +function [J, gradJ] = f_cost(u, g, t0, y0, D, dDdv, dDda, N, m) tf = u(1); alpha = u(2:N+1); t_span = linspace(t0, tf, N); f = @(t,y,alpha) dynamics(t, y, alpha, g, D, m); - [~, y] = ode45(f, t_span, y0,alpha); + [~, y] = trapezoidal(f, t_span, y0,alpha); J = -y(end,1); - dydt_final = dynamics(tf, y(end,:)', alpha, g, D, m); + dydt_final = dynamics(tf, y(end,:), alpha(end), g, D, m); pT = [1 0 0 0]; - [~, p] = ode45(@(t, p) adjoint(t, p, y, g, t_span, alpha, dDdv, m), flip(t_span), pT); + dp = @(t,p,alpha) adjoint(t, p, y, g, alpha, dDdv, m); + [~, p] = trapezoidal(dp, flip(t_span), pT,alpha); % ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; % v = y(ind,3); @@ -126,8 +129,9 @@ end end -function y = trapezoidal(f,t_span, y0, alpha) - dt = tf / (N-1); +function [t_span,y] = trapezoidal(f,t_span, y0, alpha) + N = length(t_span); + dt = (t_span(end)-t_span(1)) / (N-1); y = zeros(4,N); y(:,1) = y0; for i = 1:N-1 @@ -136,12 +140,12 @@ alphai = alpha(i); alphai1 = alpha(i+1); yi = y(:,i); - fi = f(ti, yi,alphai); y_pred = yi + dt*fi; fi1 = f(ti1, y_pred, alphai1); y(:,i+1) = yi + (dt/2)*(fi + fi1); end + y = y'; end @@ -150,14 +154,15 @@ tf = u(1); t_span = linspace(t0, tf, N); alpha = u(2:N+1); - [~, y] = ode45(@(t, y,alpha) dynamics(t, y,alpha, g, D, m), t_span, y0,alpha); + [~, y] = trapezoidal(@(t, y,alpha) dynamics(t, y,alpha, g, D, m), t_span, y0,alpha); ceq = y(end,2); - dydt_final = dynamics(t_span(end), y(end,:)', alpha, g, D, m); + dydt_final = dynamics(t_span(end), y(end,:), alpha(end), g, D, m); pT = [0 -1 0 0]; - [~, p] = ode45(@(t, p) adjoint(t, p, y, g, t_span, alpha, dDdv, m), flip(t_span), pT); - + dp = @(t,p,alpha) adjoint(t, p, y, g, alpha, dDdv, m); + [~, p] = trapezoidal(dp, flip(t_span), pT,alpha); + % v = interp1(t_span, y(:,3), t); % ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; % v = y(ind,3); @@ -165,12 +170,16 @@ DFdu = -dDda(v,alpha'); Dceq = [dydt_final(2); DFdu.*p(:,3)]; + c = []; + dc = []; end -function dpdt = adjoint(t, p, y, g, t_span, alpha, dDdv, m) - v = interp1(t_span, y(:,3), t); - gamma = interp1(t_span, y(:,4), t); - alpha = interp1(t_span, alpha, t); +function dpdt = adjoint(t, p, y, g, alpha, dDdv, m) + v = y(3); + gamma = y(4); + % v = interp1(t_span, y(:,3), t); + % gamma = interp1(t_span, y(:,4), t); + % alpha = interp1(t_span, alpha, t); % ind = round((t - t_span(1)) / (t_span(2) - t_span(1))) + 1; % v = y(ind,3); @@ -195,8 +204,7 @@ % alpha = interp1(t_span, alpha, t); - dydt = [ - v*cos(gamma); + dydt = [v*cos(gamma); v*sin(gamma); -g*sin(gamma)-D(v,alpha)/m; -(g/v)*cos(gamma) From 597b36c80e77379d34c906176cc5d6f91c29e5b4 Mon Sep 17 00:00:00 2001 From: FerrerFerreAlex <32134913+FerrerFerreAlex@users.noreply.github.com> Date: Wed, 9 Jul 2025 08:36:31 +0200 Subject: [PATCH 22/22] Update DragAndLift.m --- OptimalControl/DragAndLift.m | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/OptimalControl/DragAndLift.m b/OptimalControl/DragAndLift.m index fcf999d8c5..e8c151d2ba 100644 --- a/OptimalControl/DragAndLift.m +++ b/OptimalControl/DragAndLift.m @@ -176,9 +176,26 @@ % Inequality constraint: y_i ≥ 0 c = -y; + + % Optimal trajectory +figure(100) +plot(x, y, 'LineWidth', 2,'DisplayName','Trajectory') +hold on +plot(x(1), y(1), 'go', 'MarkerSize', 7, 'MarkerFaceColor', 'g', 'DisplayName','Launch'); +plot(x(end),y(end),'ro', 'MarkerSize', 7, 'MarkerFaceColor','r','DisplayName','Impact'); +xlim([0 1.05*max(x)+0.01]) +ylim([min(0,1.05*min(y)) 1.05*max(y)]) +grid on; box on +xlabel('x [m]','Interpreter','latex') +ylabel('y [m]','Interpreter','latex') +title('Optimal trajectory','Interpreter','latex') +legend('Location','best') +set(gca,'FontSize',12) +hold off + end -function [dx, dy, dv, dgamma] = dynamics(~, y, v, gamma, alpha, rho, S, Cd0, k, Cl0, Clalpha, m, g) +function [dx, dy, dv, dgamma] = dynamics(x, y, v, gamma, alpha, rho, S, Cd0, k, Cl0, Clalpha, m, g) Cl = Cl0+Clalpha*alpha; Cd = Cd0+k* Cl^2; q = 0.5*rho*v^2; @@ -189,4 +206,5 @@ dy = v*sin(gamma); dv = -D/m-g*sin(gamma); dgamma = L/(m*v)-g*cos(gamma)/v; + end