za početak, da učitamo toolbox
pkg load control
da prebacimo slike na vektorsku grafiku, ovo nije Octave komanda, jupyter je!
%plot inline -f "svg"
ovo je objekt upravljanja, njegova funkcija prenosa
T0 = tf([1],[1, 3, 3, 1])
bode(T0)
funkcija prenosa ima malo pojačanje, nema čak ni crossover frequency (ako izuzmemo DC), stalno je manja od 1 po amplitudi; moramo da podignemo pojačanje i postavimo crossover frequency; zvuči jednostavno, čak i jeste, ali je problem gde postaviti crossover frequency? možda se zbog toga vratimo u drugom prolazu na ovo mesto, ako velik propusni opseg suviše zahteva od sistema (napona, struja, duty ratio van opsega $0 \le d \le 1$, . . . ); postavimo crossover frequency na $\omega_C = 10$ radijana u sekundi, $k = 1000$
T1 = 1000 * T0
bode(T1)
nyquist(T1)
liči na nestabilno, ali čik razaznajte šta je oko (-1, 0) sa ove slike? detaljnije je dole prikazano, zoom je česta komanda kada se radi nyquist()
nyquist(T1)
axis([-1, 1, -1, 1])
vrlo nestabilno, ali treba da se tumači; da probamo sa mojom kompresiojom?
compressed(T1)
krajnje očigledno nestabilno, obuhvata kritičnu tačku; da napravimo lead kompenzator da popravimo faznu marginu? ovde je glavno da kompenzator ne pokvari $\omega_C$, tako se pravi funkcija prenosa lead kompenzatora, da na $\omega_C$ ima pojačanje 1, odnosno 0 dB
Hlead = 0.1 * tf([1, 1], [0.01, 1])
bode(Hlead)
na $\omega_C$ je amplituda lead kompenzatora 0 dB; neće uticati na $\omega_C$
T2 = T1 * Hlead
ovde je popravljena faza; uočite kako red sistema raste! nažalost, to će nas pratiti do kraja
bode(T2)
i, šta kaže Nyquist? čik razaznajte odavde!
nyquist(T2)
jedan zoom . . .
nyquist(T2)
axis([-5 5 -5 5])
i još jedan . . .
nyquist(T2)
axis([-1 1 -1 1])
axis square
uz zoom se vidi da je jedva stabilno; da probamo kompresiju?
compressed(T2)
lako i jasno se vidi da je stabilno, ali i mala margina faze; da probamo step response u zatvorenoj sprezi?
H2 = minreal(T2 / (1 + T2))
sistem od četvrtog reda posta sistem sedmog reda zbog konačne dužine reči, tzv. numeričke greške! kasnije ćemo se time više baviti, sada samo da najavim:
H2a = unitnegativefeedback(T2)
ovo je sistem četvrtog reda, uz malu pomoć symbolic precomputation, biće više reči kasnije
step(H2)
uh, suvise oscilatorno! nema smisla sa ovim ići dalje, bolje da još popravimo marginu faze, još jedan lead kompenzator dodajemo na red!
a da vidimo onaj drugi sistem, četvrtog reda?
step(H2a, 20)
odziv je isti! naravoučenije: zaboravite na minreal ako baš ne mora; biće još reči o ovome!
T22 = T2 * Hlead
bode(T22)
dođosmo do sistema petog reda; šta kaže Nyquist?
nyquist(T22)
axis([-1 1 -1 1])
axis square
ok, stabilno, čak prevelika margina faze, možda bude presporo, ali rešićemo kasnije, bolje je za sada da bude stabilnije; da probamo kompresiju?
compressed(T22)
vrlo jasno sta je, margina faze skoro $90^\circ$, nalik na sistem prvog reda; da probamo odziv na step pobudu u zatvorenoj sprezi?
H22 = minreal(T22 / (1 + T22))
peti red sistema posta osmi, optimizacija ili skracivanje (minreal) nije baš sjajno odradila posao; ima i tu rešenja za tipične slučajeve, preko polinoma i delimičnog simboličkog računanja, to je bilo planirano za jedan master rad, ali je zavrseno za pola sata, pa je tema potrošena . . .
step(H22)
očekivano, smirene oscilacije, usporen sistem; samo, vidite li da je pojačanje na niskim frekvencijama malo, imate grešku ustaljenog stanja! Da bi to popravili dodajemo lag kompenzator; on fazu kvari, pa ga postavljamo tako da je ne pokvari puno; $\omega_C$ isto ne sme da pokvari!
a da opet probamo alternativu?
H22a = unitnegativefeedback(T22)
ovo je sistem očekivanog petog reda; da mu probamo step?
step(H22a)
dakle, alternativni metod opet radi; da se vratimo na lag kompenzator
Hlag = tf([1, 1], [1 0])
bode(Hlag)
na $\omega_C$ pojačanje je blisko 1, ne kvari se crossover frequency
T3 = T22 * Hlag
eto sistema šestog reda!
bode(T3)
šta kaže Nyquist? razaznajte iz slike, ako možete . . .
nyquist(T3)
da probamo kompresiju? bolje, ali ne sjajno, nema obilaznice, ovo je samo komprimovan dijagram koji daje nyquist() funkcija iz paketa control za octave; naša funkcija prenosa u otvorenoj sprezi sada ima pol u koordinatnom početku (nuli, (0, 0))
compressed(T3)
a da probamo nešto bolje, pyquist funkciju koja ima i obilaznicu?
pyquist(T3)
closed loop funkcija prenosa i njen step odziv?
H3 = minreal(T3 / (1 + T3))
šesti red postao deveti, minreal() nije baš odradio posao, numerička greška radi svoje; sugestija za "developers": napraviti funkciju koja za T pravi H, funkciju prenosa u jediničnoj "negativnoj" povratnoj sprezi, da zaobiđemo numeriku; hm, da uradim to ja, kao što već jesam? pogledajte funkciju unitnegativefeedback.m, u direktorijumu vam je
H3p = unitnegativefeedback(T3)
sad šesti red osta šesti red! da im vidimo pzmaps?
[p, z] = pzmap(H3)
[p, z] = pzmap(H3p)
uporedite liste vidite šta radi numerička greška; zašto je treba izbeći? bypass je urađen preko analitičke pripreme sa simboličkim računom; samo par linija koda rešava naš partikularan problem jedinične povratne sprege; možda problem jeste partikularan, ali je naš, nas muči, to mu je značaj
step(H3)
da uporedimo rezultat sa mojom funkcijom?
step(H3, H3p)
ok, to je to, odzivi su isti, funkcija radi; kao što vidite, sistem može lako da se unapredi, prilagodite ga svojim potrebama
step odziv je ok, nema premašenje, sve je očekivano i dobro; a da probamo da cedimo suvu drenovinu i još malo proširimo frekvencijski opseg velikih kružnih pojačanja, tj. da proširimo opseg frekvencija u kome je kružno pojačanje veliko?
Hlag2 = tf([1, 10], [1 0])
bode(Hlag2)
na $\omega = 10$ nije baš pojačanje 0 db
T32 = T22 * Hlag2
bode(T32)
crossover frequency je malo podignut; posledica preterivanja u $\omega_L$; šta kaže Nyquist? razaznajte, ovde to još i može
nyquist(T32)
axis([-1, 1, -1, 1])
da probamo kompresiju?
compressed(T32)
opet problem sa polom u nuli; da uradimo obilaznicu?
pyquist(T32)
potpuno jasno, margina faze oko $45^\circ$; closed loop transfer function i jedinični odziv?
H32 = minreal(T32 / (1 + T32))
opet isti komentari za funkciju minreal() i red sistema; dižem ruke od toga zauvek, imam alternativu, svoj program!
H32 = unitnegativefeedback(T32)
sada je sistem šestog reda, a isti je, tri reda manje! uz to, ovo rešenje je tačno, bez numeričke greške; tačnije i jednostavnije, toliko o izboru algoritma!
step(H32)
očekivano, imamo brzinu, ali i ringing! da uporedimo odzive . . .
step(H3,H32,1.5)
"o odzivima ne valja raspravljati"; očigledno je oscilatoran nešto brži, ali da li se to isplati imajući u vidu ringing?