„Szabályozástechnika - Diszkrétidejű állapotteres szabályozók tervezése” változatai közötti eltérés

A VIK Wikiből
Mp9k1 (vitalap | szerkesztései)
a typo
Szikszayl (vitalap | szerkesztései)
aNincs szerkesztési összefoglaló
 
(11 közbenső módosítás, amit egy másik szerkesztő végzett, nincs mutatva)
10. sor: 10. sor:


== A mechanikai lengőrendszer leírása ==
== A mechanikai lengőrendszer leírása ==
<syntaxhighlight lang="matlab" style="font-size: 150%;">
<syntaxhighlight lang="matlab" style="font-size: 140%;">


%% Állapotteres szabályozás diszkrét időben
%% Állapotteres szabályozás diszkrét időben


%% Mechanikai lengőrendszer leírása
%% Mechanikai lengőrendszer leírása
</syntaxhighlight>
[[File:szabtech_mechanikai_lengőrendszer_ábra.JPG]]
<syntaxhighlight lang="matlab" style="font-size: 140%;">


% A rendszer paraméterei  
% A rendszer paraméterei  
40. sor: 44. sor:


</syntaxhighlight>
</syntaxhighlight>
== Állapotvisszacsatolás tervezése ==
== Állapotvisszacsatolás tervezése ==
<syntaxhighlight lang="matlab" style="font-size: 150%;">
 
<syntaxhighlight lang="matlab" style="font-size: 140%;">
% Az állapotteres szabályzás alapelve, hogy a zárt körben előre meghatározott pólusokat szeretnénk.
% Ezek általában egy domináns komplex konjugált póluspár (zdom1 és zdom2 - ez határozza meg a tranzienseket),
% és megfelelő számú, a domináns póluspárnál 3-5ször gyorsabb pólus (zcinf).
% Ezekből a segédpólusokból n-2 darabra van szükség, ahol n az állapotváltozók száma.
% Ezt a kívánt póluselrendezést úgy érhetjük el, hogy a bemenetre egy K erősítésvektoron keresztül negatívan
% visszacsatoljuk az állapotváltozókat, azaz u = -K*x. Ha ezt behelyettesítjük a rendszer állapotegyenletébe,
% akkor x[k+1] = Phi*x[k] + Gamma*u[k] = Phi*x[k] + Gamma*(-K*x[k]) = (Phi-Gamma*K)*x[k] lesz a módosult
% rendszer állapotegyenlete. Látható hogy úgy kell a K értékét megválasztani, hogy az Phi-Gamma*K módosult
% rendszermátrix sajátértékei éppen az általunk előírt pólusok legyenek. Az ehhez szükséges K erősítés
% SOR-vektor az Ackermann képlettel egyszerűen meghatározható.
%
% Az állapot-visszacsatolást tartalmazó szabályzó hatásvázlata:
</syntaxhighlight>
 
[[File:szabtech_DI_állapot-visszacsatolás_ábra.JPG]]
 
<syntaxhighlight lang="matlab" style="font-size: 140%;">


% Gyorsabb, de jobban csillapított zárt kört szeretnénk - az előírásokat
% Gyorsabb, de jobban csillapított zárt kört szeretnénk - az előírásokat
54. sor: 77. sor:
sdom2=conj(sdom1);
sdom2=conj(sdom1);


% Áttérés z-re
% Áttérés z-re az ismert z = exp(s*Ts) képlet alapján
zdom1=exp(sdom1*Ts);
zdom1=exp(sdom1*Ts);
zdom2=exp(sdom2*Ts);
zdom2=exp(sdom2*Ts);
62. sor: 85. sor:
% akkor n-2 multiplicitással a zcinf pólusok is
% akkor n-2 multiplicitással a zcinf pólusok is
phic=[zdom1 zdom2];
phic=[zdom1 zdom2];
% A zárt kör karakterisztikus polinomja
polyphic=poly(phic);


% Az irányíthatóság ellenőrzése
% Az irányíthatóság ellenőrzése
82. sor: 107. sor:


</syntaxhighlight>
</syntaxhighlight>
== Alapjel miatti korrekció ==
<syntaxhighlight lang="matlab" style="font-size: 140%;">
% Amikor az állapot-visszacsatolás 0-ba (alaphelyzetbe) viszi a rendszert, a beavatkozó jel is 0 lesz,
% azaz beáll a stabilis egyensúlyi állapot. Azonban a szabályozásnak nem feltétlenül az a célja,
% hogy 0-ba irányítsunk, hanem célszerű, ha alapjelet is tud követni az eszköz. Ehhez az állapot-visszacsatolót
% "átverjük", az alábbi hatásvázlatnak megfelelően (Nx - oszlopvektor, Nu - skalár):
</syntaxhighlight>
[[File:szabtech_DI_alapjel_miatti_korrekció_ábra.JPG]]
<syntaxhighlight lang="matlab" style="font-size: 140%;">
% Adott a szakaszunk állapotegyenletei: x[k+1] = Phi*x[k] + Gamma*u[k] és y[k] = C*x[k] (legyen D=0)
% Egységugrás alapjel követése esetén célunk, hogy állandósult állapotban a kimenet 1 értékű legyen.
% Továbbá tudjuk, hogy állandósult állapotban, azaz "végtelenben" x[k+1] = x[k]
% A hatásvázlatról látszik, hogy állandósult állapot esetén a K erősítő bemenetén 0 kell, hogy legyen.
% Ekkor x[k] = Nx*r[k] = Nx, mivel r[k]=1 egységugrás alapjel esetén.
% Ha azonban a K bemenete 0, akkor a kimenete is 0, így u[k] = Nu*r[k] = Nu.
% Ezek lapján felírható az alábbi egyenletrendszer:
%
% x[k] = Phi*x[k] + Gamma * u[k]  --> 0 = (Phi-I)*x[k] + u[k]
% 1    = C  *x[k]
%
% Behelyettesítve x[k]=Nx és u[k]=Nu értékeket és az egyenleteket mátrixos alakba átírva:
%
% ( Phi-I  Gamma )  ( Nx )  ( 0 )
% (  C      0  ) * ( Nu ) = ( 1 )
%
% Melyből már kapásból adódik az Nx és Nu erősítések:
%
% ( Nx )  ( Phi-I  Gamma )^-1  ( 0 )
% ( Nu ) = (  C      0  )    * ( 1 )
% A keresett erősítésvektor meghatározása:
% FIGYELEM: Eltérés a folytonos időtől, hogy itt Phi-eye(n) szerepel első elemként.
N=inv([Phi-eye(2) Gamma; C 0])*[0;0;1];
% Az oszlopvektorba n darab nullát kell pakolni és a végére egyetlen 1-est.
% Az Nx-et és Nu-t tartalmazó vektor szétválasztása
Nx=N(1:2) % Annyi elem, ahány állapotunk van (n)
Nu=N(end) % Skalár
% A megfelelő Simulink-modell megnyitása
open('discrete_3');
% Várakozás billentyűlenyomásra
pause
</syntaxhighlight>
== Állapotmegfigyelő tervezése ==
== Állapotmegfigyelő tervezése ==
<syntaxhighlight lang="matlab" style="font-size: 150%;">
 
<syntaxhighlight lang="matlab" style="font-size: 140%;">
 
% Az állapot-visszacsatolásnál minden egyes időpillanatban szükségünk van az állapotok aktuális értékeire.
% Ez a gyakorlatban mérésekkel lenne megvalósítható, ám ez nem mindig lehetséges, vagy ha lehetséges,
% akkor csak nagyon drágán. Éppen ezért használunk állapotmegfigyelőt, ami képes minden időpillanatban
% nagyon jó közelítéssel előállítani az állapotok aktuális értékeit, a szakasz kimenetének (y) és
% bemenetének (u) ismeretében.
% A megfigyelő maga is egy lineáris diszkrét idejű rendszer, melynek differenciaegyenlete:
% xhat[k] = F * xhat[k-1] + G * y[k] + H *u[k-1]
% Ahol xhat a becsült állapotok OSZLOP-vektora, valamint dim{xhat}=dim{x}=n.
% Továbbá éljünk az F = Phi-G*C*Phi és H = Gamma-G*C*Gamma választással.
% A becslés hibájára (xtilde = xhat - x) így az alábbi differenciaegyenlet adódik: xtilde[k+1] = F * xtilde[k]
% Látható, hogy az F mátrix sajátértékei fogják meghatározni, hogy milyen gyorsan csengjenek le a megfigyelés
% tranziensei, azaz hogy milyen pontos legyen a megfigyelésünk. Így szeretnénk ha az F mátrix sajátértékei az
% általunk előírt gyorsaságú (a domináns póluspárnál ~5ször gyorsabb) zoinf pólusok lennének.
% phio(z) = det (zI - F) = det (zI-(Phi-G*C*Phi)) = det (zI-(Phi'-Phi'*C'*G')
% A fenti egyenlőség azért igaz, mivel egy rendszer és annak duálisának azonos a karakterisztikus polinomja.
% Így visszavezettük a feladatot egy fiktív rendszerhez történő állapot-visszacsatolás (K2=G') megtervezésére,
% mely fiktív rendszer rendszermátrixa Phi' (Phi transzponált), bemeneti erősítésvektora pedig
% Phi'*C' (Phi transzponált * C transzponált).
% Ezek ismeretében az állapotmegfigyelő G vektora (vagyis annak transzponáltja) már számítható az
% Ackermann képlettel.
%
% Az állapotmegfigyelőt is tartalmazó állapot-visszacsatolásos szabályzó hatásvázlata:
</syntaxhighlight>
 
[[File:szabtech_DI_állapotmegfigyelő_ábra.JPG]]
 
<syntaxhighlight lang="matlab" style="font-size: 140%;">


% A megfigyelő sajátértéke s-ben
% A megfigyelő sajátértéke s-ben
91. sor: 200. sor:
zoinf=exp(soinf*Ts);
zoinf=exp(soinf*Ts);


% A megfigyelő karakterisztikus gyökei: soinf megfelelő multiplicitással (n)
% A megfigyelő karakterisztikus polinomjának gyökei - zoinf megfelelő multiplicitással (n)
phio=[zoinf zoinf]
phio=[zoinf zoinf]
% A megfigyelő karakterisztikus polinomja
polyphio=poly(phio)


% A megfigyelhetőség ellenőrzése
% A megfigyelhetőség ellenőrzése
Mo=obsv(Phi,C); % A megfigyelhetőségi mátrix...
Mo=obsv(Phi,C); % A megfigyelhetőségi mátrix...
rank(Mo)     % ... és rangja
rank(Mo)       % ... és rangja
% Ha rank(Mo)=n, akkor a rendszer megfigyelhető
% Ha rank(Mo)=n, akkor a rendszer megfigyelhető!


% Megfigyelő tervezése - VIGYÁZAT: Itt a paraméterezés nem analóg a folytonos esettel!
% Megfigyelő tervezése - VIGYÁZAT: Itt a paraméterezés nem analóg a folytonos esettel!
G=acker(Phi',Phi'*C',phio)'
G=acker(Phi',Phi'*C',phio)'
F=Phi-G*C*Phi
F=Phi-G*C*Phi
H=Gamma-G*C*Gamma;
H=Gamma-G*C*Gamma


% A megfelelő Simulink-modell megnyitása
% A megfelelő Simulink-modell megnyitása
111. sor: 222. sor:
% ^          ^
% ^          ^
% x[k] = F * x[k-1] + G * y[k] + H * u[k-1]
% x[k] = F * x[k-1] + G * y[k] + H * u[k-1]
 
%
% FIGYELEM: Mivel aktuális megfigyelőt terveztünk, így az y[k] nincs késleltetve!
% FIGYELEM: Mivel aktuális megfigyelőt terveztünk, így az y[k] nincs késleltetve!


119. sor: 230. sor:


</syntaxhighlight>
</syntaxhighlight>
== Alapjel miatti korrekció ==
<syntaxhighlight lang="matlab" style="font-size: 150%;">


% Tervezés
== Terhelésbecslő tervezése ==
% n*n-es egységmátrix, és az oszlopvektorban n darab nulla,
% majd fixen 1 darab egyes.
% FIGYELEM! eltérés a folyotonos időtől: '-eye(2)'
NxNu=inv([Phi-eye(2) Gamma; C 0])*[0;0;1];


% Az Nx-et és Nu-t tartalmazó vektor szétválasztása
<syntaxhighlight lang="matlab" style="font-size: 140%;">
Nx=NxNu(1:2) % Annyi elem, ahány állapotunk van (n)
Nu=NxNu(end) % Skalár


% A megfelelő Simulink-modell megnyitása
% Tegyük fel, hogy a bemenetre rárakódik egy szakaszosan hosszú ideig konstans zaj. Az állapotmegfigyelővel
open('discrete_3');
% ezt is becsülni tudjuk és ezt a becsült értéket kivonhatjuk a bemenetből (beavatkozó jelből), így
% kompenzálhatjuk a zavarás hatását. Ezt úgy oldjuk meg, hogy a zajt egy új állapotváltozónak (xd) tekintjük.
% Mivel a zaj szakaszosan hosszú ideig konstans, ezért xd[k+1]=xd[k], a bemenettől pedig független, ezért a
% differenciaegyenlete: xd[k+1] = 0*x[k] + xd[k] + 0*u[k]. Viszont a többi változó differenciaegyenletébe már
% beleszól az xd zavarást modellező fiktív állapotváltozó, méghozzá a Gamma bemeneti mátrixon keresztül:
% x[k+1] = Phi*x[k] + Gamma*( xd[k]+u[k] )
% Tehát a kibővített rendszerünk állapotegyenletei:
%
% ( x[k+1]  )  ( Phi  Gamma )  ( x[k]  )  ( Gamma )
% ( xd[k+1] ) = (  0      1  ) * ( xd[k] ) + (  0  ) * u[k]
%
%                          ( x[k]  )
%    y[k]    = ( C  0 ) * ( xd[k] )
%
% Új jelöléseket bevezetve a kibővített rendszerünk állapotegyenletei:
%
% xtilde[k+1] = Phitilde * xtilde[k] + Gammatilde * u[k]
%    y[k]    = Ctilde  * xtilde[k]
%
% Tehát az állapotmegfigyelőnket most ehhez a kibővített "tilde" rendszerhez kell megterveznünk.
% A módosult állapotmegfigyelő differenciaegyenlete a hatásvázlatról leolvasható!
% Az terhelésbecslővel kiegészített szabályzó hatásvázlata:
</syntaxhighlight>


% Várakozás billentyűlenyomásra
[[File:szabtech_DI_terhelésbecslő_ábra.JPG]]
pause


</syntaxhighlight>
<syntaxhighlight lang="matlab" style="font-size: 140%;">
 
== Terhelésbecslő tervezése ==
<syntaxhighlight lang="matlab" style="font-size: 150%;">


% A kibővített rendszer mátrixai
% A kibővített rendszer mátrixai
Phitilde=[Phi Gamma; 0 0 1]; % n darab nulla és fixen 1 darab egyes (SISO)
Phitilde=[Phi Gamma; 0 0 1]; % n darab nulla és fixen 1 darab egyes (SISO)
Gammatilde=[Gamma;0]; % Fixen 1 darab nulla a végére (SISO)
Gammatilde=[Gamma;0];       % Fixen 1 darab nulla a végére (SISO)
Ctilde=[C 0]; % Fixen 1 darab nulla a végére (SISO)
Ctilde=[C 0];               % Fixen 1 darab nulla a végére (SISO)


% A megfigyelő sajátértékeit tartalmazó vektorban soinf most egyel nagyobb
% A megfigyelő sajátértékeit tartalmazó vektorban zoinf most egyel nagyobb
% multiplicitással szerepel, hiszen felvettünk egy új (fiktív) állapotot
% multiplicitással szerepel (n+1), hiszen felvettünk egy új (fiktív) állapotot
phiotilde=[zoinf zoinf zoinf];
phiotilde=[zoinf zoinf zoinf];


161. sor: 281. sor:
% A megfelelő Simulink-modell megnyitása
% A megfelelő Simulink-modell megnyitása
open('discrete_4');
open('discrete_4');
% t=10 secnél egy egységugrás jellegű zavarás adódik a szakasz bemenetére.
% A modellben a K,Nu és Nx paraméterek ugyanazok, mint amiket korábban meghatároztunk.
% FONTOS: A Simulink alapból 10 secundumig számol, szóval ezt az időt át kell írni 20-ra az ablak tetején!


% Várakozás billentyűlenyomásra
% Várakozás billentyűlenyomásra
169. sor: 292. sor:


== Integráló szabályozás tervezése ==
== Integráló szabályozás tervezése ==
<syntaxhighlight lang="matlab" style="font-size: 150%;">
 
<syntaxhighlight lang="matlab" style="font-size: 140%;">
 
% Az integráló szabályzó célja a zavarelnyomás és a paraméterbizonytalanságok kiküszöbölése. Ezt úgy érjük el,
% hogy új állapotként felvesszük a kimenet integrálját: xI = integrál (0->t) y(tau) dtau
% Ebből a baloldali téglalap szabályt (LSR) alkalmazva: xI[k+1] = xI[k] + T*y[k] = xI[k] + T*C*x[k]
% Ezzel már felírhatók a kibővített rendszer állapotegyenletei:
%
% ( x[k+1]  )  ( Phi  0 )  ( x[k]  )  ( Gamma )
% ( xIfk+1] ) = ( T*C  1 ) * ( xI[k] ) + (  0  ) * u[k]
%
%                            ( x[k]  )
%    y[k]    = ( C  0 )  * ( xI[k] )
%
% Új jelöléseket bevezetve a kibővített rendszerünk állapotegyenletei:
%
% xi[k+1] = Phii * xi[k] + Gammai * u[k]
%  y[k]  = Ci  * xi[k]
%
% Most ehhez a kibővített rendszerhez kell egy új Ktilde = [Kt Ki] állapot-visszacsatolást megterveznünk.
% Az integráló hatást is tartalmazó szabályzó hatásvázlata:
</syntaxhighlight>
 
[[File:szabtech_DI_integráló_ábra.JPG]]
 
<syntaxhighlight lang="matlab" style="font-size: 140%;">


% A kibővített rendszer mátrixai
% A kibővített rendszer mátrixai
% n*1-es nullmátrix, a végén fixen 1 darab egyes (SISO)
Phii=[Phi zeros(2,1);C*Ts 1]; % Az első sorban n*1-es nullmátrix
Phii=[Phi zeros(2,1);C*Ts 1];
                              % A második sorban fixen 1 darab nulla (SISO)
Gammai=[Gamma;0];
Gammai=[Gamma;0];             % Fixen 1 darab nulla a végére


% Az integrátor állapotának s=-3-nak megfelelő sajátértéket írunk elő
% Az integrátor állapotának s = -3 folytonosidejű pólusnak megfelelő sajátértéket írunk elő
phictilde=[zdom1 zdom2 exp(-3*Ts)];
phictilde=[zdom1 zdom2 exp(-3*Ts)];


183. sor: 331. sor:


% Az állapotvisszacsatolás vektorának felbontása
% Az állapotvisszacsatolás vektorának felbontása
Kt=Ktilde(1:2); % Annyi eleme van, ahány valódi állapotunk
Kt=Ktilde(1:2); % Annyi eleme van, ahány valódi állapotunk (n)
Ki=Ktilde(3);  % Skalár  
Ki=Ktilde(3);  % Skalár  


% A megfelelő Simulink-modell megnyitása
% A megfelelő Simulink-modell megnyitása
open('discrete_5');
open('discrete_5');
% Ebben nincs terhelésbecslő, hiszen mind a terhelésbecslő, mind
% Vigyázat ez itt a terhelésbecslő nélküli modell továbbfejlesztése.
% az integrátor zavarelnyomási célokat szolgál, így a kettő együtt felesleges
% Az integráló szabályozás is a bemenetre szuperponálódott zavarjelek kiküszöbölésére való.
% Itt Nu helyett egy Ki erősítés van és egy integrátor, valamint K helyett Kt !!!


% Várakozás billentyűlenyomásra
% Várakozás billentyűlenyomásra
197. sor: 346. sor:
</syntaxhighlight>
</syntaxhighlight>


[[Category:Villanyalap]]
[[Kategória:Villamosmérnök]]

A lap jelenlegi, 2014. március 13., 17:18-kori változata

Simulink modellek

Simulink modellek

  1. Töltsd le!
  2. Csomagold ki!
  3. Másold be a Matlab aktuális munkakönyvtárába!

A mechanikai lengőrendszer leírása

%% Állapotteres szabályozás diszkrét időben

%% Mechanikai lengőrendszer leírása

% A rendszer paraméterei 
m=2;    % A test tömege
k=0.75;  % Rugóállandó
b=0.25; % Csillapítás  

% A folytonos idejű állapotteres leírás mátrixai:

Ac = [0 1; -k/m -b/m]
Bc = [0; 1/m]
Cc = [1 0]
Dc = 0

sys=ss(Ac,Bc,Cc,Dc); % A folytonos idejű rendszer összeállítása

Ts=0.2;                 % Mintavételi idő
dsys=c2d(sys,Ts,'zoh'); % Áttérés diszkrét időre

step(sys,dsys); % A folytonos és diszkrét idejű rendszer ugrásválasza

% A diszkrét idejű állapotteres leírás mátrixai:
[Phi,Gamma,C,D]=ssdata(dsys)

Állapotvisszacsatolás tervezése

% Az állapotteres szabályzás alapelve, hogy a zárt körben előre meghatározott pólusokat szeretnénk.
% Ezek általában egy domináns komplex konjugált póluspár (zdom1 és zdom2 - ez határozza meg a tranzienseket),
% és megfelelő számú, a domináns póluspárnál 3-5ször gyorsabb pólus (zcinf).
% Ezekből a segédpólusokból n-2 darabra van szükség, ahol n az állapotváltozók száma.
% Ezt a kívánt póluselrendezést úgy érhetjük el, hogy a bemenetre egy K erősítésvektoron keresztül negatívan
% visszacsatoljuk az állapotváltozókat, azaz u = -K*x. Ha ezt behelyettesítjük a rendszer állapotegyenletébe,
% akkor x[k+1] = Phi*x[k] + Gamma*u[k] = Phi*x[k] + Gamma*(-K*x[k]) = (Phi-Gamma*K)*x[k] lesz a módosult
% rendszer állapotegyenlete. Látható hogy úgy kell a K értékét megválasztani, hogy az Phi-Gamma*K módosult
% rendszermátrix sajátértékei éppen az általunk előírt pólusok legyenek. Az ehhez szükséges K erősítés
% SOR-vektor az Ackermann képlettel egyszerűen meghatározható.
%
% Az állapot-visszacsatolást tartalmazó szabályzó hatásvázlata:

% Gyorsabb, de jobban csillapított zárt kört szeretnénk - az előírásokat
% folytonos időben adjuk meg!
w0=1;
xi=0.8;

% A zárt kör sajátértékei s-ben
% Ha a rendszernek 2-nél több állpotváltozója van, akkor n-2 segédpólust
% (scinf) is fel kell vennünk, melyek 3-5ször gyorsabbak mint a domináns póluspár.
sdom1=-w0*xi+j*w0*sqrt(1-xi^2);
sdom2=conj(sdom1);

% Áttérés z-re az ismert z = exp(s*Ts) képlet alapján
zdom1=exp(sdom1*Ts);
zdom2=exp(sdom2*Ts);
% zcinf=exp(scinf*Ts);

% A zárt kör sajátértékeit tartalmazó vektor, valamint ha n>2,
% akkor n-2 multiplicitással a zcinf pólusok is
phic=[zdom1 zdom2];
% A zárt kör karakterisztikus polinomja
polyphic=poly(phic); 

% Az irányíthatóság ellenőrzése
Mc=ctrb(Phi,Gamma); % Az irányíthatósági mátrix...
rank(Mc)            % ... és rangja
% Ha rank(Mc)=n, akkor a rendszer irányítható

% Állapotvisszacsatolás tervezése az Ackermann-képlet segítségével
K=acker(Phi,Gamma,phic)

% A megfelelő Simulink-modell megnyitása
open('discrete_1');
% Ugyanaz az feladat, mint a folytonos esetben...
% VIGYÁZAT: Minden építőelemnél, ami nem a szakasz része, meg kell
% adni a Ts mintavételi periódusidőt!!!

% Várakozás billentyűlenyomásra
pause

Alapjel miatti korrekció

% Amikor az állapot-visszacsatolás 0-ba (alaphelyzetbe) viszi a rendszert, a beavatkozó jel is 0 lesz,
% azaz beáll a stabilis egyensúlyi állapot. Azonban a szabályozásnak nem feltétlenül az a célja,
% hogy 0-ba irányítsunk, hanem célszerű, ha alapjelet is tud követni az eszköz. Ehhez az állapot-visszacsatolót
% "átverjük", az alábbi hatásvázlatnak megfelelően (Nx - oszlopvektor, Nu - skalár):

% Adott a szakaszunk állapotegyenletei: x[k+1] = Phi*x[k] + Gamma*u[k] és y[k] = C*x[k] (legyen D=0)
% Egységugrás alapjel követése esetén célunk, hogy állandósult állapotban a kimenet 1 értékű legyen.
% Továbbá tudjuk, hogy állandósult állapotban, azaz "végtelenben" x[k+1] = x[k]
% A hatásvázlatról látszik, hogy állandósult állapot esetén a K erősítő bemenetén 0 kell, hogy legyen.
% Ekkor x[k] = Nx*r[k] = Nx, mivel r[k]=1 egységugrás alapjel esetén.
% Ha azonban a K bemenete 0, akkor a kimenete is 0, így u[k] = Nu*r[k] = Nu.
% Ezek lapján felírható az alábbi egyenletrendszer:
%
% x[k] = Phi*x[k] + Gamma * u[k]  --> 0 = (Phi-I)*x[k] + u[k]
% 1    = C  *x[k]
%
% Behelyettesítve x[k]=Nx és u[k]=Nu értékeket és az egyenleteket mátrixos alakba átírva:
%
% ( Phi-I   Gamma )   ( Nx )   ( 0 )
% (   C       0   ) * ( Nu ) = ( 1 )
%
% Melyből már kapásból adódik az Nx és Nu erősítések:
%
% ( Nx )   ( Phi-I   Gamma )^-1   ( 0 )
% ( Nu ) = (   C       0   )    * ( 1 )

% A keresett erősítésvektor meghatározása:
% FIGYELEM: Eltérés a folytonos időtől, hogy itt Phi-eye(n) szerepel első elemként.
N=inv([Phi-eye(2) Gamma; C 0])*[0;0;1];
% Az oszlopvektorba n darab nullát kell pakolni és a végére egyetlen 1-est.

% Az Nx-et és Nu-t tartalmazó vektor szétválasztása
Nx=N(1:2) % Annyi elem, ahány állapotunk van (n)
Nu=N(end) % Skalár

% A megfelelő Simulink-modell megnyitása
open('discrete_3');

% Várakozás billentyűlenyomásra
pause

Állapotmegfigyelő tervezése

% Az állapot-visszacsatolásnál minden egyes időpillanatban szükségünk van az állapotok aktuális értékeire.
% Ez a gyakorlatban mérésekkel lenne megvalósítható, ám ez nem mindig lehetséges, vagy ha lehetséges,
% akkor csak nagyon drágán. Éppen ezért használunk állapotmegfigyelőt, ami képes minden időpillanatban
% nagyon jó közelítéssel előállítani az állapotok aktuális értékeit, a szakasz kimenetének (y) és
% bemenetének (u) ismeretében.
% A megfigyelő maga is egy lineáris diszkrét idejű rendszer, melynek differenciaegyenlete:
% xhat[k] = F * xhat[k-1] + G * y[k] + H *u[k-1]
% Ahol xhat a becsült állapotok OSZLOP-vektora, valamint dim{xhat}=dim{x}=n.
% Továbbá éljünk az F = Phi-G*C*Phi és H = Gamma-G*C*Gamma választással.
% A becslés hibájára (xtilde = xhat - x) így az alábbi differenciaegyenlet adódik: xtilde[k+1] = F * xtilde[k]
% Látható, hogy az F mátrix sajátértékei fogják meghatározni, hogy milyen gyorsan csengjenek le a megfigyelés
% tranziensei, azaz hogy milyen pontos legyen a megfigyelésünk. Így szeretnénk ha az F mátrix sajátértékei az
% általunk előírt gyorsaságú (a domináns póluspárnál ~5ször gyorsabb) zoinf pólusok lennének.
% phio(z) = det (zI - F) = det (zI-(Phi-G*C*Phi)) = det (zI-(Phi'-Phi'*C'*G')
% A fenti egyenlőség azért igaz, mivel egy rendszer és annak duálisának azonos a karakterisztikus polinomja.
% Így visszavezettük a feladatot egy fiktív rendszerhez történő állapot-visszacsatolás (K2=G') megtervezésére,
% mely fiktív rendszer rendszermátrixa Phi' (Phi transzponált), bemeneti erősítésvektora pedig
% Phi'*C' (Phi transzponált * C transzponált).
% Ezek ismeretében az állapotmegfigyelő G vektora (vagyis annak transzponáltja) már számítható az
% Ackermann képlettel.
%
% Az állapotmegfigyelőt is tartalmazó állapot-visszacsatolásos szabályzó hatásvázlata:

% A megfigyelő sajátértéke s-ben
soinf=-5

% Áttérés z-tartományra
zoinf=exp(soinf*Ts);

% A megfigyelő karakterisztikus polinomjának gyökei - zoinf megfelelő multiplicitással (n)
phio=[zoinf zoinf]
% A megfigyelő karakterisztikus polinomja
polyphio=poly(phio)

% A megfigyelhetőség ellenőrzése
Mo=obsv(Phi,C); % A megfigyelhetőségi mátrix...
rank(Mo)        % ... és rangja
% Ha rank(Mo)=n, akkor a rendszer megfigyelhető!

% Megfigyelő tervezése - VIGYÁZAT: Itt a paraméterezés nem analóg a folytonos esettel!
G=acker(Phi',Phi'*C',phio)'
F=Phi-G*C*Phi
H=Gamma-G*C*Gamma

% A megfelelő Simulink-modell megnyitása
open('discrete_2');
% VIGYÁZAT: Itt nem lehet discrete state space objektumként megadni az állapotmegfigyelőt!
% Elemenként kell azt összeraknunk azt, a differenciaegyenlete alapján!
%
% ^          ^
% x[k] = F * x[k-1] + G * y[k] + H * u[k-1]
%
% FIGYELEM: Mivel aktuális megfigyelőt terveztünk, így az y[k] nincs késleltetve!

% Várakozás billentyűlenyomásra
pause

Terhelésbecslő tervezése

% Tegyük fel, hogy a bemenetre rárakódik egy szakaszosan hosszú ideig konstans zaj. Az állapotmegfigyelővel
% ezt is becsülni tudjuk és ezt a becsült értéket kivonhatjuk a bemenetből (beavatkozó jelből), így
% kompenzálhatjuk a zavarás hatását. Ezt úgy oldjuk meg, hogy a zajt egy új állapotváltozónak (xd) tekintjük.
% Mivel a zaj szakaszosan hosszú ideig konstans, ezért xd[k+1]=xd[k], a bemenettől pedig független, ezért a
% differenciaegyenlete: xd[k+1] = 0*x[k] + xd[k] + 0*u[k]. Viszont a többi változó differenciaegyenletébe már
% beleszól az xd zavarást modellező fiktív állapotváltozó, méghozzá a Gamma bemeneti mátrixon keresztül:
% x[k+1] = Phi*x[k] + Gamma*( xd[k]+u[k] )
% Tehát a kibővített rendszerünk állapotegyenletei:
%
% ( x[k+1]  )   ( Phi   Gamma )   ( x[k]  )   ( Gamma )
% ( xd[k+1] ) = (  0      1   ) * ( xd[k] ) + (   0   ) * u[k]
%
%                           ( x[k]  )
%    y[k]     = ( C   0 ) * ( xd[k] )
%
% Új jelöléseket bevezetve a kibővített rendszerünk állapotegyenletei:
%
% xtilde[k+1] = Phitilde * xtilde[k] + Gammatilde * u[k]
%    y[k]     = Ctilde   * xtilde[k]
%
% Tehát az állapotmegfigyelőnket most ehhez a kibővített "tilde" rendszerhez kell megterveznünk.
% A módosult állapotmegfigyelő differenciaegyenlete a hatásvázlatról leolvasható!
% Az terhelésbecslővel kiegészített szabályzó hatásvázlata:

% A kibővített rendszer mátrixai
Phitilde=[Phi Gamma; 0 0 1]; % n darab nulla és fixen 1 darab egyes (SISO)
Gammatilde=[Gamma;0];        % Fixen 1 darab nulla a végére (SISO)
Ctilde=[C 0];                % Fixen 1 darab nulla a végére (SISO)

% A megfigyelő sajátértékeit tartalmazó vektorban zoinf most egyel nagyobb
% multiplicitással szerepel (n+1), hiszen felvettünk egy új (fiktív) állapotot
phiotilde=[zoinf zoinf zoinf];

% Megfigyelőtervezés a kibővített rendszerhez
% Ugyanaz, mint az állapotmegfigyelőnél, csak most a 'tilde rendszerre
Gtilde=acker(Phitilde',Phitilde'*Ctilde',phiotilde)'
Ftilde=Phitilde-Gtilde*Ctilde*Phitilde;
Htilde=Gammatilde-Gtilde*Ctilde*Gammatilde;

% A megfelelő Simulink-modell megnyitása
open('discrete_4');
% t=10 secnél egy egységugrás jellegű zavarás adódik a szakasz bemenetére.
% A modellben a K,Nu és Nx paraméterek ugyanazok, mint amiket korábban meghatároztunk.
% FONTOS: A Simulink alapból 10 secundumig számol, szóval ezt az időt át kell írni 20-ra az ablak tetején!

% Várakozás billentyűlenyomásra
pause

Integráló szabályozás tervezése

% Az integráló szabályzó célja a zavarelnyomás és a paraméterbizonytalanságok kiküszöbölése. Ezt úgy érjük el,
% hogy új állapotként felvesszük a kimenet integrálját: xI = integrál (0->t) y(tau) dtau
% Ebből a baloldali téglalap szabályt (LSR) alkalmazva: xI[k+1] = xI[k] + T*y[k] = xI[k] + T*C*x[k]
% Ezzel már felírhatók a kibővített rendszer állapotegyenletei:
%
% ( x[k+1]  )   ( Phi   0 )   ( x[k]  )   ( Gamma ) 
% ( xIfk+1] ) = ( T*C   1 ) * ( xI[k] ) + (   0   ) * u[k]
%
%                             ( x[k]  )
%    y[k]     = ( C   0 )   * ( xI[k] )
%
% Új jelöléseket bevezetve a kibővített rendszerünk állapotegyenletei:
%
% xi[k+1] = Phii * xi[k] + Gammai * u[k]
%  y[k]   = Ci   * xi[k]
%
% Most ehhez a kibővített rendszerhez kell egy új Ktilde = [Kt Ki] állapot-visszacsatolást megterveznünk.
% Az integráló hatást is tartalmazó szabályzó hatásvázlata:

% A kibővített rendszer mátrixai
Phii=[Phi zeros(2,1);C*Ts 1]; % Az első sorban n*1-es nullmátrix
                              % A második sorban fixen 1 darab nulla (SISO)
Gammai=[Gamma;0];             % Fixen 1 darab nulla a végére

% Az integrátor állapotának s = -3 folytonosidejű pólusnak megfelelő sajátértéket írunk elő
phictilde=[zdom1 zdom2 exp(-3*Ts)];

% Állapotvisszacsatolás számítása
Ktilde=acker(Phii,Gammai,phictilde);

% Az állapotvisszacsatolás vektorának felbontása
Kt=Ktilde(1:2); % Annyi eleme van, ahány valódi állapotunk (n)
Ki=Ktilde(3);   % Skalár 

% A megfelelő Simulink-modell megnyitása
open('discrete_5');
% Vigyázat ez itt a terhelésbecslő nélküli modell továbbfejlesztése.
% Az integráló szabályozás is a bemenetre szuperponálódott zavarjelek kiküszöbölésére való.
% Itt Nu helyett egy Ki erősítés van és egy integrátor, valamint K helyett Kt !!!

% Várakozás billentyűlenyomásra
pause