Я построил модель Simulink для динамического и кинематического моделирования транспортного средства, транспортное средство должно отслеживать опорную траекторию, поэтому цель оптимизации состоит в том, чтобы минимизировать ошибку, определенную (y) в "objec_Fun". И ограничение движения транспортного средства - это линейная скорость, угловая скорость, линейное ускорение и угловое ускорение, определенные в (c) в "constraint_Fun". А расчетным параметром является усиление регулятора.
линейная и угловая скорости транспортного средства должны быть достигнуты до 8 м / с и -0,8 рад / с соответственно какустановившийся.
Во-первых;Я запускаю код без функции нелинейного ограничения 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