Fmincon objective and nlcon shared simulink parameters
3 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Alberto Belvedere
il 31 Ott 2020
Commentato: Farshid R
il 26 Set 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 Commenti
Risposta accettata
Matt J
il 31 Ott 2020
Modificato: Matt J
il 31 Ott 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 Commenti
Più risposte (0)
Vedere anche
Categorie
Scopri di più su Surrogate Optimization in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!