📄 sys_design.m
字号:
'BackgroundColor',0.8*[1,1,1],'CallBack','sys_design(2,3);');
ud2(7)=nTask; set(g_state,'UserData',ud2);
else, figure(g_state); end
else
ud2=get(gcf,'UserData'); nTask=ud2(7);
switch arg1
case 1
extra_funs(4,1,'Value',1,2); set(ud2(3:4),'Visible','off');
case 2
extra_funs(4,1,'Value',2,1); set(ud2(3:4),'Visible','on');
case 3, clab_help(9+nTask)
case 4, [a,b,c,d]=ssdata(g1); nA=size(a); Q=eval(get(ud2(6),'String'));
if nTask==2
nQ=size(Q); if sum(nQ==nA)==2, K_fdbk=lqr2(a,b,Q,1); end
elseif nTask==3
if length(Q)==nA(1), K_fdbk=acker(a,b,Q); end
end
if get(ud2(1),'Value')==1, L_vec=zeros(size(b));
else
P=eval(get(ud2(4),'String'));
if nA(1)==length(P), L_vec=acker(a',c',P)'; end
end
Gc_Sys=ss(a-b*K_fdbk-L_vec*c-L_vec*d*K_fdbk,b,-K_fdbk,1);
H_Sys=ss(a-L_vec*c,L_vec,K_fdbk,0); shw_controller(Gc_Sys,H_Sys);
display_str(0.05,0.28,'State Feedback Vector');
display_str(0.08,0.13,mat2str(K_fdbk,5));
end
end
%------------------------------------------------------------------------
%model_follow function implements the model following compensator design.
%------------------------------------------------------------------------
function model_follow(nTask,arg1)
uu0=get(findobj('Tag','CtrlLABMain'),'UserData'); g1=get(uu0{1}(1),'UserData');
[G_num,G_den,Td]=tfdata(g1{2},'v');
ii=find(abs(G_num)>1e-8); G_num=G_num(ii(1):end);
n_ord=length(G_den)-length(G_num); nn=n_ord;
g4=get(uu0{1}(4),'UserData'); Td=g4{1}; nPade=g4{2};
if nargin==1
g_model=findobj('Tag','CtrlLABModelFollow');
if length(g_model)==0
g_model=figure('Units','normalized','Position',[0.18625 0.248 0.45 0.333],...
'NumberTitle','off','Name','Model Following Control Design','Tag','CtrlLABModelFollow',...
'MenuBar','none','Color',0.8*[1,1,1],'Resize','off');
extra_funs(1);
aWMats(1)=uicontrol('Style','PushButton','String','Design',...
'Units','normalized','Position',[0.80,0.84,0.18,0.12],'CallBack','sys_design(4,4);');
aWMats(2)=uicontrol('Style','PushButton','String','Cancel',...
'Units','normalized','Position',[0.80,0.7,0.18,0.12],'CallBack','delete(gcf);');
aWMats(3)=uicontrol('Style','PushButton','String','Help',...
'Units','normalized','Position',[0.80,0.54,0.18,0.12],'CallBack','clab_help(25);');
[xL,cWMats(1)]=display_str(0.1,0.83,'Order of Standard Model:',[0,0,0],'on',9);
[xL,cWMats(9)]=display_str(0.1,0.70,'Expected Natrual Freq \omega_n',[0,0,0],'on',9);
cWMats(2)=uicontrol('Style','Edit','String',num2str(nn),...
'Units','normalized','Position',[0.53,0.78,0.10,0.08],...
'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
[v,d]=version; v1=eval(v(1)); v2=eval(v(3)); v3=eval(v(5));
if v2==2 & v3==0, strRadio='ToggleButton'; else, strRadio='RadioButton'; end
cWMats(3)=uicontrol('Style',strRadio,'String','ITAE Type I','Value',1,...
'Units','normalized','Position',[0.12,0.40,0.30,0.07],...
'HorizontalAlignment','left','BackgroundColor',0.8*[1,1,1],...
'CallBack','extra_funs(4,3,''Value'',3,4:5);');
cWMats(4)=uicontrol('Style',strRadio,'String','ITAE Type II','Value',0,...
'Units','normalized','Position',[0.12,0.29,0.30,0.07],...
'HorizontalAlignment','left','BackgroundColor',0.8*[1,1,1],'CallBack','sys_design(4,1);');
cWMats(5)=uicontrol('Style',strRadio,'String','Butterworth Model','Value',0,...
'Units','normalized','Position',[0.12,0.18,0.35,0.07],...
'HorizontalAlignment','left','BackgroundColor',0.8*[1,1,1],...
'CallBack','extra_funs(4,3,''Value'',5,3:4);');
cWMats(6)=uicontrol('Style','Edit','String','10',...
'Units','normalized','Position',[0.49,0.65,0.10,0.08],...
'HorizontalAlignment','left','BackgroundColor',0.8*[1,1,1]);
cWMats(7)=extra_funs(10,[0.10,0.13],[0.58,0.55]);
cWMats(8)=uicontrol('Style','Text','String','Standard Model Selection',...
'Units','normalized','Position',[0.12,0.52,0.4,0.06],...
'HorizontalAlignment','left','BackgroundColor',0.8*[1,1,1]);
cWMats(10)=uicontrol('Style','Text','String','Transfer Function to follow',...
'Units','normalized','Position',[0.05,0.90,0.50,0.06],...
'HorizontalAlignment','left','BackgroundColor',0.8*[1,1,1],'Visible','off');
cWMats(11)=uicontrol('Style','Edit','String',mat2str(1),...
'Units','normalized','Position',[0.08 0.60 0.5 0.09],...
'HorizontalAlignment','left','BackgroundColor',0.8*[1,1,1],'Visible','off');
cWMats(12)=uicontrol('Style','Edit','String',mat2str([1,1]),...
'Units','normalized','Position',[0.08,0.30,0.5,0.09],...
'HorizontalAlignment','left','BackgroundColor',0.8*[1,1,1],'Visible','off');
[xL,cWMats(13)]=display_str(0.05,0.72,'Numerator Array',[0,0,0],'off',9);
[xL,cWMats(14)]=display_str(0.05,0.42,'Denominator Array',[0,0,0],'off',9);
bWMats(1)=extra_funs(10,[0.62,0.13],[0.97,0.42]);
bWMats(2)=uicontrol('Style','Text','String','Reference Model',...
'Units','normalized','Position',[0.64,0.40,0.25,0.06],...
'HorizontalAlignment','left','BackgroundColor',0.8*[1,1,1]);
bWMats(3)=uicontrol('Style',strRadio,'String','Standard','Value',1,...
'Units','normalized','Position',[0.64,0.30,0.25,0.06],...
'BackgroundColor',0.8*[1,1,1],'CallBack','sys_design(4,2);');
bWMats(4)=uicontrol('Style',strRadio,'String','User Specified','Value',0,...
'Units','normalized','Position',[0.64,0.20,0.31,0.06],...
'BackgroundColor',0.8*[1,1,1],'CallBack','sys_design(4,3);');
set(gcf,'UserData',{aWMats,bWMats,cWMats});
else, figure(g_model); end
else
u_c=get(gcf,'UserData');
switch arg1
case 1
extra_funs(4,3,'Value',4,[3,5]); nn=eval(get(u_c{3}(2),'String'));
if n_ord>nn-1, set(u_c{3}(2),'String',int2str(n_ord+1)); end
case 2, extra_funs(4,2,'Value',3,4); extra_funs(4,3,'Visible',[1:9],[10:14]);
case 3, extra_funs(4,2,'Value',4,3); extra_funs(4,3,'Visible',[10:14],[1:9]);
case 4,
[nn,dd]=tfdata(G_Sys,'v');
if Td>0, [nP,dP]=pade(Td,nPade); nn=conv(nn,nP); dd=conv(dd,dP); end
if get(u_c{2}(3),'Value')==1
n=eval(get(u_c{3}(2),'String')); wn=eval(get(u_c{3}(6),'String'));
bStdModel=extra_funs(5,3,'Value',3:5); [mf_num,mf_den]=std_tf(bStdModel,wn,n);
else, Gc=get_tf(1); [mf_num,mf_den]=tfdata(Gc,'v'); end,
nn=mf_num; dd=mf_den-[zeros(1,length(mf_den)-length(mf_num)),mf_num];
Gc_Sys=tf(nn,dd)*inv(G_Sys); shw_controller(Gc_Sys);
end
end
%--------------------------------------------------------------------
%lqgltr_design implements the LQG and LQG/LTR controller design tasks
%
% lqgltr_design(nTask,arg1)
%where nTask=5 for LQG and 6 for LQG/LTR
%--------------------------------------------------------------------
function lqgltr_design(nTask,arg1)
uu0=get(findobj('Tag','CtrlLABMain'),'UserData');
g1=get(uu0{1}(1),'UserData'); G_Sys=tf(g1{2});
if nargin==1
n=length(G_Sys.den{1})-1; g_lqgltr=findobj('Tag','CtrlLABLQGLTR');
if length(g_lqgltr)==0
g_lqgltr=figure('Units','normalized','Position',[0.24625 0.267 0.4 0.333],...
'NumberTitle','off','Name','LQG/LTR Control Design','Tag','CtrlLABLQGLTR',...
'MenuBar','none','Color',0.8*[1,1,1],'Resize','off');
extra_funs(1); display_str(0.05,0.75,'Optimal Control Weighting Matrix Q',[0,0,0],'on',9);
tmpQMat='diag(['; for i=1:n, tmpQMat=[tmpQMat, '1, ']; end
tmpQMat=[tmpQMat(1:end-2), '])'];
aWMats(2)=uicontrol('Style','Edit','String',tmpQMat,...
'Units','normalized','Position',[0.08 0.58 0.6 0.1],...
'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
[xL,aWMats(5)]=display_str(0.05,0.43,'the Value of \Xi',[0,0,0],'on',9);
aWMats(3)=uicontrol('Style','Edit','String','1e-3',...
'Units','normalized','Position',[0.3 0.39 0.2 0.1],...
'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
[xL,aWMats(6)]=display_str(0.05,0.25,'the Value of \Theta',[0,0,0],'on',9);
aWMats(7)=uicontrol('Style','Edit','String','1e-6',...
'Units','normalized','Position',[0.3 0.22 0.2 0.1],...
'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
if nTask==6
tmpqVec='[1,1e5,1e10,1e15]';
[xL,aWMats(4)]=display_str(0.05,0.95,'Recovery Gain Vector q',[0,0,0],'on',9);
aWMats(1)=uicontrol('Style','Edit','String',tmpqVec,...
'Units','normalized','Position',[0.08 0.80 0.6 0.1],...
'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
end
extra_funs(10,[0.56,0.10],[0.98,0.42]);
uicontrol('Style','Text','String',' Problem Specifications',...
'Units','normalized','Position',[0.59,0.39,0.35,0.06],'BackgroundColor',0.8*[1,1,1]);
[v,d]=version; v1=eval(v(1)); v2=eval(v(3)); v3=eval(v(5));
if v2==2 & v3==0, strRadio='ToggleButton'; else, strRadio='RadioButton'; end
aWMats(8)=uicontrol('Style',strRadio,'String','Regulator Problem','Value',1,...
'Units','normalized','Position',[0.59,0.28,0.32,0.06],...
'BackgroundColor',0.8*[1,1,1],'CallBack','extra_funs(4,1,''Value'',8,9);');
aWMats(9)=uicontrol('Style',strRadio,'String','Controllor Problem','Value',0,...
'Units','normalized','Position',[0.59,0.18,0.31,0.06],...
'BackgroundColor',0.8*[1,1,1],'CallBack','extra_funs(4,1,''Value'',9,8);');
uicontrol('Style','PushButton','String','Design',...
'Units','normalized','Position',[0.80,0.84,0.18,0.12],'CallBack','sys_design(5,1);');
uicontrol('Style','PushButton','String','Cancel',...
'Units','normalized','Position',[0.80,0.70,0.18,0.12],'CallBack','delete(gcf);');
uicontrol('Style','PushButton','String','Help',...
'Units','normalized','Position',[0.80,0.56,0.18,0.12],'CallBack','sys_design(5,2);');
aWMats(10)=nTask;
set(g_lqgltr,'UserData',aWMats);
else, figure(g_lqgltr); end
else
aWMats=get(gcf,'UserData');
switch arg1
case 1
robust_design(7,1);
case 2
if aWMats(8)==5, clab_help(16);
else, clab_help(17); end
end
end
%-------------------------------------------------------------------------
%robust_design function administrates LQG, LQG/LTR and H-norm based robust
%controller design facilities.
%
% robust_design(nTask,arg1,arg2)
%where nTask is as described as above.
%-------------------------------------------------------------------------
function robust_design(nTask,arg1,arg2)
uu0=get(findobj('Tag','CtrlLABMain'),'UserData'); g1=get(uu0{1}(1),'UserData');
G_Sys=tf(g1{2}); [G_num,G_den]=tfdata(G_Sys,'v');
n_ord=length(G_den)-length(G_num); nn=n_ord;
g4=get(uu0{1}(4),'UserData'); Td=g4{1}; nPade=g4{2};
switch nargin
case 1
g_hinf=findobj('Tag','CtrlLABHinf');
if length(g_hinf)==0
g_hinf=figure('Units','normalized','Position',[0.18625 0.248 0.45 0.417],...
'NumberTitle','off','Name','Robust Control Design','Tag','CtrlLABHinf',...
'MenuBar','none','Color',0.8*[1,1,1],'Resize','off');
extra_funs(1);
[xL,bWMats(1)]=display_str(0.05,0.94,'Weighting Transfer Function W_1(s)',[0,0,0],'on',9);
aWMats(1)=uicontrol('Style','Edit','String',mat2str([0.5,0.5]),...
'Units','normalized','Position',[0.08 0.82 0.4 0.07],...
'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
aWMats(2)=uicontrol('Style','Edit','String',mat2str([0.5,1]),...
'Units','normalized','Position',[0.08,0.74,0.4,0.07],...
'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
[xL,bWMats(2)]=display_str(0.05,0.70,'Weighting Transfer Function W_2(s)',[0,0,0],'on',9);
aWMats(3)=uicontrol('Style','Edit','String',mat2str([0.5,1]),...
'Units','normalized','Position',[0.08 0.58 0.4 0.07],...
'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
aWMats(4)=uicontrol('Style','Edit','String',mat2str([0.5,0.5]),...
'Units','normalized','Position',[0.08,0.50,0.4,0.07],...
'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
[xL,bWMats(3)]=display_str(0.05,0.46,'Weighting Transfer Function W_3(s)',[0,0,0],'on',9);
aWMats(5)=uicontrol('Style','Edit','String',mat2str([0.5,0.5]),...
'Units','normalized','Position',[0.08 0.34 0.4 0.07],...
'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
aWMats(6)=uicontrol('Style','Edit','String',mat2str([0.5,1]),...
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -