Как оптимизировать использование fmincon с переменными ограничения из модели Simulink - PullRequest
0 голосов
/ 08 октября 2019

Я построил модель Simulink для динамического и кинематического моделирования транспортного средства, транспортное средство должно отслеживать опорную траекторию (круг),

Таким образом, цель оптимизации являетсячтобы минимизировать отклонение позиции, определенное (y) в objec_Fun.

А ограничение движения транспортного средства - это линейная скорость, угловая скорость, линейное ускорение и угловое ускорение, определенные в (c) в constraint_Fun.

А расчетный параметр - это коэффициент усиления контроллера.

Во-первых;Я запускаю код без нелинейной функции ограничения c = [], и он дает идеальный результат, чтобы минимизировать ошибку (y), но линейная скорость, угловая скорость, линейное ускорение и угловое ускорение не реалистичны.

Затем я наложил ограничение на скорости и ускорения, но fmincon не может минимизировать ошибки.

время симуляции составляет 10 секунд, а символы переменных скоростей и ускорений - "VV" и "VVdot».

"VV" - это матрица 10001 * 3, первый столбец - это время, второй - линейная скорость, а третий - угловая скорость.

"VVdot" - это матрица 10001 * 3. первый столбец - время, второй - линейное ускорение, а третий - угловое ускорение.

Основной файл Matlab

    global   K1 K2     Roh  delta1 delta2   kx ky   ktheta  VV  VVdot
    K1=1; K2=1;  Roh=1;  delta1=0.00001;   delta2=0.00001;  kx=1;   ky=1;    ktheta=1;
    lb=[0.00      0.00      0.00    0.00001    0.00001  0.00  0.00  0.00  ];
    ub=[0200      0200      0200    0.1        0.1      0200  0200  0200  ];
    x0=[K1   K2     Roh    delta1     delta2     kx   ky    ktheta];
    A=[];    b=[];    Aeq=[];    beq=[];
    options = optimset( 'Algorithm','sqp','Display','iter','PlotFcn','optimplotfval','TolFun',10e-6,'TolCon',10e-6);
    [x,fval,exitflag,output,grad]=fmincon(@objec_Fun,x0,A,b,Aeq,beq,lb,ub,@constraint_Fun,options)

objec_Fun

function y=objec_Fun(x)
global   K1 K2     Roh  delta1 delta2   kx ky   ktheta  VV  VVdot 

K1=x(1);
K2=x(2);
Roh=x(3);
delta1=x(4);
delta2=x(5);
kx=x(6);
ky=x(7);
ktheta=x(8);

%% 
options=simset('SrcWorkspace','current');
sim('DynSMC23092019.slx',[],options);
assignin('base','x',x)
assignin('base','VV',VV)
assignin('base','VVdot',VVdot)
%%

errx=ep.Data(:,1);
erry=ep.Data(:,2);
errtheta=ep.Data(:,3);
errd=sqrt(errx.^2+erry.^2);
N=length(errtheta);
y=(1/N)*(sum(errd.^2+errtheta.^2));
end

constraint_Fun

function [c,ceq]=constraint_Fun(x)

global   K1 K2     Roh  delta1 delta2   kx ky   ktheta   VV  VVdot


K1=x(1);
K2=x(2);
Roh=x(3);
delta1=x(4);
delta2=x(5);
kx=x(6);
ky=x(7);
ktheta=x(8);

c=[max(VV(:,2))-10;          max(abs(VV(:,3)))-1.5 ;...
   max(VVdot(:,2))-(10/3);   max(abs(VVdot(:,3)))-(1.5/3)];

ceq=[];
end
...