Fmincon objective and nlcon shared simulink parameters
3 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Alberto Belvedere
am 31 Okt. 2020
Kommentiert: Farshid R
am 26 Sep. 2022
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).
I saw this link: https://www.mathworks.com/help/optim/ug/objective-and-nonlinear-constraints-in-the-same-function.html
but i dont know how to readapt the code if i have a Simulink simulation.
0 Kommentare
Akzeptierte Antwort
Matt J
am 31 Okt. 2020
Bearbeitet: Matt J
am 31 Okt. 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 Kommentare
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Surrogate Optimization finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!