% Sintesi mediante lo spazio di stato
% rif: traccia acclusa (AAEs1.pdf)

clear all,close all,echo on

% matrici del processo

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

% RETROAZIONE DALLO STATO: test di controllabilita'

P=ctrb(A,B)
pause

rank(P)
pause

% il sistema non e' completamente raggiungibile
% procediamo alla decomposizione strutturale

invT=[0 0 1; 0 1 0; 1 1 0]
T=inv(invT)

Atil=T*A*invT
Btil=T*B
pause

% il sottosistema non raggiungibile e' gia' caratterizzato dall'autovalore
% -2, non modificabile; il problema e' comunque risolubile
% estraiamo dunque le sottomatrici del sottosistema raggiungibile

A11til=Atil(1:2,1:2)
B1til=Btil(1:2)
pause

% usiamo la formula di Ackermann per calcolare una matrice K1til che assegni
% autovalori -2,-2 a A11til+B1til*K1til (cioe' alla parte raggiungibile)

% ATTENZIONE! Matlab assegna gli autovalori ad A-B*K, quindi dobbiamo cambiare 
% di segno la B se vogliamo assegnarli ad A+B*K

K1til=acker(A11til,-B1til,[-2,-2]) 

% qui di seguito due diverse scelte degli autovalori; verificarne l'effetto 
% mediante il file Simulink AAEs1Sim.mdl

% scommentare la riga seguente per una risposta molto pi� rapida
%K1til=acker(A11til,-B1til,[-20,-20]) 

% scommentare la riga seguente per un buon compromesso tra velocitˆ di 
% risposta e sforzo di controllo (in particolare, con questa scelta i tre
% autovalori ad anello chiuso sono in configurazione di Butterworth)
%K1til=acker(A11til,-B1til,[-1+1.73i,-1-1.73i])

pause

% Matlab dispone, oltre che della istruzione ACKER, anche della PLACE,
% che e' equivalente ma numericamente piu' stabile; essa pero' non consente 
% di assegnare autovalori di molteplicita' superiore al numero di ingressi

% completiamo la Ktil assegnandone arbitrariamente la terza componente,
% che non ha influenza sugli autovalori ad anello chiuso
% ad esempio, poniamola a zero

Ktil=[K1til 0]
pause

% verifichiamo

eig(Atil+Btil*Ktil)
pause

% la matrice K che agisce sullo stato in coordinate originarie e'

K=Ktil*T
pause

% verifichiamo ancora

eig(A+B*K)
pause

% se avessimo usato una diversa T (cioe' una diversa base per gli stati 
% raggiungibili e/o un diverso completamento?

invT_alt=[0 0 1; 0 1 0; 1 0 0]
T_alt=inv(invT_alt)

Atil_alt=T_alt*A*invT_alt
Btil_alt=T_alt*B
pause

% osserviamo come la STRUTTURA delle matrici sia la stessa
% estraiamo dunque le sottomatrici del sottosistema raggiungibile

A11til_alt=Atil_alt(1:2,1:2);
B1til_alt=Btil_alt(1:2);
pause

% e usiamo ancora la formula di Ackermann 

K1til_alt=acker(A11til_alt,-B1til_alt,[-2,-2])
pause

% e' ovviamente diversa dalla precedente K1til; pero', se la completiamo
% con una terza componente pari a zero 

Ktil_alt=[K1til_alt 0]
pause

% e torniamo in coordinate originarie 

K_alt=Ktil_alt*T_alt
pause

% abbiamo ottenuto la stessa K!
% si noti che scegliendo un diverso completamento, avremmo ottenuto una K_alt
% diversa da K, ma naturalmente ancora tale da assegnare gli autovalori 
% richiesti (si ricordi che le soluzioni sono infinite perche' l'autovalore
% in -2 non e' comunque modificabile)

% RETROAZIONE DALL'USCITA: si deve costruire un osservatore
% test di osservabilitˆ

Q=obsv(A,C)
pause

rank(Q)
pause  

% il sistema e' osservabile
% il calcolo della matrice G che caratterizza l'osservatore e' immediato
% risolviamo il problema ausiliario di assegnazione degli autovalori

K_aux=acker(A',C',[-2,-2,-2]);
G=K_aux'
pause

% verifichiamo

eig(A-G*C)
pause 
