„Szabályozástechnika - 2DOF szabályzó tervezése” változatai közötti eltérés

David14 (vitalap | szerkesztései)
Szikszayl (vitalap | szerkesztései)
aNincs szerkesztési összefoglaló
 
(9 közbenső módosítás, amit 3 másik szerkesztő végzett, nincs mutatva)
2. sor: 2. sor:


==A szakasz megadása és a zárt körre vonatkozó előírások==
==A szakasz megadása és a zárt körre vonatkozó előírások==
<syntaxhighlight lang="matlab" style="font-size: 150%;">
<syntaxhighlight lang="matlab" style="font-size: 140%;">


%% A szakasz a szokásos:
%% A szakasz a szokásos:
48. sor: 48. sor:
[[File:Szabtech_2dof_szabályzó_felépítése.JPG]]
[[File:Szabtech_2dof_szabályzó_felépítése.JPG]]


<syntaxhighlight lang="matlab" style="font-size: 150%;">
<syntaxhighlight lang="matlab" style="font-size: 140%;">


% A 2DOF szabályzó tervezés alapelve, hogy mi a zárt kör átviteli függvényében
% A 2DOF szabályzó tervezés alapelve, hogy mi a zárt kör átviteli függvényében
% előre meghatározott pólusokat szeretnénk. Azaz célunk, hogy:
% előre meghatározott pólusokat szeretnénk. Azaz célunk, hogy:
%
%
%        Bm    A0
%        Bm    Ao
% Dcl = ---- * ----  alakú legyen, ahol A0 az úgynevezett observer polinom.
% Dcl = ---- * ----  alakú legyen, ahol Ao az úgynevezett observer polinom.
%        Am    A0
%        Am    Ao
%
%
% Itt Am gyökei lesznek az általunk előírt pólusok.
% Am gyökei az általunk előírt pólusok - zdom1, zdom2 és ha szükséges akkor megfelelő számú zcinf pólus is.
% Ao gyökei pedig (csak ha szükséges) - megfelelő számú zoinf pólus.
% A szakasz diszkrétidejű átviteli függvénye: D(z) = B(z) / A(z)
% A szakasz diszkrétidejű átviteli függvénye: D(z) = B(z) / A(z)
% A zárt kör átviteli függvénye:
% A zárt kör átviteli függvénye:
%
%
%        T        B/A              T*B        Bm    A0
%        T        B/A              T*B        Bm    Ao
% Dcl = --- * --------------- = ----------- == ---- * ----
% Dcl = --- * --------------- = ----------- == ---- * ----
%        R    1 + B/A * S/R    A*R + B*S      Am    A0
%        R    1 + B/A * S/R    A*R + B*S      Am    Ao
%
%
% Szeretnénk egyszerűsíteni a B polinommal, így R gyökei közé bevesszük B gyökeit.
% Szeretnénk egyszerűsíteni a B polinommal, így R gyökei közé bevesszük B gyökeit.
72. sor: 73. sor:
% Így le tudunk egyszerűsíteni Bplus-al az egyenlet bal oldalán:
% Így le tudunk egyszerűsíteni Bplus-al az egyenlet bal oldalán:
%
%
%    T*Bminus          Bm    A0
%    T*Bminus          Bm    Ao
% ----------------- == ---- * ----
% ----------------- == ---- * ----
%  A*R1 + Bminus*S      Am    A0
%  A*R1 + Bminus*S      Am    Ao
%
%
% Az egyenletből látszik, hogy Bm polinomnak mindenképpen tartalmaznia kell B nem kiejthető gyökeit,
% Az egyenletből látszik, hogy Bm polinomnak mindenképpen tartalmaznia kell B nem kiejthető gyökeit,
% azaz Bm = Bm' * Bminus alakú kell hogy legyen. Így tovább egyszerűsíthetünk:
% azaz Bm = Bm' * Bminus alakú kell hogy legyen. Így tovább egyszerűsíthetünk:
%
%
%        T            Bm'    A0
%        T            Bm'    Ao
% ----------------- == ---- * ----
% ----------------- == ---- * ----
%  A*R1 + Bminus*S      Am    A0
%  A*R1 + Bminus*S      Am    Ao
%
%
% Előírás lehet, hogy a szabályzó "k" darab integrátort tartalmazzon, melyeket az R polinomba
% Előírás lehet, hogy a szabályzó "k" darab integrátort tartalmazzon, melyeket az R polinomba
87. sor: 88. sor:
% Így a végleges egyenletünk:
% Így a végleges egyenletünk:
%
%
%              T                Bm'    A0
%              T                Bm'    Ao
% -------------------------- == ---- * ----
% -------------------------- == ---- * ----
%  A*(z-1)^k*R1' + Bminus*S      Am    A0
%  A*(z-1)^k*R1' + Bminus*S      Am    Ao
%
%
% Ez alapján a szabályzó T polinomja egyszerűen számítható: T = Bm' * A0
% Ez alapján a szabályzó T polinomja egyszerűen számítható: T = Bm' * Ao
% Az egyenlet nevezője pedig egy diophantoszi polinomegyenlet, amiből a lentebb ismertetett
% Az egyenlet nevezője pedig egy diophantoszi polinomegyenlet, amiből a lentebb ismertetett
% módszerrel R1' (ebből pedig R) és S már egyszerűen meghatározható.
% módszerrel R1' (ebből pedig R) és S már egyszerűen meghatározható.
99. sor: 100. sor:


== A számláló faktorizálása ==
== A számláló faktorizálása ==
<syntaxhighlight lang="matlab" style="font-size: 150%;">
<syntaxhighlight lang="matlab" style="font-size: 140%;">


B=dp.num{1}  % Számláló kiolvasása a tf struktúrából
B=dp.num{1}  % Számláló kiolvasása a tf struktúrából
A=dp.den{1}; % Nevező kiolvasása a tf struktúrából
A=dp.den{1}; % Nevező kiolvasása a tf struktúrából


% Mivel a polinomok fokszámait majd az őket tároló vektorok  
% Mivel a polinomok fokszámait majd az őket tároló vektorok hosszából számítjuk
% hosszából számítjuk (fokszám = vektor elemszáma - 1), a Matlab pedig
% (fokszám = vektor elemszáma - 1), a Matlab pedig az átviteli függvény számlálóját
% az átviteli függvény számlálóját és nevezőjét egyforma elemszámú  
% és nevezőjét egyforma elemszámú vektorokban tárolja, ezért B elejéről le kell
% vektorokban tárolja, ezért B elejéről le kell választanunk a vezető
% választanunk a vezető 0 elemeket.
% 0 elemeket. Jelen esetben csak 1 darab van, így csak azt kell levágni.
% Jelen esetben csak 1 darab van, így csak azt kell levágni.
B=B(2:end)
B=B(2:end)
% Általános megoldás - csak ínyenceknek!
B=B(B~=0); % Bminus-ba az eredeti Bminus nem 0 elemeit töltjük


Bpoles=roots(B) % B gyökeinek számítása
Bpoles=roots(B) % B gyökeinek számítása
117. sor: 116. sor:
% Nem kiejthető gyökök: Egységkörön kívűl, vagy tisztán negatív valósak
% Nem kiejthető gyökök: Egységkörön kívűl, vagy tisztán negatív valósak
Bminus=B % Esetünkben egyik zérus sem kiejthető, mivel mind negatív valósak
Bminus=B % Esetünkben egyik zérus sem kiejthető, mivel mind negatív valósak
Bplus=1
Bplus=1 % FONTOS: Ha Bplus polinom nem egy konstans 1-es, akkor mindig meg kell szorozni B(1)-el!


% Általánosan kis manuális beavatkozással:
% Általánosan kis manuális beavatkozással:
% roots(B)
% roots(B)
% Megnézzük hogy mik a kiejthető és mik a ki nem ejthető gyökök
% Megnézzük, hogy mik a kiejthető és mik a ki nem ejthető gyökök
% Bplus=poly([ kiejthető gyökök felsorolása ])
% Bplus=poly([ kiejthető gyökök felsorolása ])
% Bminus=B(1)*poly([ nem kiejthető gyökök felsorolása ])
% Bminus=B(1)*poly([ nem kiejthető gyökök felsorolása ])


% -------------------------------------------------------------------------------------------------------
%% Csak ÍNYENCEKNEK - általános megoldás a Matlab lehetőségeit kihasználva.
%% Csak ÍNYENCEKNEK - általános megoldás a Matlab lehetőségeit kihasználva.
% Bminus-ba azok a gyökök kerülnek, amiknek az abszolútértéke >=1 illetve
% Bminus-ba azok a gyökök kerülnek, amiknek az abszolútértéke >=1 illetve tisztán valósak és negatívak.
% tisztán valósak és negatívak. Az & jel a két feltétel közötti ÉS
% Az & jel a két feltétel közötti ÉS kapcsolatot jelenti, az union két halmaz (esetünkben vektor) uniója.
% kapcsolatot jelenti, az union két halmaz (esetünkben vektor) uniója. Ezt a
% Ezt a műveletet használva minden olyan elem bekerül Bminuspoles-ba, amelyre valamelyik feltétel igaz,
% műveletet használva minden olyan elem bekerül Bminuspoles-ba, amelyre
% de akkor is csak egyszer fog szerepelni, ha mindkét feltétel igaz rá.
% valamelyik feltétel igaz, de akkor is csak egyszer fog szerepelni, ha
Bminuspoles=union(Bpoles(abs(Bpoles)>=1), Bpoles((real(Bpoles)<0)&(imag(Bpoles)<1e-12)));  
% mindkét feltétel igaz rá.
Bminuspoles=union(Bpoles(abs(Bpoles)>=1), Bpoles((real(Bpoles)<0)&(imag(Bpoles)==0)));  
% Bplus-ba Bpoles es Bminuspoles különbsége kerül
% Bplus-ba Bpoles es Bminuspoles különbsége kerül
Bpluspoles=setdiff(Bpoles,Bminuspoles);  
Bpluspoles=setdiff(Bpoles,Bminuspoles);  
% Bplus polinom összeállítása a gyökökből
% Bplus polinom összeállítása a gyökökből
Bplus=poly(Bpluspoles);  
Bplus=poly(Bpluspoles);  
% Hogy Bplus*Bminus=B legyen, Bminus-t még szorozni kell egy megfelelő  
% Hogy Bplus*Bminus=B legyen, Bminus-t még szorozni kell egy megfelelő konstanssal, hiszen a poly
% konstanssal, hiszen a poly mindenképpen 1 vezető együtthatójú polinomot
% mindenképpen 1 vezető együtthatójú polinomot képez az elemekből és az elmélet szerint Bplus monic.
% képez az elemekből és az elmélet szerint Bplus monic (1 vezető együtthatójú).
Bminus=poly(Bminuspoles)*B(1);
Bminus=poly(Bminuspoles)*B(1);
147. sor: 143. sor:


== Fokszámfeltételek (Tk - 240. oldal)==
== Fokszámfeltételek (Tk - 240. oldal)==
<syntaxhighlight lang="matlab" style="font-size: 150%;">
<syntaxhighlight lang="matlab" style="font-size: 140%;">


% A foszámokat a vizsgán általában egyszerűbb és gyorsabb kézzel kiszámítani
% A fokszámokat a vizsgán általában egyszerűbb és gyorsabb kézzel kiszámítani
% az ismert képletek használatával, de számíthatóak általánosan Matlab segítségével is.  
% az ismert képletek használatával, de számíthatóak általánosan Matlab segítségével is.  
grBminus=length(Bminus)-1 % A vezető 0-t már korábban leválasztottuk
grBminus=length(Bminus)-1 % A vezető 0-t már korábban leválasztottuk
164. sor: 160. sor:
% Általános megoldás - csak ínyenceknek!
% Általános megoldás - csak ínyenceknek!
% grBminus==0 1-re értékelődik ki ha Bminus fokszáma 0, 0-ra egyébként
% grBminus==0 1-re értékelődik ki ha Bminus fokszáma 0, 0-ra egyébként
grAm=1+grBminus+(grBminus==0);  
% grAm=1+grBminus+(grBminus==0);  
grAo=grA+lint-1-(grBminus==0);
% grAo=grA+lint-1-(grBminus==0);


%% Referencia- és megfigyelő polinom számítása
%% Referencia- és megfigyelő polinom számítása
% A polinomokat a gyökeikből a poly függvény segítségével számítjuk.
% A polinomokat a gyökeikből a poly függvény segítségével számítjuk. Fontos, hogy a poly 1 vezető
% Fontos, hogy a poly 1 vezető együtthatójú (monic) polinomokat képez, és
% együtthatójú (monic) polinomokat képez, és az elmélet szerint Am és Ao is monic. Am harmadfokú (grAm=3),
% az elmélet szerint Am és Ao is monic.
% így a domináns póluspár mellett grAm-2, azaz egyszeres multiplicitással kell a zcinf pólust szerepeltetni
% Am harmadfokú (grAm=3), így a domináns póluspár mellett grAm-2, azaz  
% egyszeres multiplicitással kell a zcinf pólust szerepeltetni
Am=poly([zdom1 zdom2 zcinf])
Am=poly([zdom1 zdom2 zcinf])
% Általános megoldás
Am=poly([zdom1 zdom2 ones(1,grAm-2)*zcinf])


% Ao egyetlen gyöke zoinf, ezt kell most grAo, azaz háromszoros  
% Ao egyetlen gyöke zoinf, ezt kell most grAo, azaz háromszoros multiplicitással szerepeltetni
% multiplicitással szerepeltetni
Ao=poly([zoinf zoinf zoinf])
Ao=poly([zoinf zoinf zoinf])
% Általános megoldás
Ao=poly(ones(1,grAo)*zoinf)


%% B'm szamitasa
% Általános megoldás:
% B'm = Am(z=1) / Bminus(z=1)
% Am=poly([zdom1 zdom2 ones(1,grAm-2)*zcinf])
% Ao=poly(ones(1,grAo)*zoinf)
 
% B'm számítása: Szeretnénk, ha a zárt körnek egységugrás alapjel esetén zérus maradó hibája lenne,
% azaz a zárt kör ugrásválaszának végértéke 1 lenne:
% lim (z -> 1) { (1-z^-1)*Dcl(z)*1/(1-z^-1) } = lim (z -> 1 ) { Dcl(z) } = Dcl(1)
% 1 = Dcl(1) = Bm(1)/Am(1) = Bminus(1) * Bm' / Am(1) --> B'm = Am(z=1) / Bminus(z=1)
Bmprime=polyval(Am,1)/polyval(Bminus,1)
Bmprime=polyval(Am,1)/polyval(Bminus,1)
191. sor: 186. sor:


== A diophantoszi polinomegyenlet megoldása ==
== A diophantoszi polinomegyenlet megoldása ==
<syntaxhighlight lang="matlab" style="font-size: 150%;">
<syntaxhighlight lang="matlab" style="font-size: 140%;">


polyint=[1 -1]; % Az integrátor polinomja (z-1)
polyint=[1 -1]; % Az integrátor polinomja (z-1)
208. sor: 203. sor:


polyA=conv(A,polyint) % A diophantoszi egyenletben szereplő A polinom
polyA=conv(A,polyint) % A diophantoszi egyenletben szereplő A polinom
polyB=Bminus % A diophantoszi egyenletben szereplő B polinom
polyB=Bminus         % A diophantoszi egyenletben szereplő B polinom
polyC=conv(Am,Ao) % A diophantoszi egyenletben szereplő C polinom
polyC=conv(Am,Ao)     % A diophantoszi egyenletben szereplő C polinom


% A fenti egyenlet átírható lineáris egyenletrendszer alakba, ami mátrixos formában könnyen megoldható.
% A fenti egyenlet átírható lineáris egyenletrendszer alakba, ami mátrixos formában könnyen megoldható.
% Cél: A polinomegyenletnek megfelelő dioA * x = dioB lineáris egyenletrendszer mátrixainak összeállítása.  
% Cél: A polinomegyenletnek megfelelő dioA * x = dioB lineáris egyenletrendszer mátrixainak összeállítása.  


% A toeplitz(C,R) függvény olyan Toeplitz-mátrix-szal tér
% A toeplitz(C,R) függvény olyan Toeplitz-mátrix-szal tér vissza, melynek első oszlopa C, első sora pedig R.
% vissza, melynek első oszlopa C, első sora pedig R. Ha C(1) és R(1)  
% Ha C(1) és R(1) nem egyezik meg, akkor figyelmeztetés mellett C(1) értéke lesz a mátrix (1,1) indexű eleme.
% nem egyezik meg, akkor figyelmeztetés mellett C(1) értéke lesz a mátrix (1,1) indexű eleme.


% Esetünkben az dioA mátrix két Toeplitz blokkból áll.
% Esetünkben az dioA mátrix két Toeplitz blokkból áll.
249. sor: 243. sor:
[polyB(1) zeros(1,grS)])];
[polyB(1) zeros(1,grS)])];


% Most a jobb oldalon álló vektor első négy eleme polyC(2)-polyA(2) ...
% Most a jobb oldalon álló vektor első négy eleme polyC(2)-polyA(2) ... polyC(5)-polyA(5)
% polyC(5)-polyA(5) (polyA és polyC első eleme 1, amit nem használunk fel),
% (polyA és polyC első eleme 1, amit nem használunk fel), a további sorokban pedig polyC(6) és
% a további sorokban pedig polyC(6) és polyC(7) áll, mivel polyA egy  
% polyC(7) áll, mivel polyA egy negyedfokú polinom, így nincsenek további együtthatói.
% negyedfokú polinom, így nincsenek további együtthatói. A legegyszerűbb  
% A legegyszerűbb ezt a vektort olyan módon számítani, hogy polyC 2..7-ik eleméből kivonunk
% ezt a vektort olyan módon számítani, hogy polyC 2..7-ik eleméből kivonunk
% egy olyan vektort, ami polyA 2..5-ik eleme után két 0-t tartalmaz. Ügyelni kell arra, hogy a
% egy olyan vektort, ami polyA 2..5-ik eleme után két 0-t tartalmaz.  
% polinomokat sorvektorként ábrázoljuk, azonban a lineáris egyenletrendszer jobb oldalán oszlopvektor
% Ügyelni kell arra, hogy a polinomokat sorvektorként ábrázoljuk, azonban
% áll, így az eredményt transzponálnunk kell.
% a lineáris egyenletrendszer jobb oldalán oszlopvektor áll, így az
% eredményt transzponálnunk kell.


dioB=[polyC(2:end)-[polyA(2:end) 0 0]]'
dioB=[polyC(2:end)-[polyA(2:end) 0 0]]'


% Általános megoldás - csak ínyenceknek!
% Általános megoldás - csak ínyenceknek!
% A polyA elemei után beszúrandó 0-k számát a két polinom fokszámkülönbsége
% A polyA elemei után beszúrandó 0-k számát a két polinom fokszámkülönbsége
272. sor: 263. sor:
% Ínyenceknek:
% Ínyenceknek:
% dioSol=dioA\dioB
% dioSol=dioA\dioB
% A 'backslash' jel hatására a Matlab Gauss-eliminál,
% A 'backslash' jel hatására a Matlab stabilabb és gyorsabb algoritmussal dolgozik!
% ami pontosabb és jóval gyorsabb, mint egy (esetleg) nagy mátrix invertálása.


279. sor: 269. sor:


== A szabályzó átviteli függvényék polinomjainak meghatározása==
== A szabályzó átviteli függvényék polinomjainak meghatározása==
<syntaxhighlight lang="matlab" style="font-size: 150%;">
<syntaxhighlight lang="matlab" style="font-size: 140%;">


% A dioSol vektor most a következő elemeket tartalmazza:
% A dioSol vektor most a következő elemeket tartalmazza:
286. sor: 276. sor:


% R1' számítása:
% R1' számítása:
% R1' másodfokú, ám mivel monic, ezért legnagyobb fokszámú együtthatója 1,
% R1' másodfokú, ám mivel monic, ezért legnagyobb fokszámú együtthatója 1, így csak a további 2
% így csak a további 2 együttható szerepel a megoldásvektorban. R1prime
% együttható szerepel a megoldásvektorban. R1prime vektor polinomnak felel meg, így sorvektornak
% vektor polinomnak felel meg, így sorvektornak kell lennie, úgyhogy
% kell lennie, úgyhogy transzponálnunk kell a megoldásvektor elemeit
% transzponálnunk kell a megoldásvektor elemeit
R1prime=[1 dioSol(1:2)']  
R1prime=[1 dioSol(1:2)']  
% Általános megoldás - csak ínyenceknek!
R1prime=[1 dioSol(1:grR1prime)'] ;


% R polinom számítása:
% R polinom számítása:
302. sor: 289. sor:
% még transzponálnunk kell, hogy S vektor sorvektor legyen
% még transzponálnunk kell, hogy S vektor sorvektor legyen
S=dioSol(3:6)'
S=dioSol(3:6)'
% Általános megoldás - csak ínyenceknek!
S=dioSol(grR1prime+1:end)';


% T polinom számítása:
% T polinom számítása:
T=Bmprime*Ao % Bmprime egy skalár, így nincs szükség a conv-ra
T=Bmprime*Ao % Bmprime egy skalár, így nincs szükség a conv-ra
% Általános megoldás - csak ínyenceknek!
% R1prime=[1 dioSol(1:grR1prime)'];
% S=dioSol(grR1prime+1:end)';


312. sor: 301. sor:


== A zárt szabályozási kör összeállítása ==
== A zárt szabályozási kör összeállítása ==
<syntaxhighlight lang="matlab" style="font-size: 150%;">
<syntaxhighlight lang="matlab" style="font-size: 140%;">


%% A zárt szabályozási kör összeállítása
%% A zárt szabályozási kör összeállítása
335. sor: 324. sor:
xlabel('t');
xlabel('t');
ylabel('u');
ylabel('u');
% A kétszabadságfokú szabályzó működését definiáló differenciaegyenlet, azaz a beavatkozó jel
% aktuális értékének számítására vonatkozó képlet:
% u = T/R * r - S/R * y  --> R*u = T*r - S*y
% A feladat során kiszámolt R(z), T(z) és S(z) polinomok behelyettesítése:
%
% (1*z^3 - 1.13*z^2 + 0.22*z - 0.09)*u = (0.88*z^3 - 0.97*z^2 + 0.36*z - 0.04)*r -
%                                        (317*z^3  - 863*z^2  + 781*z  - 235)*y
%
% Leosztunk (z^3)-el, elvégezzük az inverz Z-transzformációt és u[k]-ra rendezzük az egyenletet:
%
% u[k] = 0.88*r[k] - 0.97*r[k-1] + 0.36*r[k-2] - 0.04*r[k-3] -
%        317 *y[k] + 863 *y[k-1] - 781 *y[k-2] + 235 *y[k-3] +
%                    1.13*u[k-1] - 0.22*u[k-2] + 0.09*u[k-3]


340. sor: 343. sor:


== A robosztusság illusztrációja ==
== A robosztusság illusztrációja ==
<syntaxhighlight lang="matlab" style="font-size: 150%;">
<syntaxhighlight lang="matlab" style="font-size: 140%;">


% A szakasz minden paraméterét 25%-al megnöveljük ill. lecsökkentjük
% A szakasz minden paraméterét 25%-al megnöveljük illetve lecsökkentjük
wp125=tf(Aplant,conv(conv([1.25*T1 1],[1.25*T2 1]),[1.25*T3 1]));
wp125=tf(Aplant,conv(conv([1.25*T1 1],[1.25*T2 1]),[1.25*T3 1]));
wp75=tf(Aplant,conv(conv([0.75*T1 1],[0.75*T2 1]),[0.75*T3 1]));
wp75=tf(Aplant,conv(conv([0.75*T1 1],[0.75*T2 1]),[0.75*T3 1]));
348. sor: 351. sor:
dp75=c2d(wp75,Ts);
dp75=c2d(wp75,Ts);


% Zárt körök összeállítása a perturbalt szakaszokból es az _eredeti_
% Zárt körök összeállítása a pertubált szakaszokból és az eredeti szabályzóból
% szabályozóból
d_cl75=series(d_ff,feedback(dp75,d_fb,-1));
d_cl75=series(d_ff,feedback(dp75,d_fb,-1));
d_cl125=series(d_ff,feedback(dp125,d_fb,-1));
d_cl125=series(d_ff,feedback(dp125,d_fb,-1));
372. sor: 374. sor:
</syntaxhighlight>
</syntaxhighlight>


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