No BSD License  

Highlights from
GPOPS

from GPOPS by Camila Francolin
Solves multiple phase optimal control problems.

gpopsObjandCons(x)
function C = gpopsObjandCons(x)
%------------------------------------------------------------------%
% Compute the nonlinear constraints and objective function         %
%------------------------------------------------------------------%
% GPOPS Copyright (c) Anil V. Rao, Geoffrey T. Huntington, David   %
% Benson, Michael Patterson, Christopher Darby, & Camila Francolin %
%------------------------------------------------------------------%

global mysetup;

Cons = cell(mysetup.numphases,1);
endpoint_info = cell(mysetup.numphases,5);
Cost = 0;
for i=1:mysetup.numphases
    xcurr = x(mysetup.variable_indices{i});
    nstates = mysetup.sizes(i,1);
    ncontrols = mysetup.sizes(i,2);
    % nparameters = mysetup.sizes(i,3);
    % npaths = mysetup.sizes(i,4);
    nevents = mysetup.sizes(i,5);
    t0 = xcurr(mysetup.indices(i).time(1));
    tf = xcurr(mysetup.indices(i).time(2));
    state_vector = xcurr(mysetup.indices(i).states);
    control_vector = xcurr(mysetup.indices(i).controls);
    tau_all = [-1; mysetup.ps{i,2}; 1];
    t_all = (tf-t0)*(tau_all+1)/2+t0;
    t_gauss = t_all(2:end-1);
    state_matrix = reshape(state_vector,mysetup.nodes(i)+2,nstates);
    state_gauss = state_matrix(2:end-1,:);
    x0 = state_matrix(1,:);
    xf = state_matrix(end,:);
    control_gauss = reshape(control_vector,mysetup.nodes(i),ncontrols);
    parameters = xcurr(mysetup.indices(i).parameters);
    dae_use = {t_gauss,state_gauss,control_gauss,parameters};
    endpoint_use = {t0,x0.',tf,xf.',parameters};
    dae_out = feval(mysetup.funcs{2},dae_use,i);
    odelhs  = mysetup.ps{i,4}*state_matrix(1:mysetup.nodes(i)+1,:);
    oderhs  = (tf-t0)*dae_out(:,1:nstates)/2;
    paths   = dae_out(:,nstates+1:end);
    ode_defects = odelhs-oderhs;
    quad_defects = zeros(size(xf));
    defects = [ode_defects; quad_defects];
    if nevents>0,
        events = feval(mysetup.funcs{3},endpoint_use,i);
    else
        events = [];
    end;
    endpoint_info(i,:) = endpoint_use;
    Cons{i,1} = [defects(:); paths(:); events];
    cost_use(1,:) = {t0,x0.',tf,xf.'};
    cost_use(2,:) = {t_gauss,state_gauss,control_gauss,parameters};
    [Mayer,Lagrange] = feval(mysetup.funcs{1},cost_use,i);
    integrand = (tf-t0)*mysetup.ps{i,3}*Lagrange/2;
    Cost = Cost + Mayer + integrand;
end;
Constraints = vertcat(Cons{:,1});
if ~isempty(mysetup.connections),
    link_out = cell(mysetup.numconnections,1);
    for i=1:mysetup.numconnections;
    	left_phase  = mysetup.connections{i,3}(1);
        right_phase = mysetup.connections{i,3}(2);
        xf_left = endpoint_info{left_phase,4};
        p_left  = endpoint_info{left_phase,5};
        x0_right = endpoint_info{right_phase,2};
        p_right  = endpoint_info{right_phase,5};
        link_info = {xf_left,p_left,x0_right,p_right};
        link_out{i,1} = feval(mysetup.funcs{4},link_info,left_phase,right_phase);
    end;
    Clink = vertcat(link_out{:,1});
    Constraints = [Constraints; Clink];
end;
% Combine the Constraints with the Cost Function
C = [Cost; Constraints; mysetup.initlincons];

Contact us at files@mathworks.com