Code covered by the BSD License  

Highlights from
MIMOtool

image thumbnail

MIMOtool

by

 

12 Nov 2001 (Updated )

Multi Input Multi Output Systems Toolbox

mfc3.m
function mfc3(tipo)
%MFC3 :calcolo del controllore EMFC o IMFC 
%ed inizializzazzione dei campi stack.evaluation (contenente
%le variabili per la valutazione) e stack.simulation (contenente
%le variabili per la simulazine) con la stringa 'imfc' o 'emfc'
%per indicare il tipo di controllore e con la matrice K
%
%
%Massimo Davini 26/05/99 --- revised 31/05/99

global stack;
stack.simulation=[];
stack.evaluation=[];
stack.general.K_flag=0;

A=stack.general.A;
B=stack.general.B;
C=stack.general.C;
D=stack.general.D;
plant=pck(A,B,C,D);
[ty,no,ni,ns]=minfo(plant);

Q=stack.temp.Q;
R=stack.temp.R;

M=stack.temp.modello;   %model
[Am,Bm,Cm,Dm]=unpck(M);


if strcmp(tipo,'EMFC')       %CONTROLLORE EMFC

     %costruzione di un sistema aumentato costituito 
     %dal sistema e dal modello;

     Atilde=daug(A,Am);
     Btilde=[B;zeros(size(Am,1),size(B,2))];   
                 %matrice B del sistema aumentato
                 %consideriamo solo gli ingressi del sistema
                 %e non quelli del modello,che non sono disponibili
     Ctilde=daug(C,Cm);
     Dtilde=[D;zeros(size(Cm,1),size(B,2))];

     %l'indice di costo da minimizzare  dato da :
     %       J=integral( (y-ym)'Q(y-ym) +u'Ru )dt
     %con y uscite del sistema con gli integratori e ym uscite del modello.
     %Dalle equazioni di uscita otteniamo ( I SISTEMI DEVONO ESSERE PROPRI , CON D=0 ) :
     %        J=integral( x'[Caug - Cm]'Q [Caug - Cm] x +u'Ru )dt
     %con x =[ x stati del sistema,xm stati delmodello]'.
     
     %legge di controllo per l'inseguimento:
     %U=(U*)+kfb*(X*)+kff*(Xm*)-kfb*X-kff*Xm
     
     CC=[C -Cm];
     Qtilde=CC'*Q*CC;

     %state feedback degli stati (sistema + modello)
     kk=lqr(Atilde,Btilde,Qtilde,R);

     %state feedback del sistema
     Kfb=kk(:,1:size(A,1));

     %state feedback del modello
     Kff=kk(:,size(A,1)+1:size(kk,2));
     
     %output feedback del sistema
     K=Kfb*pinv(C-D*Kfb);         %controllore per la valutazione

elseif strcmp(tipo,'IMFC')     %CONTROLLORE IMFC

     %l'indice di costo da minimizzare  dato da :
     %    J=integral( (dy/dt-dym/dt)'Q(dy/dt-dym/dt) +u'Ru )dt
     %con y uscite del sistema con gli integratori e ym uscite del modello
     %e dym/dt=Am*ym ( Cm=I => xm=ym ).
     %Dalle equazioni otteniamo ( I SISTEMI DEVONO ESSERE PROPRI , CON D=0 ) :
     %    J=integral( x'*Qi*x + 2*x'*Si*u + u'*Ri*u )dt
     %con Qi,Si e Ri indicate sotto 

     %legge di controllo per l'inseguimento:
     %U=(U*)+kfb*(X*)-kfb*X
     
     T=C*A-Am*C;
     Qi=T'*Q*T;
     Si=B'*C'*Q*T;
     Ri=R+B'*C'*Q*C*B;
     
     %state feedback del sistema
     Kfb=lqr(A,B,Qi,Ri,Si');

     %output feedback del sistema
     K=Kfb*pinv(C-D*Kfb);         %controllore per la valutazione

end;


if ~isempty(K)
  set(findobj('tag','eval_31'),'enable','on');
  set(findobj('tag','simu_2'),'enable','on');
  
  [Ak,Bk,Ck,Dk]=unpck(K);
  
  stack.general.K_flag=1;
  
  %aggiornamento stack per la valutazione 
  stack.evaluation.model=stack.general.model; %nome modello 
  stack.evaluation.kind=lower(tipo);       %tipo del regolatore 
  stack.evaluation.K=K;                    %regolatore
  stack.evaluation.plant=plant;            %plant

  %aggiornamento stack per simulazione  
  stack.simulation.kind=lower(tipo);  %tipo del regolatore 
  stack.simulation.Ak=Ak;             %regolatore
  stack.simulation.Bk=Bk;             %regolatore
  stack.simulation.Ck=Ck;             %regolatore
  stack.simulation.Dk=Dk;             %regolatore
  stack.simulation.Am=Am;             %modello
  stack.simulation.Bm=Bm;             %modello
  stack.simulation.Cm=Cm;             %modello
  stack.simulation.Dm=Dm;             %modello
  if strcmp(tipo,'EMFC')
     stack.simulation.Kfb=Kfb;
     stack.simulation.Kff=Kff;
     Gm0=Cm*inv(-Am)*Bm+Dm;
     stack.simulation.Kpf0=Kff*inv(Am)*Bm*Gm0;   
  elseif strcmp(tipo,'IMFC')
     stack.simulation.Kfb=Kfb;
  end;
  
  set(findobj('tag','file_6'),'enable','on');
  set(findobj('tag','BEVAL'),'enable','on');
  set(findobj('tag','BSIMU'),'enable','on');
  drawnow;
  set(gcbo,'visible','off'); 
  
end;

Contact us