Code covered by the BSD License  

Highlights from
MIMOtool

image thumbnail

MIMOtool

by

 

12 Nov 2001 (Updated )

Multi Input Multi Output Systems Toolbox

ltr_syn1.m
function ltr_syn1;
%LTR_SYN1 : calcolo dei controllori necessari 
%           nella fase di sintesi di un controllo LQG\LTR
%
% In base alla posizione dell'incertezza (ingresso o uscita)
% la sintesi  LQ o KFB ; a seconda dei due casi vengono 
% calcolate,graficate e salvate in stack.temp le seguenti
% variabili :
% sintesi LQ 
%    --> Kc,Klq=Kc*inv(si-A)*C,Krol=(1/sqrt(ro))*H*inv(sI-A)*C
% sintesi KFB 
%    --> Kf,Kkf=C*inv(si-A)*Kf,Kfol=(1/sqrt(mu))*C*inv(sI-A)*W
%
%
% Massimo Davini 20/10/99

global stack;

watchon;
set(findobj('tag','BNext'),'enable','off');
set(findobj('tag','inf1'),'visible','off');

%---------------------------------------------------
%settaggio del minimo e del massimo per la barra
%se sono stati modificati i campi edit relativi
mi=str2num(get(findobj('tag','rangemin'),'string'));
ma=str2num(get(findobj('tag','rangemax'),'string'));

if isempty(mi) | isempty(ma) | ~isreal(mi) | ~isreal(ma) | mi >= ma
   set(findobj('tag','rangemin'),'string',num2str(-3));
   set(findobj('tag','rangemax'),'string',num2str(0));  
   set(findobj('tag','edit_romu'),'string',num2str(1));
   drawnow;
   set(findobj('tag','barra_syn'),'min',-3,'max',0,'value',0);
elseif mi~=get(findobj('tag','barra_syn'),'min') |...
       ma~=get(findobj('tag','barra_syn'),'max')
   set(findobj('tag','barra_syn'),'value',ma);
   set(findobj('tag','barra_syn'),'min',mi,'max',ma);
   set(findobj('tag','edit_romu'),'string',num2str(10^ma));
end;   

drawnow;
val=10^(get(findobj('tag','barra_syn'),'value'));
%---------------------------------------------------

w=stack.temp.w;
[A,B,C,D]=unpck(stack.temp.plant);  %sistema aumentato

if strcmp(stack.temp.incer,'in') tipo=1;else tipo=2;end;
if strcmp(get(gcbo,'tag'),'barra_syn')
      val=10^(get(gco,'value'));
      set(findobj('tag','edit_romu'),'String',num2str(val));      
else  val=10^(get(findobj('tag','barra_syn'),'value'));
end;

switch tipo
case 1
   H=stack.temp.H;
   RO=val;
   
   %valori singolari max e min di Trol=(1/sqrt(ro))*H*inv(sI-A)*B;
   Trol=(1/sqrt(RO))*sigma(A,B,H,zeros(size(H,1),size(B,2)),w);
   s=size(Trol,1);
   if s > 1 sv_Trol=[20*log10(Trol(1,:));20*log10(Trol(s,:))];
   else sv_Trol=20*log10(Trol(1,:));end;

   %valori singolari max e min di Tlq=Kc*inv(sI-A)*B:
   %( possibile che non si riesca a trovare Kc)
   try, Kc=lqr(A,B,H'*H,RO*eye(size(B,2)));vai=1;
   catch, vai=0;
   end;
   if vai   
     Tlq=sigma(A,B,Kc,zeros(size(Kc,1),size(B,2)),w);
     s=size(Tlq,1);
     if s > 1 sv_Tlq=[20*log10(Tlq(1,:));20*log10(Tlq(s,:))];
     else sv_Tlq=20*log10(Tlq(1,:));end;
   else sv_Tlq=nan;Kc=[];
     set(findobj('tag','BNext'),'enable','off');
     set(findobj('tag','inf1'),'visible','on');
   end;

   stack.temp.sv_Tlq=sv_Tlq;
   stack.temp.sv_Trol=sv_Trol;
   stack.temp.Kc=Kc;

   %grafico
   delete(findobj('tag','plot_Trol'));
   delete(findobj('tag','plot_Tlq'));

   set(gca,'drawmode','fast','nextplot','add');
   semilogx(w,sv_Trol,'b','tag','plot_Trol');
   if get(findobj('tag','ck_TlqTkf'),'value')
     semilogx(w,sv_Tlq,'r','tag','plot_Tlq');
   end;
   set(gca,'nextplot','replace');
   drawnow;
   if ~isempty(Kc) set(findobj('tag','BNext'),'enable','on');end;

case 2
   MU=val;   
   W=stack.temp.W;
   
   %valori singolari max e min di Tfol=(1/sqrt(mu))*C*inv(sI-A)*W;
   Tfol=(1/sqrt(MU))*sigma(A,W,C,zeros(size(C,1),size(W,2)),w);
   s=size(Tfol,1);
   if s > 1 sv_Tfol=[20*log10(Tfol(1,:));20*log10(Tfol(s,:))];
   else sv_Tfol=20*log10(Tfol(1,:));end;
   
   %valori singolari max e min di Tfb=C*inv(sI-A)*Kf:
   %( possibile che non si riesca a trovare Kf)
   try, Kf=lqr(A',C',W*W',MU*eye(size(W,2)));vai=1;
   catch, vai=0;
   end;
   if vai   
     Kf=Kf';
     Tkf=sigma(A,Kf,C,zeros(size(C,1),size(Kf,2)),w);
     s=size(Tkf,1);
     if s > 1 sv_Tkf=[20*log10(Tkf(1,:));20*log10(Tkf(s,:))];
     else sv_Tkf=20*log10(Tkf(1,:));end;
   else sv_Tkf=nan;Kf=[];
     set(findobj('tag','BNext'),'enable','off');
     set(findobj('tag','inf1'),'visible','on');
   end;

   stack.temp.sv_Tkf=sv_Tkf;
   stack.temp.sv_Tfol=sv_Tfol;
   stack.temp.Kf=Kf;
   
   %grafico
   delete(findobj('tag','plot_Tfol'));
   delete(findobj('tag','plot_Tkf'));

   set(gca,'drawmode','fast','nextplot','add');
   semilogx(w,sv_Tfol,'b','tag','plot_Tfol');
   if get(findobj('tag','ck_TlqTkf'),'value')
     semilogx(w,sv_Tkf,'r','tag','plot_Tkf');
   end;
   set(gca,'nextplot','replace');
   drawnow;
   if ~isempty(Kf) set(findobj('tag','BNext'),'enable','on');end;
end;

watchoff;

Contact us