Fmincon objective and nlcon shared simulink parameters
조회 수: 3 (최근 30일)
이전 댓글 표시
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
채택된 답변
Matt J
2020년 10월 31일
편집: Matt J
2020년 10월 31일
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
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Surrogate Optimization에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!