CasADi is a symbolic framework for numeric optimization implementing automatic differentiation in forward and reverse modes on sparse matrix-valued computational graphs. It supports self-contained C-code generation and interfaces state-of-the-art codes such as SUNDIALS, IPOPT etc. It can be used from C++, Python or Matlab/Octave.
import casadi.*
T = 10; % Time horizon
N = 2; % number of control intervals
F = @(x,u) x;
opti = casadi.Opti();
x = opti.variable(2,N+1);
u = opti.variable(1,N);
opti.minimize(sumsqr(x));
for k=1:N
opti.subject_to(x(:,k+1)==F(x(:,k),u(:,k)));
end
opti.subject_to(-1<=u<=1);
p = opti.parameter(2);
opti.subject_to(x(:,1)==p);
opti.solver('sqpmethod',struct('qpsol','qrqp'));
opti.set_value(p,[0;1]);
sol = opti.solve();
res = to_function(opti);
x = res.x;
M = casadi.Function('M',{p},{x(2*(N+1)+1)});
M.generate('Mc',struct('mex',true,'main',true));
mex Mc.c -largeArrayDims
Mc('M',[-1;-1])