% Controllo Digitale A.A. 2006/2007
% Titolare del corso: Prof. Alberto Bemporad
% Esercitazioni:      Ing. Alessandro Alessio
%
% BREVE GUIDA a CONTROL SYSTEM TOOLBOX

% Authors: N. Giorgetti (May 12, 2003), A. Alessio (June 12, 2007)
%
% Il Control System Toolbox (CST) e' un'insieme di funzioni utili per
% l'analisi ed il controllo di sistemi dinamici. Molte delle funzioni
% fornite dal toolbox sono scritte come file-M.
%
% I sistemi dinamici possono essere modellati in diverse forme come
% funzioni di trasferimento (tf), rappresentazioni in spazio di stato
% (ss), e guadagno-poli-zeri (zpk). Il CST consente di modellare i
% sistemi dinamici in una di queste forme e passare automaticamente
% dall'una all'altra. In modo altrettanto semplice si possono trattare i
% sistemi dinamici sia TC che TD.
%
% Il CST e' estendibile nel senso che possono essere sviluppate altre
% funzioni a partire da quelle predefinite.
%
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % 
%
% RAPPRESENTAZIONI DEI SISTEMI LINEARI
% 
%         Spazio di stato:
%
%  La rappresentazione in spazio di stato viene fatta con la funzione
% "ss". Sintassi:
%                 sys=ss(A,B,C,D)
%
% 'sys' rappresenta un Sistema Lineare Tempo Continuo in forma di spazio
%  di stato. Le matrici di transizione di stato e di uscita sono memorizzate 
%  rispettivamente in (sys.a, sys.b, sys.c, sys.d).
%  
%  Per ottenere lo stesso Sistema Lineare a Tempo Discreto, basta indicare
% il tempo di campionamento (Ts) del sistema come ultimo argomento 
% della funzione. Sintassi:
%
%                 sys_td=ss(A,B,C,D,Ts)
% 
% 'sys_td' e' un sistema lineare a tempo discreto con tempo di campionamento Ts.
%
%
%
%        Funzione di Trasferimento:
%
%  sys = tf(NUM,DEN) crea una funzione di trasferimento Tempo Continua SYS con
%  numeratore NUM(s) e denominatore DEN(s).  NUM, e DEN sono due vettori che contengono
%  i coefficienti dei polinomi di Laplace che definiscono la funzione di trasferimento.
% 
%  ad es.:
%  
%  per definire in Matlab la funzione di trasferimento
%
%                      G(s)=(s + .5) / (s^2 + .3 s)
%
%  si definiscono prima i vettori:
    
                   num=[1 .5];
                  den=[1 .3 0];
 
%  e successivamente si definisce la funzione di trasferimento:
     
                  sys_tf=tf(num,den).
 
%  E' possibile convertire    sys_tf    in forma di stato utilizzando 
% il comando ss:
                  sys_ss=ss(sys_tf)
%
% N.B.> E' possibile passare da sys_ss a sys_tf con la funzione tf.
%
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % 
%
% CST memorizza le informazioni relative ad un sistema lineare in una
% struttura dati detta oggetto LTI. Per avere informazioni sull'oggetto
% LTI del modello utilizzare il comando "get":

                 get(sys_td); get(sys); get(sys_tf);

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % 
%
% CONVERSIONI CONTINUE/DISCRETE
%
% Il CST mette a disposizione i seguenti comandi per convertire un
% sistema da continuo a discreto e viceversa:

  sysd=c2d(sysc,Ts);  % da continuo a discreto con tempo di campionamento Ts
  sysc=d2c(sysd);     % da discreto a continuo
  sysd2=d2d(sysd,Ts2);% campionamento del sistema TD con un altro Ts

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % 
%
% ANALISI DEI SISTEMI
%
% E' presente un'interfaccia grafica: ltiview
% Con questa interfaccia e' possibile analizzare il comportamento del
% sistema soggetto ad un gradino (step), all'impulso (impulse), vedere
% le risposte in frequenza, la posizione dei poli e degli zeri ecc...
% Si rimanda all'help per maggiori informazioni.
%
% SIMULAZIONE DI SISTEMI LINEARI
%
%   Risposta libera:
%
%  initial(sys,x0) plotta la risposta libera del modello in forma di Spazio di Stato 
%    SYS (creato con il comando SS) con condizione iniziale x(0) = x0 .  
%
%   Risposta completa:   
%
%  lsim(sys,u,T,X0) plotta la risposta di sistemi LTI ad un determinato ingresso U a
% partire da una condizione iniziale X0 lungo un orizzonte temporale T.
%        
%  N.B.> il vettore T e' definito come   T=istante_iniz:Ts:istante_finale
%        ad es: T=0:.1:5 (per sistemi a Tempo Continuo basta usare un Ts molto piccolo
%			 per ottenere una simulazione abbastanza fedele al comportamento
%			 reale del sistema)
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % 
%
%
% RAGGIUNGIBILITA'/ CONTROLLABILITA'/STABILIZZABILITA'
%
% La matrice di raggiungibilita' di un sistema TC viene calcolata con la
% funzione ctrb. 
%
% Ad esempio:

   A=[0 -1 1;
   0.1 -0.5 0.5;
   -0.1 0.5 -0.5];
   
   B=[0 0.1 0]';
   C=[0 0 1];
   D=[0];
   
   sys=ss(A,B,C,D)

   R=ctrb(sys)
   rank(R)


% Se il sistema non e' completamente raggiungibile una decomposizione
% canonica di raggiungibilita' puo' essere ottenuta con il comando ctrbf.
%
% ATTENZIONE:
%    Con questo comando la parte non raggiungibile si trova nell'angolo in alto a
%    sinistra (e non in basso a destra). 
% Ad esempio:

    A=[1 1 1;
       1 1 1;
       0 1 1];
   
   B=[1 1;
      1 1;
      1 1];

   C=[1 0 0];

   [Abar, Bbar, Cbar, T]=ctrbf(A,B,C)

% 
% Le matrici (A,B) decomposte in forma canonica diventano:

Abar =

         0         0         0
    0.5774    0.3333   -0.4714
    0.4082    0.2357    2.6667

 Bbar =

          0         0
          0         0
    -1.7321   -1.7321

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % 
%
% POLE PLACEMENT
% 
% Entrambi i comandi:

         K = place(A,B,P) 
         K = acker(A,B,P)

% calcolano una matrice K in modo tale che gli autovalori di
%  A-B*K siano quelli specificati nel vettore P.
% Ad es.

         A=[1 -1 0; 
            0  1 2; 
            1  1 1];

	 B=[0; 0; 1];

%  Gli autovalori del sistema in anello aperto sono instabili, infatti:

	eig(A)

%  produce

   ans =

      1.8846 + 0.5897i
      1.8846 - 0.5897i
     -0.7693  

% Si scelgono di piazzare i poli in (- 2; -3.5; -.8)

    K = place(A,B,[-2; -3.5; -.8]) 

% Il controllore ottenuto e'

	K =  -11.1500   14.5000    9.3000
%
% Gli autovalori in anello chiuso sono:

	eig(A-B*K)


	ans =

	   -0.8000
   	   -2.0000
   	   -3.5000

% N.B.> i comandi PLACE e ACKER piazzano i poli del sistema in anello chiuso
%       in P, indipendentemente dal fatto che la coppia (A,B) rappresenti
%       un sistema a Tempo Continuo o a Tempo Discreto. E' compito del 
%       progettista scegliere i poli in maniera adeguata a seconda del sistema
%       che si voglia controllare.
% 
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % 
% 
% CONTROLLO   LQR 
%
% Il comando

    [Klqr,P,E] = dlqr(A,B,Q,R)  

%  calcula la matrice  Klqr  in modo tale che la legge controllo  u[n] = -Klqr*x[n]  
%  minimizzi la funzione di costo J = Sum {x'Qx + u'Ru}.
%  Dove (A,B) rappresentano le matrici di transizione di stato di un sistema Lineare 
%  Tempo Discreto:  x[n+1] = Ax[n] + Bu[n].
%  La matrice  P  e' la soluzione dell'equazione algebrica di Riccati e 
%  il vettore  E  contiene gli autovalori ad anello chiuso   (A-B*Klqr).
%
% Ad es., proviamo a progettare una legge di controllo LQR dove pesiamo gli stati 10 volte 
%	  in piu' dell'ingresso : 
	
	Q=eye(3);
	R=0.1;
	
        A=[1 -1 0; 
            0  1 2; 
            1  1 1];

        B=[0; 0; 1];


        [Klqr,P,E] = dlqr(A,B,Q,R)  

% Otteniamo

	Klqr =

	    0.7362    1.9973    2.4861

	P =

	         4.2594   -5.1842   -4.0704
        	-5.1842   12.3833   11.7991
   		-4.0704   11.7991   15.7115

	E =

	  -0.1527          
   	   0.3333 + 0.1146i
           0.3333 - 0.1146i

% Infatti:

        eig(A-B*Klqr)

% produce

	ans =

	   0.3333 + 0.1146i
	   0.3333 - 0.1146i
	  -0.1527   

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % 
% RIFERIMENTI BIBLIOGRAFICI
%
% Control System Toolbox Getting started
%
% Il comando 'help'