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

A VIK Wikiből
Ugrás a navigációhoz Ugrás a kereséshez
a
a
 
(5 közbenső módosítás, amit egy másik szerkesztő végzett, nincs mutatva)
48. sor: 48. sor:
  
 
<syntaxhighlight lang="matlab" style="font-size: 140%;">
 
<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:
 
% Az állapot-visszacsatolást tartalmazó szabályzó hatásvázlata:
 
</syntaxhighlight>
 
</syntaxhighlight>
66. 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);
74. 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
98. sor: 111. sor:
  
 
<syntaxhighlight lang="matlab" style="font-size: 140%;">
 
<syntaxhighlight lang="matlab" style="font-size: 140%;">
% Az alapjel miatti korrekciót is tartalmazó szabályzó hatásvázlata:
+
 
 +
% 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>
 
</syntaxhighlight>
  
105. sor: 123. sor:
 
<syntaxhighlight lang="matlab" style="font-size: 140%;">
 
<syntaxhighlight lang="matlab" style="font-size: 140%;">
  
% Tervezés
+
% 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.
 
% FIGYELEM: Eltérés a folytonos időtől, hogy itt Phi-eye(n) szerepel első elemként.
% Az oszlopvektorban n darab nulla és fixen 1 darab egyes.
 
 
N=inv([Phi-eye(2) Gamma; C 0])*[0;0;1];
 
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
 
% Az Nx-et és Nu-t tartalmazó vektor szétválasztása
126. sor: 165. sor:
  
 
<syntaxhighlight lang="matlab" style="font-size: 140%;">
 
<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:
 
% Az állapotmegfigyelőt is tartalmazó állapot-visszacsatolásos szabályzó hatásvázlata:
 
</syntaxhighlight>
 
</syntaxhighlight>
139. 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
159. 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!
  
171. sor: 234. sor:
  
 
<syntaxhighlight lang="matlab" style="font-size: 140%;">
 
<syntaxhighlight lang="matlab" style="font-size: 140%;">
 +
 +
% 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:
 
% Az terhelésbecslővel kiegészített szabályzó hatásvázlata:
 
</syntaxhighlight>
 
</syntaxhighlight>
180. sor: 266. sor:
 
% 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];
  
195. 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
205. sor: 294. sor:
  
 
<syntaxhighlight lang="matlab" style="font-size: 140%;">
 
<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:
 
% Az integráló hatást is tartalmazó szabályzó hatásvázlata:
 
</syntaxhighlight>
 
</syntaxhighlight>
213. sor: 320. sor:
  
 
% 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)];
  
224. 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
238. sor: 346. sor:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
[[Category:Villanyalap]]
+
[[Kategória:Villamosmérnök]]

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

← Vissza az előző oldalra – Szabályozástechnika

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
Hiba a bélyegkép létrehozásakor: Nem lehet a bélyegképet a célhelyre menteni
% 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:
Hiba a bélyegkép létrehozásakor: Nem lehet a bélyegképet a célhelyre menteni
% 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):
Hiba a bélyegkép létrehozásakor: Nem lehet a bélyegképet a célhelyre menteni
% 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:
Hiba a bélyegkép létrehozásakor: Nem lehet a bélyegképet a célhelyre menteni
% 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:
Hiba a bélyegkép létrehozásakor: Nem lehet a bélyegképet a célhelyre menteni
% 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:
Hiba a bélyegkép létrehozásakor: Nem lehet a bélyegképet a célhelyre menteni
% 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