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)
a sada najava nečeg što sledi, da dodamo obilaznice i brojanje obuhvata kritične take:
dodato_nestabilnih_polova = pypass(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
H1 = feedback(T1)
pzmap(H1)
legend('location', 'northwest')
tačno tako, dodata dva nestabilna pola, tj. dva pola premeštena u desnu kompleksnu poluravan; igorišite ružnu oznaku u legendi, tu nije pol već oznaka za pol
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 = series(T1, Hlead) # overloaded operator? ranije rešavano množenjem
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?
još jedan osvrt na ono što sledi . . .
dodato_nestabilnih_polova = pypass(T2)
# nekad minreal(T2 / (1 + T2)), dakle nije overload
H2 = feedback(T2)
sistem je ostao četvrtog reda, nije postao sistem sedmog reda zbog konačne dužine reči, tzv. numeričke greške! dakle, imamo funkciju feedback() koja lepo radi!
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!
odziv je isti! naravoučenije: zaboravite na minreal ako baš ne mora; biće još reči o ovome!
T22 = series(T2, Hlead)
sada je sistem petog reda; takav nam je postupak, stalno povećavamo red sistema; rešavamo jedne probleme, a pravimo druge!
bode(T22)
i tako 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?
još jedna digresija u budućnost:
dodato_nestabilnih_polova = pypass(T22)
usput, uočite kako je pojačanje na niskim frekvencijama palo, tracking neće biti dobar! rešili smo marginu faze, ali smo spustili pojačanje; u skladu sa najavom: rešavanje jednog problema je napravilo drugi!
H22 = minreal(T22 / (1 + T22))
H22 = feedback(T22)
NEKAD: peti red sistema posta osmi, optimizacija ili skracivanje (minreal) nije baš sjajno odradila posao SAD: ostao je peti red; drugi metod je zaobišao problem numeričke greške
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!
Hlag = tf([1, 1], [1 0])
bode(Hlag)
na $\omega_C$ pojačanje je blisko 1, ne kvari se crossover frequency
T3 = series(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)
dodato_nestabilnih_polova = pypass(T3)
closed loop funkcija prenosa i njen step odziv?
H3 = minreal(T3 / (1 + T3))
H3 = feedback(T3)
vidite razliku? Funkcije prenosa su u osnovi iste! deveti red i šesti red, ima razlike!
step(H3)
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 = series(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?
još jedan osvrt na budućnost:
dodato_nestabilnih_polova = pypass(T32)
H32 = T32 / (1 + T32)
H32 = minreal(T32 / (1 + T32))
H32 = feedback(T32)
prvo rešenje: sistem dvanaestog reda; drugo rešenje: sistem devetog reda; treće rešenje koje je najbolje: sistem je šestog reda, sve ostalo je izmislila numerička greška! poslednje rešenje je najtačnije i najjednostavnije; toliko o izboru algoritma!
da proverimo?
T32a = - feedback(-H32)
T32
izgleda isto, a da li je?
parallel(T32, -T32a)
vidite šta radi numerička greška?
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?