Fmincon objective and nlcon shared simulink parameters

3 views (last 30 days)
I'm trying to minimize a function of my vector X which is the input of my simulink model.
Right now i'm doing:
X=fmincon(@(X)objective,x0,A,B,Aeq,Beq,@(X)nonlcon,options)
function [f,gradf]=objective(X,simulation_param,Tfinal)
T=(0:1:Tfinal)';
TIN=[T X]
[~,~,yout]=sim('sim_model',[0 Tfinal],opt ,TIN);
f=some_fun_of(yout)
gradf=some_other_fun_of(yout)
end
function [G,P,gradG,gradP]=nonlcon(X,simulation_param,Tfinal)
T=(0:1:Tfinal)';
TIN=[T X]
[~,~,yout]=sim('sim_model',[0 Tfinal],opt ,TIN);
G=constr_fun_of(yout)
gradG=some_other_constr_fun_of(yout)
P=...
gradP=...
end
Since the simulation is the same, i would like fmincon to call it only once and not twice (once for objective fun and once for nonlcon fun).
but i dont know how to readapt the code if i have a Simulink simulation.

Accepted Answer

Matt J
Matt J on 31 Oct 2020
Edited: Matt J on 31 Oct 2020
function [x,f,eflag,outpt] = runobjconstr(x0,opts)
if nargin == 1 % No options supplied
opts = [];
end
simulation_param=...,
Tfinal=...,
xLast = []; % Last place update_yout was called
yout=[];
fun = @objfun; % The objective function, nested below
cfun = @constr; % The constraint function, nested below
% Call fmincon
[x,f,eflag,outpt] = fmincon(fun,x0,[],[],[],[],[],[],cfun,opts);
function [f,gradf] = objfun(x)
if ~isequal(x,xLast) % Check if computation is necessary
update_yout(x);
xLast = x;
end
% Now compute objective function
f=some_fun_of(yout)
gradf=some_other_fun_of(yout)
end
function [G,P,gradG,gradP] = constr(x)
if ~isequal(x,xLast) % Check if computation is necessary
update_yout(x);
xLast = x;
end
G=constr_fun_of(yout)
gradG=some_other_constr_fun_of(yout)
P=...,
gradP=...,
end
function update_yout(X)
T=(0:1:Tfinal)';
TIN=[T X]
[~,~,yout]=sim('sim_model',[0 Tfinal],opt ,TIN);
end
end
  6 Comments
Farshid R
Farshid R on 26 Sep 2022
Hello,
Could I ask a question about optimization?

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!