Część 1
W MATLAB-ie nazwami
zmiennych mogą być pojedyncze litery lub
ciągi znaków alfa numerycznych oraz podkreślenia, rozpoczynające się od
litery
np.
a, abc, Abc, x12,
d_y, A, Bz,
uwzględniana jest wielkość liter, stąd abc i Abc oznaczają różne zmienne* .
Zapamiętywanych jest do 19 znaków nazwy, ewentualne dalsze zostaną pominięte.
Niepoprawne jest
użycie ciągu znaków rozpoczynającego się
od cyfry albo zawierającego operatory arytmetyczne lub symbole
interpunkcji
1x,
3Bc, x-g , D1:ss.
Próba wprowadzenia
ciągu 1x zakończy się wypisaniem, w oknie
poleceń, komunikatu o błędzie
>>
1x
??? 1
|
Missing
operator, comma, or semi-colon.
Wprowadzenie
wartości wyrażenia bez określenia zmiennej,
której ta wartość została przypisana, spowoduje automatyczne
przypisanie tej
wartości, standardowej zmiennej o nazwie ans
>>
2+3*sin(pi/2)
ans =
5
Zmienne są
przechowywane w przestrzeni roboczej aż do
zakończenia sesji z MATLAB-em. Zamierzone czy przypadkowe opuszczenie
programu
spowoduje wyczyszczenie wszystkich zmiennych wprowadzonych przez
użytkownika.
Aby zapobiec utracie skojarzonych z nimi danych należy te zmienne
zapisać do
pliku. W tym celu trzeba wydać polecenie
>> save nazwa
pliku
W bieżącej
kartotece zostanie umieszczona nazwa pliku z
rozszerzeniem .mat automatycznie dodanym przez program.
Zasadniczą
strukturą danych MATLAB-a jest macierz
prostokątna, jej elementami mogą być liczby rzeczywiste lub zespolone.
Wektory
oraz wielkości skalarne są szczególnymi przypadkami macierzy. Istotnie,
macierze zredukowane do jednego wiersza albo kolumny są są wektorami.
Podobnie
macierz jednoelementowa, czyli o wymiarze 1 na 1, jest wielkością
skalarną.
Istnieją
następujące sposoby wprowadzania macierzy:
·bezpośrednio z klawiatury
element po elemencie;
·za pomocą wbudowanych funkcji;
·przez wywołanie tzw. M-plików;
·przez załadowanie do
przestrzeni roboczej zewnętrznych plików z danymi.
Podczas ręcznego
wprowadzania danych z klawiatury,
poszczególne elementy macierzy oddzielone odstępami (spacja) lub
przecinkami
zapisuje się w wierszach ujętych w nawiasy kwadratowe. Znakiem końca
wiersza
jest średnik.
Wprowadzenie
polecenia
w postaci
>> A1 = [-1
3.5;17 0]
powoduje przypisanie zmiennej o nazwie A1, macierzy o wymiarach 2 na 2
A1 =
-1.0000 3.5000
17.0000 0
Ten sam efekt jak
wyżej osiągniemy wprowadzając polecenie
>> A1 = [-1
3.5
17 0]
w którym przejście do następnej linii zostało wymuszone klawiszem Enter
użytym
gdy kursor tekstowy znajdował się na końcu pierwszego wiersza.
Elementami macierzy mogą być również dowolne wyrażenia dozwolone w
MATLAB-ie,
tak więc wprowadzenie polecenia
>> A2 = [1.2
+ 4, 0, -3 ;sqrt(-2), cos(pi),
exp(-2)]
powoduje obliczenie i wypisanie wartości kolejnych elementów macierzy A2
A2 =
5.2000 0 -3.0000
+1.4142i -1.0000
0.1353
Poniżej mamy dwa
przykłady wprowadzania macierzy z
elementami zespolonymi. Pierwszy, w którym elementy macierzy B1
wpisywane są
jako liczby zespolone *
>> B1 = [1+2i
3 - 4i;5 - 6i 7 + 8i]
stąd otrzymujemy
B1 =
1.0000 + 2.0000i 3.0000 - 4.0000i
5.0000
- 6.0000i
7.0000 + 8.0000i
Ten sam rezultat
uzyskamy wprowadzając zapis
>> B2 = [1
3;5 7] + i*[2 -4;-6
8]
stąd
B2 =
1.0000 +
2.0000i 3.0000 - 4.0000i
5.0000
- 6.0000i
7.0000 + 8.0000i
Elementami macierzy
mogą być także inne macierze.
Utwórzmy macierz C1 z elementami, którymi są wcześniej zdefiniowane
macierze
A1, A2. Wprowadzenie linii
>> C1 = [A1,
B1]
daje w wyniku macierz C1 o wymiarach 2 na 4.
C1 =
-1.0000 3.5000
1.0000 + 2.0000i 3.0000
- 4.0000i
17.0000 0
5.0000 - 6.0000i
7.0000 + 8.0000i
Na koniec trzeba
odnotować możliwość tworzenia macierzy
pustej – nie zawierającej żadnych elementów - za pomocą samych nawiasów
kwadratowych
D = [ ]
Wygodną formą
budowania macierzy jest użycie
następujących funkcji:
eye
macierz
jednostkowa
ones
macierz,
której elementami są jedynki
zeros
macierz
zerowa
rand
macierz
losowa o rozkładzie równomiernym
randn
macierz losowa
o rozkładzie normalnym
linspace wektor
wierszowy o równomiernym rozłożeniu elementów
logspace wektor
wierszowy o logarytmicznym rozłożeniu elementów
:
generuje
wektor o równomiernie rozłożonych elementach
meshgrid macierz
do tworzenia wykresów trójwymiarowych
hilb
macierz
Hilberta.
Argumenty funkcji
muszą być ujęte w nawiasy okrągłe i oddzielone przecinkami. A
oto kilka
przykładów użycia tych funkcji.
Funkcja eye użyta z jednym argumentem N generuje jednostkową macierz
diagonalną
o wymiarach N na N. Np. dla N = 3, wprowadzenie
>> eye(3)
daje wynik
ans =
1 0
0
0 1
0
0 0
1
Część 2
Omawiać
będziemy niektóre z
poleceń MATLAB-a oraz TOOLBOX-u Control System Toolbox, znajdujących
zastosowanie
w teorii liniowych układów regulacji automatycznej.
Matematyczny
opis liniowych
stacjonarnych układów sterowania przedstawia się zwykle w postaci
transmitancji
operatorowej (ang. transfer function) lub we współrzędnych stanu (ang.
state
space). Opis za pomocą transmitancji stosuje się najczęściej w
klasycznych,
jednowymiarowych układach regulacji automatycznej typu SISO (ang. Single
Input Single Output) oraz wielowyjściowych typu SIMO (Single Input
Multiple
Output). W układach
wielowymiarowych
typu MIMO (Multiple Input Multiple Output), przyjmuje się ogólniejszy i
bardziej dogodny opis w przestrzeni stanów. W tabeli 1 podano zestaw
poleceń
Toolbox-u Control System do konwersji każdego z tych opisów na
pozostałe.
Tabela 1. Polecenia
konwersji opisu układów
Nazwa |
Opis polecenia |
tf2ss |
transmitancja
operatorowa na równania stanu |
tf2zp |
transmitancja
operatorowa do postaci czynnikowej |
zp2ss |
postać czynnikowa
transmitancji na równania stanu |
zp2tf |
postać czynnikowa na
transmitancję operatorową |
ss2tf |
równania stanu na
transmitancję operatorową |
ss2zp |
równania stanu na
postać czynnikową transmitancji |
Układ liniowy
jednowymiarowy
można opisać za pomocą transmitancji operatorowej (tf) w postaci
ilorazu
wielomianów:
(1)
gdzie L(s) jest wielomianem m-tego stopnia, M(s) jest wielomianem n-
tego
stopnia, przy czym zachodzi m « n.
We
współrzędnych stanu opis
układu ma postać:
(2)
gdzie x(t)
jest n×1 wymiarowym
wektorem stanu układu, u(t) jest r×1 wymiarowym
wektorem wejścia (sterowania), y(t) jest m×1 wymiarowym
wektorem wyjścia, A jest n×n wymiarową
macierzą stanu, B jest n×r wymiarową
macierzą wejścia, C jest m×n wymiarową
macierzą wyjścia oraz D jest m×r wymiarową
macierzą przejścia (transmisji).
Tabela 2. Polecenia
konwersji opisu układu ciągłego na dyskretny i odwrotnie
Nazwa |
Opis polecenia |
c2d |
opis ciągły na dyskretny |
c2dt |
transmitancja operatorowa do
postaci czynnikowej |
c2dm |
postać czynnikowa transmitancji
na równania stanu |
d2c |
postać czynnikowa na
transmitancję operatorową |
d2cm |
równania stanu na transmitancję
operatorową |
Tabela 3. Polecenia
do wykonywania charakterystyk czasowych
Nazwa |
Opis polecenia |
step |
odpowiedź jednostkowa układu
ciągłego |
impulse |
odpowiedź impulsowa układu
ciągłego |
lsim |
symulacja układu ciągłego dla
danych wejść |
initial |
odpowiedź układu ciągłego przy
zadanych warunkach początkowych |
dstep |
odpowiedź jednostkowa układu
dyskretnego |
dimpulse |
odpowiedź impulsowa układu
dyskretnego |
dlsim |
symulacja układu dyskretnego dla
danych wejść |
dinitial |
odpowiedź układu dyskretnego
przy zadanych warunkach początkowych |
Polecenia
służące do
tworzenia charakterystyk czasowych: step, impulse, lsim,
initial
step
Polecenie step
wyznacza odpowiedź jednostkową układu dla danej transmitancji
operatorowej lub zadanego
opisu układu we współrzędnych stanu.
Składnia dla
zadanej
transmitancji operatorowej ma jedną z podanych postaci:
step(l,m)
step(l,m,t)
[y,x]=step(l,m,t)
[y,x,t]=step(l,m)
gdzie l = [bm
bm-1 ... b1 b0]
jest to wektor współczynników wielomianu licznika transmitancji,
m = [an an-1 ...
a1 a0] jest wektorem współczynników wielomianu
mianownika
tej transmitancji,
t jest zadanym wektorem czasu.
Wprowadzenie polecenia bez
argumentów lewostronnych,
spowoduje wykonanie wykresu odpowiedzi skokowej układu w zakresie
zdeterminowanym wektorem czasu t. Jeżeli czas nie został
wyspecyfikowany jako
argument prawostronny, to program przyjmuje automatycznie wektor czasu
i
również rysuje wykres. Wartości obliczonych wektorów nie są wypisywane
na
ekran. Podanie argumentów lewostronnych wstrzymuje wykonywanie wykresu,
natomiast mogą być wypisane ich wartości.
W przypadku
gdy znany jest
opis układu w przestrzeni stanu, stosowanie polecenia step ma
jedną z
możliwych postaci:
step(A,B,C,D,IU)
step(A,B,C,D,IU,t)
[y,x]=step(A,B,C,D,IU,t)
[y,x,t]=step(A,B,C,D,IU)
gdzie IU
jest
numerem wejścia, do którego przyłożono skok jednostkowy.
Przykład 1
Wyznaczyć
odpowiedź
jednostkową układu jednowymiarowego opisanego transmitancją operatorową
gdzie .
W oknie
poleceń MATLAB-a
(MATLAB Command Window) wprowadzamy sekwencję poleceń
>>l=3;m=[5 1];step(l,m)
Otrzymujemy w
wyniku wykres
odpowiedzi jednostkowej przedstawiony na rys. 1, w zakresie czasu
dobranym
automatycznie przez program, linią przerywaną zaznaczona jest wartość
ustalona
odpowiedzi. Skalowanie i opis układu współrzędnych ( w języku ang.)
odbywa się
również automatycznie[1].
Rys. 1
Odpowiedź
jednostkowa układu wyznaczona poleceniem step(l,m)
Przykład 2
Dany jest
obwód elektryczny
jak na rys. 2. Należy wyznaczyć odpowiedź jednostkową układu w zakresie
czasu t
= 0 do 30. Przyjmiemy, że wymuszeniem jest funkcja jednostkowa u1 =
1(t),
przy napięciu u2 = 0.
Rys. 2
Schemat obwodu
elektrycznego
Jako
współrzędne stanu
obieramy prąd x1 w gałęzi R1, L oraz napięcie x2
na kondensatorze C, zaś jako wyjście y, prąd w gałęzi R. Wielkościami
wejściowymi są napięcia u1 i u2.
Na podstawie pierwszego i drugiego prawa
Kirchhoffa
otrzymujemy układ równań, który po przekształceniu do postaci (2)
przedstawia
się następująco:
Stąd
mamy
Użyjemy teraz
dla odmiany
polecenia [y,x]=step(A,B,C,D,IU,t)z
lewostronnymi argumentami y i x oraz prawostronnymi A,B,C,D,IU,t.
Argument IU oznacza numer wejścia, do którego przyłożono
funkcję skoku
jednostkowego.
Jeżeli
wykonanie zadania
wymaga użycia większej liczby poleceń, to wygodniej jest posłużyć się
tzw.
m-plikiem (ang. m-file). Do tego m- pliku tekstowego (rozszerzeniem
jego nazwy
musi być litera m), czyli skryptu zapisujemy następującą sekwencję
poleceń:
R1
=1; % parametr obwodu
elektrycznego
R2 =2; % jak wyżej
R =3; % jak wyżej
L =1e-4; % jak wyżej
C =1e-4; % jak wyżej
A=[-(R1+R2*R/(R2+R)),R/(L*(R2+R));
-R/(C*(R2+R)),-1/(C*(R2+R))]; % macierz stanu
B=[1/L,-R/(R2+R);0,1/(C*(R2+R))]; %
macierz wejścia
C=[R2/(R2+R),-1/(R2+R)];
%
macierz wyjścia
D=[0,1/(R2+R)];
%
macierz transmisji
t=0:1e-6:2e-3;
%
zadawanie wektora czasu
[y,x]= step(A,B,C,D,1,t);
%
obliczanie odpowiedzi
x1=x(:,1); % wybór pierwszej kolumny z
macierzy odpowiedzi x
x2=x(:,2); % analogicznie jak wyżej
wybór drugiej kolumny
plot(t,x1,t,x2,’c--’,t,y,’g:’); %
polecenie rysowania wykresu
axsis([0 30 -2 4]); % skalowanie osi
układu współrzędnych
grid on;
% nakładanie siatki
na układ współrzędnych
xlabel(‘Czas, sek’); % etykieta osi
czasu
ylabel(‘Odpowiedź’); % etykieta osi odpowiedzi
title(‘Odpowiedź jednostkowa’); % tytuł wykresu
gtext(‘x1’); % wprowadzanie tekstu w miejscu wskazanym myszką
gtext(‘x2’); % jak wyżej
gtext(‘y’);
% jak wyżej
Wykonanie
poleceń
zapisanych w skrypcie odbywa się przez wprowadzenie, w oknie poleceń
MATLAB-a,
jego nazwy bez rozszerzenia
Powyższy
przykład jest
ilustracją stosowania polecenia step do wyznaczania odpowiedzi
jednostkowej
układu dwuwymiarowego opisanego równaniami w przestrzeni stanów.
Pierwsze
cztery argumenty prawostronne tego polecenia są obliczane z zależności
wiążących macierze A, B, C, D z parametrami obwodu R1, R2,
R, L, C, piąty argument określa numer wejścia, w tym przypadku jest to
wejście
o numerze 1. Drugie wejście ma przyjętą domyślnie przez program wartość
zerową.
Wykonanie
wykresów za
pomocą polecenia plot pozwala na wybór rodzaju i atrybutów
poszczególnych linii. Wprowadzono ponadto szereg poleceń, które
pozwoliły
między innymi na dostosowanie rysunku do wymagań użytkownika, np. przez
nałożenie siatki na układ współrzędnych, dołączenie tytułu wykresu i
etykiet
osi (w języku polskim) itd.
Zwracamy
uwagę, że tekst
umieszczony za znakiem % jest komentarzem i przez program nie jest
wykonywany.
Rys. 2 Odpowiedź jednostkowa układu
opisanego równaniami stanu dla u1 = 1(t), u2 = 0
Odpowiedź
impulsową układu
uzyskuje się w analogiczny sposób jak
odpowiedź jednostkową a jedynie
polecenie step zastępujemy poleceniem impulse.
Rys. 3
Odpowiedź impulsowa układu dla u1 = 0, u2 = d(t)
Polecenia
służące do
tworzenia charakterystyk częstotliwościowych: nyquist, bode,
nichols,
margin.
Tabela 4. Polecenia
do tworzenia charakterystyk częstotliwościowych
Nazwa |
Opis polecenia |
nyquist |
wykonuje charakterystykę
Nyquista układu ciągłego |
bode |
wykonuje charakterystykę Bodego
układu ciągłego |
margin |
wyznacza margines amplitudy i
fazy na charakterystyce Bodego dla układu ciągłego |
nichols |
wykonuje charakterystykę
Nicholsa układu ciągłego |
covar |
kowariancja odpowiedzi układu
ciągłego na biały szum |
dnyquist |
wykonuje charakterystykę
Nyquista układu dyskretnego |
dbode |
wykonuje charakterystykę Bodego
układu dyskretnego |
dnichols |
wykonuje charakterystykę
Nicholsa układu dyskretnego |
imargin |
wyznacza margines amplitudy i
fazy przez interpolację |
Dcovar |
kowariancja odpowiedzi układu
dyskretnego na biały szum |
Rys. 4 Charakterystyki
Nyquista
Rys. 5 Charakterystyki bodego dla u1
= sin(wt) przy u2 = 0
Przykład 3
W układzie
jak na rys. 6
wyznaczyć przebiegi napięcia i prądu oraz określić wartość przepięcia na kondensatorze C2, jeżeli
sinusoidalne
napięcie wejściowe załączono bez łukowo z opóźnieniem to =
5msek.
Rys.6 Schemat
obwodu
elektrycznego
Na podstawie
równań
Kirhchoffa mamy
Uwzględniając
związek
zachodzący pomiędzy prądem a napięciem na kondensatorze, możemy napisać
Stąd po
przekształceniu
otrzymujemy układ równań stanu
Do
rozwiązania powyższego
układu równań użyjemy teraz polecenia lsim według składni:
[y,x]=lsim(a,b,c,d,u,t)
R1=1;
R2=1.2;
C1=0.53e-6;
C2=1.06e-6;
L1=0.52e-3;
L2=1.04e-3;
%Um=sqrt(2/3)*15e3;
Um=30e3*sqrt(2);
freq=2*pi*50;
num=1;
den=[L1*L2*C1*C2
L1*C1*R2*C2+R1*C1*L2*C2;
R1*C1*R2*C2+C1*L1+L1*C2+C2*L2
R1*C2+R2*C2 1];
a=[-R1/L1,0,-1/L1,0;
0,-R2/L2,1/L2,-1/L2;
1/C1,-1/C1,0,0;
0,1/C2,0,0];
b=[1/L1;0;0;0];
c=[0,0,0,1];
d=[0];
ts=10e-3;
to=5e-3;
t=0:ts*1e-3:ts;
u=Um*sin(freq*t).*stepfun(t,to); %u=Um*stepfun(t,to);
[y,x]=lsim(a,b,c,d,u,t);
%[y,x]=lsim(num,den,u,t);
y=c*x';
x1=x(:,1);
x2=x(:,2);
x3=x(:,3);
x4=x(:,4);
ymin=min(y);
ymax=max(y);
t=t*1e3;
figure(1);plot(t,u',t,y);xlabel('t,msek');ylabel('U, V');
grid on;title('Napięcie we-wy');%axis([0 ts ymin ymax]);
figure(2);plot(t,x1);grid on;title('Prąd i1');
figure(3);plot(t,x2);grid on;
figure(4);plot(t,x3);grid on;
figure(5);plot(t,x4);grid on;
figure(6);
subplot(2,2,1);plot(t,u',t,y);xlabel('t, msek');
grid on;title('Napięcie we-wy');
subplot(2,2,2);plot(t,x1);grid on;title('Prąd i1');
subplot(2,2,3);plot(t,x2);grid on;
subplot(2,2,4);plot(t,x4);grid on;
save ga_dane.dat x –ascii
Rys. 7
Przebiegi napięć i prądów w układzie
*
Istnieje możliwość wyłączenia
rozróżniania poleceniem casesen off, polecenie
casesen on wznawia
rozróżnianie.
* dla
oznaczenia jednostkowej
liczby urojonej w MATLAB-ie używa się litery i albo j
[1] Nie ma możliwości opisu w języku polskim bez
zmiany tekstu m-pliku step.m z katalogu matlab\toolbox\control.