Code covered by the BSD License  

Highlights from
MIMOtool

image thumbnail

MIMOtool

by

 

12 Nov 2001 (Updated )

Multi Input Multi Output Systems Toolbox

ltr_rec1.m
function ltr_rec1;
% LTR_REC1 : calcolo dei controllori necessari 
%            nella fase di recupero di un controllo LQG\LTR
%
% In base alla posizione dell'incertezza (ingresso o uscita)
% il recupero  KFB o LQ ; a seconda dei due casi vengono 
% calcolate,graficate e salvate in stack.temp le seguenti
% variabili :
% sintesi LQ e recupero KFB   --> Kf,K(s)G(s)   
% sintesi KFB e recupero LQ   --> Kc,G(s)K(s)
%
% con G(s) sistema originale e K(s) compensatore dinamico
%
% Massimo Davini 20/10/99
global stack;

watchon;
set(findobj('tag','inf2'),'visible','off');
set(findobj('tag','BNext12'),'enable','off');
drawnow;

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

if isempty(mi) | isempty(ma) | ~isreal(mi) | ~isreal(ma) | mi >= ma
   set(findobj('tag','rangemink'),'string',num2str(0));
   set(findobj('tag','rangemaxk'),'string',num2str(3));  
   set(findobj('tag','editq'),'string',num2str(1));
   drawnow;
   set(findobj('tag','barra_rec'),'min',0,'max',3,'value',1);
elseif mi~=get(findobj('tag','barra_rec'),'min') |...
       ma~=get(findobj('tag','barra_rec'),'max')
   set(findobj('tag','barra_rec'),'value',mi);
   set(findobj('tag','barra_rec'),'min',mi,'max',ma);
   set(findobj('tag','editq'),'string',num2str(10^mi));
end;   

drawnow;
q=10^(get(findobj('tag','barra_rec'),'value'));
set(findobj('tag','editq'),'string',num2str(q));
 
%---------------------------------------------------
r=str2num(get(findobj('tag','editr'),'string'));
if isempty(r) | ~isreal(r) | r<=0
   set(findobj('tag','editr'),'string',num2str(1));r=1;
end;
drawnow;
%---------------------------------------------------
w=stack.temp.w;
[A,B,C,D]=unpck(stack.temp.plant);
ap=stack.general.A;
bp=stack.general.B;
cp=stack.general.C;

if strcmp(stack.temp.incer,'in') tipo=1;else tipo=2;end;
switch tipo
case 1
   
   Kc=stack.temp.Kc;
   if stack.temp.integratori>0
        qo=[bp;zeros(size(A,1)-size(ap,1),size(bp,2))];
        Q0=qo*qo';
   else Q0=B*B';
   end;
   Q1=B*B';

   try, Kf=lqr(A',C',Q0+q*q*Q1,r*eye(size(C',2)));vai=1;
   catch,vai=0;
   end;
   if vai
      Kf=Kf';
      K=pck(A-B*Kc-Kf*C,Kf,Kc,zeros(size(Kc,1),size(Kf,2)));

      %se il sistema  stato aumentato  necessario riconsiderare
      %il sistema iniziale e aggiungere gli integratori al K(s) :
      %in questo caso li devo aggiungere in ingresso al K
      n=stack.temp.integratori;
      if n > 0
        [ty,no,ni,ns]=minfo(stack.temp.sys);
        Ai=zeros(ni);Bi=eye(ni);Ci=eye(ni);Di=zeros(ni);
        P=pck(Ai,Bi,Ci,Di);
        for i=1:n K=mmult(P,K);end;
      end;
   
      GK_KG=mmult(stack.temp.sys,K);
      [akg,bkg,ckg,dkg]=unpck(GK_KG);
      KG=sigma(akg,bkg,ckg,dkg,w);
      s=size(KG,1);
      if s > 1 sv_GKKG=[20*log10(KG(1,:));20*log10(KG(2,:))];
      else sv_GKKG=20*log10(KG(1,:));end;
   else
      sv_GKKG=nan;Kf=[];K=[];GK_KG=nan;
      set(findobj('tag','BNext12'),'enable','off');
      set(findobj('tag','inf2'),'visible','on');
   end;

   stack.temp.Kf=Kf;   
   if ~isempty(Kf) set(findobj('tag','BNext12'),'enable','on');end;
   
case 2
   
   Kf=stack.temp.Kf;
   if stack.temp.integratori>0
        qo=[cp zeros(size(cp,1),size(A,1)-size(ap,1))];
        Q0=qo'*qo;
   else Q0=C'*C;
   end;
   Q1=C'*C;
   try, Kc=lqr(A,B,Q0+q*q*Q1,r*eye(size(B,2)));vai=1;
   catch,vai=0;
   end;
   if vai
      K=pck(A-B*Kc-Kf*C,Kf,Kc,zeros(size(Kc,1),size(Kf,2)));

      %se il sistema  stato aumentato  necessario riconsiderare
      %il sistema iniziale e aggiungere gli integratori al K(s) :
      %in questo caso li devo aggiungere in ingresso al K
      n=stack.temp.integratori;
      if n > 0
        [ty,no,ni,ns]=minfo(stack.temp.sys);
        Ai=zeros(no);Bi=eye(no);Ci=eye(no);Di=zeros(no);
        P=pck(Ai,Bi,Ci,Di);
        for i=1:n,  K=mmult(K,P);end;
      end;
   
      GK_KG=mmult(K,stack.temp.sys);
      [akg,bkg,ckg,dkg]=unpck(GK_KG);
      GK=sigma(akg,bkg,ckg,dkg,w);
      s=size(GK,1);
      if s > 1 sv_GKKG=[20*log10(GK(1,:));20*log10(GK(2,:))];
      else sv_GKKG=20*log10(GK(1,:));end;
   else
      sv_GKKG=nan;Kc=[];K=[];GK_KG=nan;
      set(findobj('tag','BNext12'),'enable','off');
      set(findobj('tag','inf2'),'visible','on');
   end;

   stack.temp.Kc=Kc;   
   if ~isempty(Kf) set(findobj('tag','BNext12'),'enable','on');end;
   
end;

stack.temp.K=K; 
stack.temp.GK_KG=GK_KG;
stack.temp.sv_GKKG=sv_GKKG;

%grafico
delete(findobj('tag','plot_GKKG'));
set(gca,'drawmode','fast','nextplot','add');
semilogx(w,sv_GKKG,'b','tag','plot_GKKG');
set(gca,'nextplot','replace');
drawnow;

watchoff;

Contact us