Code covered by the BSD License  

Highlights from
fminconSym

from fminconSym by Yi Cao
A wrap of fmincon to get gradient

[v1,v2,v3,v4,v5,v6,v7]=fminconSym(fun,x0,A,B,Aeq,Beq,LB,UB,nonlcon,opt,varargin)
function [v1,v2,v3,v4,v5,v6,v7]=fminconSym(fun,x0,A,B,Aeq,Beq,LB,UB,nonlcon,opt,varargin)
% FMINCONSYM   A wrap of fmincon to use the symbolic toolbox to provide gradient.
% Limitation: The cost function and nonlinear constraint function cannot
% have conditional operation, such as if, max, min etc.
% Its usage is the same as the original fmincon.
%
% Example: see fminconSym_example
%
% By Yi Cao, Cranfield University, 25/09/2007
%
n=numel(x0);
x=[];
for k=1:n
    eval(['syms x' num2str(k)]);
    eval(['x=[x;x' num2str(k) '];']);
end
if isempty(varargin)
    F=feval(fun,x);
    [C,Ceq]=feval(nonlcon,x);
else
    F=feval(fun,x,varargin);
    [C,Ceq]=feval(nonlcon,x,varargin);
end    
Fx=jacobian(F,x);
if ~isempty(C)
    Cx=jacobian(C,x);
else
    Cx=[];
end
if ~isempty(Ceq)
    Ceqx=jacobian(Ceq,x);
else
    Ceqx=[];
end
opt = optimset(opt,'GradObj','on','GradConstr','on');
[v1,v2,v3,v4,v5,v6,v7]=fmincon(@symFun,x0,A,B,Aeq,Beq,LB,UB,@symConstr,opt,F,Fx,C,Ceq,Cx,Ceqx);

function [cost,grad]=symFun(x0,varargin)
n=numel(x0);
for k=1:n
    eval(['x' num2str(k) '=x0(k);']);
end
cost = eval(varargin{1});
if nargout>1
    grad  = eval(varargin{2});
end

function [c,ceq,cx,ceqx]=symConstr(x0,varargin)
n=numel(x0);
for k=1:n
    eval(['x' num2str(k) '=x0(k);']);
end
if ~isempty(varargin{3})
    c = eval(varargin{3});
else
    c=[];
end
if ~isempty(varargin{4})
    ceq = eval(varargin{4});
else
    ceq=[];
end
if nargout>2
    if ~isempty(c)
        cx  = eval(varargin{5})';
    else
        cx=[];
    end
    if ~isempty(ceq)
        ceqx  = eval(varargin{6})';
    else
        ceqx=[];
    end
end

Contact us at files@mathworks.com