Szabályozástechnika - Matlab alapismeretek

A VIK Wikiből

A mechanikai lengőrendszer leírása

clear all; % Az összes változó törlése a munkatérből
clc        % A Command Window kiürítése 

% A rendszer paraméterei: 
m=0.5;    % Test tömege [kg]
k=0.2;    % Rugóállandó [N/m]
b=0.5;    % Csillapítás [Ns/m]

% A rendszer differenciálegyenlete:
% F = mx'' + bx' +kx

% Ugyanez s tartományban:
% F(s) = m*s^2*x(s) + b*s*x(s) + k*x(s)
% A rendszer átviteli függvénye:
% W(s) = x(s)/F(s) = 1/(ms^2+bs+k)

% Állapotteres leírás mátrixokkal

% Állapotváltozók, be és kimenet:
% x_ = [x x']'
% u  = F
% y  = x
%
% Az állapotegyenletek: 
% x'  =                x'
% x'' = -(k/m)x - (b/m)x' + (1/m)F
%
% Az állapotteres leírás:
% x_' = Ax_ + Bu
% y   = Cx_ + Du

Állapotteres reprezentáció

% Az állapotteres leírás mátrixai:

A = [0 1; -k/m -b/m]
B = [0; 1/m] % Másképpen: B=[0 1/m]'
C = [1 0]
D = 0

% x hatása x''-re
A(2,1) % Az A mátrix 2. sorának 1. eleme (index: sor, oszlop)

% az x''-re vonatkozo egyenlet
A(2,:) % Az A mátrix 2. sora

% Speciális mátrixok
E=eye(4)     % 4x4-es egységmátrix
O=ones(2,4)  % 2x4-es, 1 elemeket tartalmazó mátrix
Z=zeros(4,2) % 4x2-es nullmátrix

% Mátrixok mérete
size(A)   % A mátrix mérete: [sorok száma, oszlopok száma]
size(B,1) % B vektor sorainak száma
size(C,2) % C vektor oszlopainak száma
length(B) % B vektor hossza 

% Mátrixfüggvények
eig(A) % A mátrix sajátértékei
inv(A) % A mátrix inverze

sys=ss(A,B,C,D) % SS objektum létrehozása a mátrixokból
fieldnames(sys) % Az SS objektum tulajdonságai

A=sys.a % A sys objektum a tulajdonsága (A mátrix)
B=sys.b % A sys objektum b tulajdonsága (B mátrix)
C=sys.c % A sys objektum c tulajdonsága (C mátrix)
D=sys.d % A sys objektum d tulajdonsága (D mátrix)
[A,B,C,D]=ssdata(sys) % Az állapotteres leírás mátrixainak kinyerése az objektumból

Átviteli függvény reprezentáció

% Átviteli függvények megadása polinomokkal

num=1 % A számláló egy skalár

% A nevező egy polinom: ms^2+bs+k
% Polinomokat vektorként írunk le, aminek elemei az együtthatók a hatványok csökkenő sorrendjében
den=[m b k] 

polyval(den,1) % s=1 behelyettesítése a den polinomba
polyder(den)   % A den polinom s szerinti deriváltja
p=roots(den)   % A den polinom gyökei (vektorként)

% Polinom összeállítása gyökökből
p1=[1 -p(1)]   % p1=s-p(1)
p2=[1 -p(2)]   % p2=s-p(2) 
conv(p1,p2)    % Polinomszorzás: conv() függvény
               % Három polinom szorzata: conv(conv(p1,p2),p3) 

poly(p)        % Polinom létrehozása a gyökök vektorából
 
w=tf(num,den)  % TF objektum létrehozása a számláló és nevező polinomjából  
fieldnames(w)  % A TF objektum tulajdonságai
num2=w.num{1}  % Számláló és nevező polinom: num és den mezők
den2=w.den{1}  % Figyelem! A {1} kötelező!

[num2,den2]=tfdata(w) % Számláló és nevező kinyerése

% Megadás szimbolikus 's' segítségével
s=tf('s') % A bal oldali 's' egy szimbolikus változó
wsym=1/(m*s^2+b*s+k)

Zérus-pólus-erősítés reprezentáció

% Pólusok és zérusok 

p=roots(den) % p vektor az előbbi nevező gyökeit tartalmazza

p1=p(1)      % p1 az első pólus
abs(p1)      % p1 abszolút értéke
phase(p1)    % p1 fázisszöge
real(p1)     % p1 valós része
imag(p1)     % p1 képzetes része

z=roots(num) % z vektor a számláló gyökeit tartalmazza

% Mivel a zpk alakban a legmagasabb fokszámú együttható mind a számlálóban,
% mind a nevezőben 1, így a k erősítés értéke
k=num(1)/den(1)   

% Zérus-pólus-erősítés reprezentáció

syszp=zpk(z,p,k)  % ZPK objektum létrehozása
fieldnames(syszp) % A ZPK objektum mezői
syszp.z{1}        % Zérusok és pólusok
syszp.p{1}        % A {1} kötelező!  
syszp.k           % Erősítés - nem kell {1}!

Áttérés a reprezentációk között

% Bármely LTI objektum (SS,TF,ZPK) konstruktora meghívható úgy is, hogy paramétere egy másik LTI objektum

tf(sys)   % Állapotteres leírás -> átviteli függvény
zpk(sys)  % Állapotteres leírás -> zérus-pólus-erősítés
ss(w)     % Átviteli függvény -> állapotteres leírás
zpk(w)    % Átviteli függvény -> zérus-pólus-erősítés
tf(syszp) % Zérus-pólus-erősítés -> átviteli függvény
ss(syszp) % Zérus-pólus-erősítés -> állapotteres leírás

Vizsgálati módszerek az időtartományban

% Klasszikus vizsgálójelek
step(sys)               % Ugrásválasz
step(sys,w,syszp)       % Több rendszer válaszának ábrázolása
legend('SS','TF','ZKP') % Jelmagyarázat

impulse(w)      % Impulzusválasz

% Jobb klikk --> Characteristics menüpont:
% Stady State   - A függvény végértéke
% Rise Time     - A függvény felfutási ideje
% Settling Time - A függvény 2%-os beállási ideje
% Peak Response - A függvény maximuma és túllövése

x0=[2,0]        % Kezdeti állapot: x0=2m, v0=0m/s
initial(sys,x0) % A rendszer válasza 0 bemenet mellett 

% Válasz tetszőleges jelre
t=[0:0.01:10];  % Idővektor: 0,0.01,0.02,...9.99,10
u=4*sin(5*t);   % u vektor: 4(sin 0), 4(sin 0.05), ...
lsim(w,u,t)     % Az u(t) gerjesztőjel és az arra adott válasz a t=0, t=0.01, t=0.02... időpontokban

% Vizsgálati módszerek a frekvenciatartományban
pzmap(syszp)    % Pólus-zérus elrendezés
bode(w)         % Bode-diagram
nyquist(w)      % Nyquist-diagram

Szabályozási kör összeállítása

% A lengőrendszer átviteli függvénye
wdamp=tf(1,[m b k])

% Legyen az erőt szolgáltató beavatkozó szerv egy egytárolós tag, melynek időállandója
Tact=1

% A beavatkozó szerv átviteli függvénye
wact=tf(1,[Tact 1])

% A szakasz átviteli függvénye a két rendszer soros kapcsolása
wp=wdamp*wact % Másképpen: wp=series(wdamp,wact)

% Vizsgáljuk meg a szakaszt!
% A szakasz pólusai
roots(wp.den{1})
% A damp() utasítás visszaadja nemcsak a szakasz pólusait, de a pólusokhoz tartozó
% csillapítatlan sajátfrekvencia (w0) és csillapítás (xi) értéket is
damp(wp)
% A szakasz ugrásválasza
step(wp)

% Egyszerű P-szabályozó méretezése túllövésre

% Alkalmazzunk P szabályozót (a szabályozó egy egyszerű erősítés), majd
% a zárt körben állítsunk be ~10%-os túllövést!

% Ehhez először rajzoltassuk ki a gyökhelygörbét, és keressük meg azt az
% erősítést, amely mellett a túllövés (overshoot) körülbelül 10% lesz!
rlocus(wp)

% Az erősítés értéke a gyökhelygörbéről leolvasva:
Ap=0.0696

% Így a szabályozó átviteli függvénye wc(s) = Ap:
wcp=tf(Ap,1)

% A felnyitott kör átviteli függvénye w0 = wc*wp
w0p=wcp*wp

% Ellenőrizzük a fázis-, és erősítéstartalékot a margin függvény segítségével
margin(w0p)

% Állítsuk össze a zárt kört és vizsgáljuk meg a tulajdonságait!
% A zárt kört a feedback utasítás használatával állíthatjuk elő. Ennek első paramétere az
% előre vezető ág (LTI rendszer, itt átviteli függvény), második paramétere a visszacsatoló
% ág (LTI rendszer, itt átviteli függvény), harmadik paramétere pedig a visszacsatolás előjelét
% határozza meg. Mivel egységnyi merev visszacsatolást alkalmazunk, ezért a visszacsatoló ág
% átviteli függvénye w(s)=1, azaz tf(1,1), a visszacsatolás előjele pedig negatív, ezért a harmadik
% paraméter egy negatív szám (szokásos a -1 választás).
wclp=feedback(w0p,tf(1,1),-1)
% Egységnyi merev, negatív visszacsatolás esetén egyszerűbben is írható: wclp=feedback(w0p,1)

% Vizsgáljuk meg a zárt kör pólusait mind numerikusan, mind grafikusan!
damp(wclp)
pzmap(wclp)

% Rajzoljuk ki a zárt kör ugrásválaszát!
step(wclp)

% A zárt kör ugrásválaszának értékét numerikusan is meghatározhatjuk a Wcl(s=0) helyettesítéssel
% vagy a dcgain függvénnyel (vigyázat, csak nulladik típusú kör esetén működik!)
K=polyval(wclp.num{1},0)/polyval(wclp.den{1},0)
K=dcgain(wclp)

% Határozzuk meg a beavatkozó jelet zárt körben! Ehhez állítsuk elő a zárt körbeli r->u átviteli
% függvényt, amihez szintén a feedback utasítást  használjuk. Ezúttal az előre vezető ágban wc,
% míg a visszacsatoló ágban wp helyezkedik el, az előjel pedig továbbra is negatív.
wu=feedback(wcp,wp,-1)
step(wu)