📄 sys_design.m
字号:
%sys_design is the function used in CtrlLAB for administrating system design tasks.
%
%Available Design Tasks are:
%
% 1 for lead/lag compensator design
% 2 for LQ optimal regulator/controller
% 3 for pole placement regulator/controller
% 4 for model following control
% 5 for LQG control
% 6 for LQG/LTR control
% 7 for H2 optimal control
% 8 for H_inf standard control
% 9 for H_inf optimal control
% 10 for mu-synthesis (not available now)
%
%Besides, PID controller designs are in a separate module.
%
%Available lists of functions under this module
%
% leadlag_design -- lead-lag compensator design
% ll_compn -- the lead-lag compensator design algorithm
% state_fdbk -- administrates the state-feedback
% model_follow - the model following compensator design
% lqgltr_design -- LQG and LQG/LTR controller design
% robust_design -- administrates robust controller design facilities
% std_tf -- find the standard transfer function
% get_tf -- find the transfer function from N/D strings
% shw_controller -- set and display the controller
%
%Designed by Professor Dingyu Xue
%School of Information Science and Engineering, Northeastern University
%Shenyang 110006, P R China
%Email: xue_dy@hotmail.com
%
%This module is for CtrllAB 3.0, (c) 1996-1999
%Last modified 16 October, 1999
%------------------------------------------------------------------------------
function sys_design(nTask,arg1,arg2)
switch nTask
case 1
if nargin==1, lead_lag_design(nTask);
else, lead_lag_design(1,arg1); end
case {2,3}
if nargin==1, state_fdbk(nTask);
else, state_fdbk(2,arg1); end
case 4
if nargin==1, model_follow(nTask);
else, model_follow(nTask,arg1); end
case {5,6}
if nargin==1, lqgltr_design(nTask);
else, lqgltr_design(5,arg1); end
case {7,8,9,10}
switch nargin
case 1, robust_design(nTask);
case 2, robust_design(7,arg1);
case 3, robust_design(7,arg1,arg2);
end
otherwise
end
%----------------------------------------------
%leadlag_design for lead-lag compensator design
%----------------------------------------------
function lead_lag_design(nTask, arg1)
%show the lead-lag controller dialog box
if nargin==1
g_leadlag=findobj('Tag','CtrlLABLeadLag');
if length(g_leadlag)==0
g_leadlag=figure('Units','normalized','Position',[0.18625 0.248 0.375 0.267],...
'MenuBar','none','Color',0.8*[1,1,1],'Resize','off','Tag','CtrlLABLeadLag',...
'NumberTitle','off','Name','Lead/Lag Controller Specifications','Resize','off');
extra_funs(1); display_str(0.03,0.90,'Phase Margin \gamma',[0,0,0],'on',9);
uicontrol('Tag','Gam','Style','Edit','String','50',...
'Units','normalized','Position',[0.45,0.83,0.22,0.13],...
'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
display_str(0.03,0.72,'Crossover Frequency \omega_c',[0,0,0],'on',9);
uicontrol('Tag','Wc','Style','Edit','String','1',...
'Units','normalized','Position',[0.45,0.65,0.22,0.13],...
'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
display_str(0.03,0.54,'Error Coefficient K_v',[0,0,0],'on',9);
uicontrol('Tag','Kv','Style','Edit','String','10',...
'Units','normalized','Position',[0.45,0.47,0.22,0.13],...
'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
display_str(0.03,0.36,'Compensator Type',[0,0,0],'on',9);
uicontrol('Tag','Lst','Style','ListBox','String','Auto|Lead|Lag|Leag-Lag',...
'Units','normalized','Position',[0.40,0.04,0.29,0.37],...
'Value',1,'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
uicontrol('Style','PushButton','String','Design',...
'Units','normalized','Position',[0.75,0.80,0.22,0.15],'CallBack','sys_design(1,1);');
uicontrol('Style','PushButton','String','Cancel',...
'Units','normalized','Position',[0.75,0.62,0.22,0.15],'CallBack','delete(gcf);');
uicontrol('Style','PushButton','String','Help',...
'Units','normalized','Position',[0.75,0.44,0.22,0.15],'Callback','clab_help(10)');
uicontrol('Style','PushButton','String','Maximise Wc',...
'Units','normalized','Position',[0.73,0.10,0.26,0.15],'CallBack','sys_design(1,2);');
else, figure(g_leadlag); end
else
g0=gcf;
g_Gam=findobj(g0,'Tag','Gam'); g_Wc=findobj(g0,'Tag','Wc');
g_Kv=findobj(g0,'Tag','Kv'); g_list=findobj(g0,'Tag','Lst');
Gam_c=eval(get(g_Gam,'String')); Wc=eval(get(g_Wc,'String'));
Kv=eval(get(g_Kv,'String')); kLeagLag=get(g_list,'Value')-1;
uu0=get(findobj('Tag','CtrlLABMain'),'UserData');
g1=get(uu0{1}(1),'UserData'); G_Sys=tf(g1{2});
g4=get(uu0{1}(4),'UserData'); Td=g4{1};
if arg1==1
Gc_Sys=ll_compn(Wc,Gam_c,Kv,kLeagLag,G_Sys,Td); shw_controller(Gc_Sys);
else arg1==2
GGc_tmp=num2str(Gam_c); GGW_tmp=num2str(Wc); GGK_tmp=num2str(Kv);
key=1; W1=0.01; W2=1000; Gc1=ll_compn(W1,Gam_c,Kv,kLeagLag,G_Sys,Td);
[Gm,P1,Wcg,Wcp]=margin(Gc1*G_Sys);
Gc2=ll_compn(W2,Gam_c,Kv,kLeagLag,G_Sys,Td);
[Gm,P2,Wcg,Wcp]=margin(Gc2*G_Sys); PP=[]; d=10;
if P2>(1-0.05)*Gam_c, key=0; Wc=1000; end
ww=[]; ii=0;
while (key==1)
Wc=10^((log10(W1)+log10(W2))/2); Gcn=ll_compn(Wc,Gam_c,Kv,kLeagLag,G_Sys,Td);
[Gm,P0,Wcg,Wcp]=margin(Gcn*G_Sys);
ww=[ww;W1,W2,P1,P2,Wc,P0]; PP=[PP;P1,P2,P0,W1,W2,Wc,d];
if xor((P1>0.95*Gam_c),(P0>0.95*Gam_c)),
d=(W2-Wc); W2=Wc; P2=P0; ii=ii+1;
elseif xor((P0>0.95*Gam_c),(P2>0.95*Gam_c)),
d=(Wc-W1); W1=Wc; P1=P0; ii=ii+1;
end
if abs(d)<0.001, key=0; end
end
set(g_Wc,'String',num2str(Wc));
end
end
%--------------------------------------------------------------
%ll_compn implements the lead-lag compensator design algorithm.
%
% G2=ll_compn(Wc,Gam_c,Kv,kLeadLag,G1,Td)
%where
% G2 -- the designed controller
% Wc -- expected cross-over frequency
% Gam_c -- expected phase margin
% Kv -- the steady state error tolerance
% kLeadLag -- the format of lead/lag controller
% G1,Td -- the plant model with delay
%--------------------------------------------------------------
function G2=ll_compn(Wc,Gam_c,Kv,kLeadLag,G1,Td)
[G_n,G_d]=tfdata(G1,'v'); [Gai,Pha]=bode(G1,Wc); Pha=Pha-Td*Wc*180/pi;
Phi_c=sin((Gam_c-Pha-180)*pi/180); a=G_d(end:-1:1); ii=find(abs(a)<=0);
if length(ii)>0
if ii(1)>1, a=a(ii(1)+1); else, a=a(ii(1)+1); end
else, a=a(1); end;
alpha=sqrt((1-Phi_c)/(1+Phi_c)); Zc=alpha*Wc; Pc=Wc/alpha;
Kc=sqrt((Wc*Wc+Pc*Pc)/(Wc*Wc+Zc*Zc))/Gai; K1=G_n(end)*Kc*alpha/a;
%set the leag/lag compensator mode
if kLeadLag==0,
kLeadLag=1; if Phi_c<0, kLeadLag=2; else, if K1<Kv, kLeadLag=3; end, end
end
if kLeadLag==1, G2=tf([1 Zc]*Kc,[1 Pc]);
elseif kLeadLag==2, Kc=1/Gai; K1=G_n(end)*Kc/a; G2=tf([1 0.1*Wc],[1 0.1*K1*Wc/Kv]);
elseif kLeadLag==3
Zc2=Wc*0.1; Pc2=K1*Zc2/Kv; G2=tf(Kc*conv([1 Zc],[1,Zc2]),conv([1 Pc],[1,Pc2]));
end
%--------------------------------------------------------------
%state_fdbk administrates the state-feedback compensator design
%
% state_fdbk(nTask,arg1)
%where
% nTask=2 for LQ, 3 for pole placement
%--------------------------------------------------------------
function state_fdbk(nTask,arg1)
uu0=get(findobj('Tag','CtrlLABMain'),'UserData'); g1=get(uu0{1}(1),'UserData');
G_Sys=tf(g1{2}); n=length(G_Sys.den{1})-1;
if nargin==1
g_state=findobj('Tag','CtrlLABStateFdbk');
if length(g_state)==0
g_state=figure('Units','normalized','Position',[0.18625 0.248 0.45 0.367],...
'NumberTitle','off','Name','State Spece Design','Tag','CtrlLABStateFdbk',...
'MenuBar','none','Color',0.8*[1,1,1],'Resize','off');
extra_funs(1); hh=extra_funs(10,[0.04,0.05],[0.52,0.38]);
uicontrol('Style','Text','String','Feedback Scheme',...
'Units','normalized','Position',[0.06,0.34,0.33,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
ud2(1)=uicontrol('Style',strRadio,'String','State Feedback','Value',1,...
'Units','normalized','Position',[0.07,0.23,0.38,0.06],...
'BackgroundColor',0.8*[1,1,1],'CallBack','sys_design(2,1);');
ud2(2)=uicontrol('Style',strRadio,'String','Observer-based','Value',0,...
'Units','normalized','Position',[0.07,0.14,0.38,0.06],...
'BackgroundColor',0.8*[1,1,1],'CallBack','sys_design(2,2);');
[xL,ud2(3)]=display_str(0.05,0.65,'Expected Poles for Observer',[0,0,0],'off',9);
tmpPVec='['; for i=1:n, tmpPVec=[tmpPVec, '-10; ']; end
tmpPVec=[tmpPVec(1:end-2), ']'];
ud2(4)=uicontrol('Style','Edit','String',tmpPVec,'Visible','off',...
'Units','normalized','Position',[.08 .50 .6 .09],...
'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
if nTask==2
tmpQMat='diag(['; for i=1:n, tmpQMat=[tmpQMat, '1, ']; end
tmpQMat=[tmpQMat(1:end-2), '])'];
txtVec=['Enter Q matrix, while R=1 (order of system=',int2str(n),')'];
[xL,ud2(5)]=display_str(0.05,0.94,txtVec,[0,0,0],'on',9);
ud2(6)=uicontrol('Style','Edit','String',tmpQMat,...
'Units','normalized','Position',[.08 .74 .6 .09],...
'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
elseif nTask==3
txtVec=['Expected poles (order of system=',int2str(n),')'];
[xL,ud2(5)]=display_str(0.05,0.94,txtVec,[0,0,0],'on',9);
tmpVVec='[';
for i=1:n, tmpVVec=[tmpVVec, '-10, ']; end
tmpVVec=[tmpVVec(1:end-2), ']'];
ud2(6)=uicontrol('Style','Edit','String',tmpVVec,...
'Units','normalized','Position',[.08 .79 .6 .09],...
'HorizontalAlignment','left','BackgroundColor',[1,1,1]);
end
uicontrol('Style','PushButton','String','Design',...
'Units','normalized','Position',[0.80,0.84,0.18,0.11],...
'BackgroundColor',0.8*[1,1,1],'CallBack','sys_design(2,4);');
uicontrol('Style','PushButton','String','Cancel',...
'Units','normalized','Position',[0.80,0.71,0.18,0.11],...
'BackgroundColor',0.8*[1,1,1],'CallBack','delete(gcf);');
uicontrol('Style','PushButton','String','Help',...
'Units','normalized','Position',[0.80,0.58,0.18,0.11],...
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -