WYDZIAŁ ELEKTROTECHNIKI I AUTOMATYKI Katedra Inżynierii Systemów Sterowania PODSTAWY AUTOMATYKI MATLAB - instrukcje i funkcje zewnętrzne. Grafika w Matlabie. Wprowadzenie do biblioteki Control System Toolbox. Materiały pomocnicze do ćwiczeń laboratoryjnych - część I - termin T2 Opracowanie: Kazimierz Duzinkiewicz, dr hab. inż. Michał Grochowski, dr inż. Robert Piotrowski, dr inż. Tomasz Rutkowski, dr inż. Rafał Łangowski, dr inż. Gdańsk
1. Funkcje zewnętrzne w MATLAB ie (skrypty i funkcje) MATLAB jest zwykle wykorzystywany w trybie interaktywnym; kiedy zostanie wprowadzone polecenie, MATLAB przetwarza je natychmiast i wyświetla odpowiedź. MATLAB jest jednak w stanie wykonywać sekwencję poleceń zapisanych w pliku. Plik dyskowy zawierający polecenia MATLAB a jest nazywany M-plikiem, ponieważ rozszerzeniem nazwy takiego pliku jest.m (rys. 1). Na przykład, plik o nazwie bessel.m zawiera polecenia MATLAB a, które służą obliczeniu funkcji Bessel a. M-pliki nazywane są też funkcjami zewnętrznymi MATLAB a. Rys. 1. Otwarcie nowego M-pliku Dowolny M-plik składa się z poleceń MATLAB a, wśród których mogą znajdować się odwołania do innych M-plików. Dowolny M-plik może odwoływać się do samego siebie rekursywnie. Przykładowy M-plik został pokazany na rysunku 2. - 2 -
Rys. 2. Przykładowy M-plik W MATLAB ie użytkownik ma do dyspozycji dwa rodzaje funkcji zewnętrznych: skrypty i funkcje. Każda z nich ma postać pliku tekstowego ASCII i jest tworzona za pomocą dowolnego edytora tekstowego. Dzięki możliwości tworzenia własnych funkcji, MATLAB uzyskał właściwości języka proceduralnego. Skrypty są zestawem większych lub częściej używanych poleceń (zbiorem tekstowym zawierającym polecenia), które mają być wykonane przez interpreter MATLAB a. Skrypt nie musi spełniać żadnych dodatkowych wymogów formalnych poza poprawnością znajdujących się w nim poleceń. Rozszerzeniem skryptów jest.m. Wywołanie skryptu dokonuje się przez podanie jego nazwy w wierszu poleceń lub w skrypcie. W jego efekcie zostaną wykonane wszystkie instrukcje znajdujące się w skrypcie. Komentarze w skrypcie poprzedza się znakiem %. Komentarze nie są analizowane przez interpreter, a pełnią tylko rolę dokumentacyjną. Przykład skryptu zaprezentowano na rysunku 3. % Przykładowy skrypt MATLAB a kreślący wykres funkcji kwadratowej x = -5:0.1:5; y = x.^2; plot(x,y); grid; title('przykładowy wykres funkcji'); xlabel('x'); ylabel('y'); Rys. 3. Przykład skryptu Definicję funkcji umieszcza się w skrypcie o nazwie identycznej z nazwą definiowanej funkcji i rozszerzeniem.m. Funkcje przyjmują argumenty wejściowe oraz zwracają argumenty wyjściowe. Definicja funkcji w MATLAB ie ma postać: function [argumenty wejściowe] = nazwa funkcji (argumenty wyjściowe) - 3 -
W przypadku, gdy funkcja nie zwraca argumentów wyjściowym może zostać zapisana w następującej postaci: function nazwa_funkcji (argumenty wejściowe) Analogicznie jak w skrypcie, komentarze w funkcji poprzedza się znakiem %. W zasadniczej części funkcji mogą znajdować się wywołania do innych funkcji, konstrukcje programowe realizujące operacje wejścia/wyjścia, obliczenia, komentarze, linie puste itp. W funkcji wyróżniamy dwa rodzaje zmiennych: lokalne i globalne. Zmienne utworzone w trakcie wykonywania funkcji to zmienne lokalne. Zmienne te nie są dostępne w przestrzeni roboczej MATLAB a. Zmienne globalne są dostępne w przestrzeni roboczej MATLAB,a i poprzedza je słowo global. Szczegółowy opis funkcji zawiera plik pomocy MATLAB a. 2. Instrukcje MATLAB a MATLAB jest wyposażony w instrukcje sterujące realizacją poleceń o składni zapożyczonej z języka C. Podobne instrukcje istnieją w innych językach programowania. MATLAB posiada polecenia, które umożliwiają definiowanie własnych funkcji. Istnieją w nim instrukcje, które zapewniają interaktywną współpracę napisanego programu aplikacyjnego z użytkownikiem. Podstawowymi instrukcjami MATLAB a są: polecenia - m. in. te które zostały opisane do tej pory, instrukcje iteracyjne (pętle) for i while, instrukcja warunkowa if, instrukcje return, break. 2.1 Instrukcja for ( dla ) Ogólna postać instrukcji for MATLAB a przedstawia się następująco: for zmienna-iterowana=macierz-wartości, ciąg-instrukcji, Weźmy następujący przykład, w którym nadawane są wartości elementom wektora x równe odwrotności wartości indeksu elementu: N=10; for i=1:n x(i)=1/i; Średnik kończący ciąg instrukcji wewnątrz pętli powoduje, że nie jest wyświetlana odpowiedź po wykonaniu każdej iteracji. Wektor x możemy wyświetlić po zakończeniu wszystkich iteracji pętli. x x = Columns 1 through 7 1.0000 0.5000 0.3333 0.2500 0.2000 0.1667 0.1429 Columns 8 through 10 0.1250 0.1111 0.1000-4 -
Wyniki działania pętli moglibyśmy prześledzić nie umieszczając średnika po ostatniej instrukcji pętli. Ilustruje to poniższy przykład: M=5; for j=1:m y(j)=1/j ; y = 1 y = 1.0000 0.5000 y = 1.0000 0.5000 0.3333 y = 1.0000 0.5000 0.3333 0.2500 y = 1.0000 0.5000 0.3333 0.2500 0.2000 W powyższych przykładach, gdyby N lub M były mniejsze od 1, zapis byłby poprawny, ale ciąg instrukcji wewnątrz pętli nie zostałby wykonany. Gdyby wektory x lub y nie istniały lub miały mniejszą liczbę elementów niż N lub M, wówczas zostałyby one automatycznie zdefiniowane lub rozszerzone. Podsumowując: działanie instrukcji for polega na wykonaniu ciągu-instrukcji dla kolejnych wartości zmiennej-iterowanej. Wartościami tymi są kolejne kolumny pobrane z macierzy-wartości. Jeżeli jako macierz-wartości podany zostanie wektor wierszowy to instrukcje zostaną wykonane dla kolejnych elementów pobranych z tego wektora. O uszeregowaniu wartości, które staną się wartością zmiennejiterowanej decyduje programista-użytkownik. Można tworzyć w MATLAB ie również pętle zagnieżdżone. Ilustruje to poniższy przykład: A=[]; M=3; N=5; for i=1:m for j=1:n A(i,j)=1/(i+j-1); A A = 1.0000 0.5000 0.3333 0.2500 0.2000 0.5000 0.3333 0.2500 0.2000 0.1667 0.3333 0.2500 0.2000 0.1667 0.1429 Należy zwrócić uwagę na to, że każda pętla for musi być zakończona instrukcją. W przeciwnym wypadku MATLAB nie wykona żadnego działania czekając na kolejną instrukcję pętli. Często jest tak, że postawione zadanie można rozwiązać nie tylko jednym sposobem. Należy wówczas dążyć do zastosowania sposobu najprostszego. Zilustrujemy to następującym przykładem. Mamy - 5 -
obliczyć tzw. macierz Vandermonde a dla danego wektora. Kolumny tej macierzy są kolejnymi potęgami tego wektora. Ostatnia kolumna jest potęgą zerową, przedostatnia pierwszą itd. Pierwsza kolumna tej macierzy jest potęgą danego wektora równą jego rozmiarowi. Zadanie to można rozwiązać stosując dwukrotnie instrukcję for: A=[]; t=[-1,0,1,3,5]'; n=max(size(t)); for j=1:n for i=1:n A(i,j)=t(i)^(n-j); A A = 1-1 1-1 1 1 1 1 1 1 81 27 9 3 1 625 125 25 5 1 Można jednak rozwiązać to zadanie za pomocą pojedynczej pętli stosując indeksowanie wsteczne. A=[]; t=[-1,0,1,3,5]'; n=max(size(t)); A(:,n)=ones(n,1); A = for j=n-1:-1:1 A(:,j)=t.*A(:,j+1); A A = 1-1 1-1 1 1 1 1 1 1 81 27 9 3 1 625 125 25 5 1-6 -
2.2 Instrukcja while ( dopóki ) Instrukcja while odpowiada analogicznym instrukcjom z języków programowania takich jak C czy Pascal i ma następującą postać: while wyrażenie-warunkowe, ciąg-instrukcji, Instrukcja ta powoduje wykonywanie ciągu-instrukcji dopóki wartość wyrażenia-warunkowego ma wartość logiczną TRUE (PRAWDA), to znaczy wtedy, gdy macierz będąca wartością wyrażenia warunkowego ma wszystkie elementy niezerowe. Weźmy prosty przykład w którym wykorzystamy funkcję MATLAB a - prod(x). Aby dowiedzieć się co realizuje ta funkcja skorzystamy z pomocy: >> help prod prod Product of elements. S = prod(x) is the product of the elements of the vector X. If X is a matrix, S is a row vector with the product over each column. Wykorzystamy tę funkcję i instrukcję while do dla określenia dla jakiej wartości n wartość wyrażenia n! jest liczbą stucyfrową: n=1; while prod(1:n)<1.e100 n=n+1; Wynik: n n = 70 Bardziej praktycznym przykładem zastosowania instrukcji while jest jej wykorzystanie do obliczenia eksponenty macierzy, czyli policzenia: Uzasadnione jest wykonywanie sumowania szeregu dopóki jego wyrazy są wystarczająco duże. Można na przykład sumować tyle wyrazów tego szeregu, ile potrzeba, aby wynik nie ulegał zmianie przy uwzględnieniu dokładności arytmetyki komputera. Niech A będzie daną macierzą, E - pożądanym wynikiem eksponenty A, F - pojedynczym wyrazem szeregu a k - jego indeksem. Polecenia w pętli będą wykonywane dopóty, dopóki F nie stanie się tak mała, że dodanie jej do E nie zmieni E. W zaproponowanej niżej postaci instrukcji while dla rozwiązania zadania zostanie użyta funkcja MATLAB a norm(x,1). Informację o tej funkcji możemy uzyskać korzystając z polecenia help [patrz również materiał pomocniczy do ćwiczeń laboratoryjnych T1]. Zadanie rozwiążemy dla przykładowej macierzy A. A=[2,5;1,3]; Propozycja rozwiązania zadania jest następująca: - 7 -
E=zeros(size(A)) E = 0 0 0 0 F=eye(size(A)) F = 1 0 0 1 k=1; while norm(e+f-e,1)>0 E=E+F; F=A*F/k; k=k+1; Wynik: E E = 47.8358 130.0844 26.0169 73.8527 Otrzymany wynik możemy sprawdzić korzystając z funkcji MATLAB a expm(x): ea=expm(a) ea = 47.8358 130.0844 26.0169 73.8527 Jak widać obydwa rezultaty są identyczne. 2.3 Instrukcja warunkowa if ( jeżeli ) Instrukcja warunkowa w MATLAB ie ma postać: if wyrażenie-warunkowe1 ciąg-instrukcji1 elseif wyrażenie-warunkowe2 ciąg-instrukcji2 else ciąg-instrukcjin Wykonanie instrukcji if polega na wykonaniu ciągu-instrukcji, związanego z wyrażeniem-warunkowym, jeżeli jego wartość jest TRUE (PRAWDA). Jeżeli nie zachodzi żaden z warunków, wykonywany jest ciąg instrukcji po słowie kluczowym else. Sekwencje elseif i else są opcjonalne. Przykład poniżej, pokazuje w jaki sposób za pomocą instrukcji warunkowej można rozbić obliczenia na trzy różne przypadki. A=[1,-3,3;-3,-4,1;1,2,-1]; n=2; - 8 -
if n<0 A=-A elseif rem(n,2)==0 A=2*A else B=invA; Sprawdzimy prawidłowość wykonania instrukcji. Macierz A powinna mieć wszystkie elementy pomnożone przez 2, macierz B powinna być pusta. A A = 2-6 6-6 -8 2 2 4-2 B B = [] 2.4 Instrukcja break ( przerwa ) Instrukcja break powoduje przerwanie wykonywania pętli (for lub while), przy czym opuszczony jest tylko jeden poziom zagłębienia pętli. 2.5 Instrukcja return ( powrót ) Instrukcja return powoduje bezwarunkowe opuszczenie danej funkcji lub skryptu i powrót do miejsca jej/jego wywołania. 3. Grafika w MATLAB ie W MATLAB ie istnieje kilka grup funkcji graficznych: funkcje przeznaczone do prezentacji danych w postaci wykresów dwu i trójwymiarowych, funkcje związane z usuwaniem rysunku, zmianą skali, dodawaniem napisów itp., funkcje umożliwiające rysowanie linii, wielokątów itp., funkcje niskiego poziomu pozwalające na dowolne kształtowanie wyglądu tworzonego rysunku. Podstawowym poleceniem służącym do graficznej prezentacji danych matematycznych jest polecenie plot, które powoduje narysowanie wykresu funkcji jednej zmiennej. Przykładowo, narysowanie funkcji dla można uzyskać po wprowadzeniu następującego kodu: x=0:0.1:10; y=x; plot(x,y) Inną formą zapisu funkcji plot jest: plot (x 1, y 1, x 2, y 2, ) - 9 -
Funkcja plot może być użyta również z innymi parametrami (określającymi np. kolor wykresu - tabela 1, rodzaj użytej linii - tabela 2 czy oznaczenia punktów - tabela 3) szczegółowo opisanymi w pomocy MATLAB a. Tabela 1. Kolory linii wykresu Symbol b g r c m y k w Kolor blue (niebieski) green (zielony) red (czerwony) cyan (szarobłękitny) magenta (purpurowy) yellow (żółty) black (czarny) white (biały) Tabela 2. Rodzaje linii wykresu Symbol Opis ciągła : punktowa. kreskowo - punktowa kreskowa Tabela 3. Oznaczenia punktów wykresu Symbol Opis. punkt okrąg x znak x + znak + * gwiazdka s kwadrat d znak? v trójkąt? trójkąt? > trójkąt prawy < trójkąt lewy p gwiazda pięciokątna h gwiazda sześciokątna Okno graficzne można oczyścić po wywołaniu funkcji clf, natomiast funkcja close zamyka okno. Inne wybrane funkcje związane z grafiką dwuwymiarową przedstawia tabela 4. - 10 -
Tabela 4. Wybrane funkcje związane z grafiką dwuwymiarową Funkcje subplot(m,n,p) axis([x min x max y min y max ]) hold on (lub hold off) loglog(x,y) semilogx(x,y) semilogy(x,y) Opis Umieszczenie kilku wykresów obok siebie w jednym oknie (m - liczba wykresów w pionie, n - liczba wykresów w poziomie, p - numer wykresu, który zostanie narysowany najbliższym wywołaniem funkcji plot. Skalowanie wykresu (x min x max y min y max - zakresy skal na poszczególnych osiach układu współrzędnych. hold on - pozwala rysować nowy wykres na tle starego. hold off - przed narysowaniem nowego wykresu stary wykres jest wymazywany. Polecenie hold bez parametrów na zmianę włącza i wyłącza czyszczenie ekranu. Rysowanie wykresu z użyciem skal logarytmicznych na obu osiach. Rysowanie wykresu z użyciem skali logarytmicznej na osi odciętych (oś x). Rysowanie wykresu z użyciem skali logarytmicznej na osi rzędnych (oś y). Należy zaznaczyć, że praktycznie każda z przedstawianych funkcji, umożliwia jej stosowanie z dodatkowymi parametrami szczegółowo opisanymi w pomocy MATLAB a. Do szybkiego i rysowania wykresów zależności funkcyjnych służy funkcja fplot. Każdy wykres można opisać. Służą do tego między innymi następujące funkcje: xlabel( tekst ) - wypisuje łańcuch znaków tekst pod osią x, ylabel( tekst ) - wypisuje łańcuch znaków tekst pod osią y, text(x,y, tekst ) - wypisuje łańcuch znaków tekst w miejscu określonym przez współrzędne x i y, gtext( tekst ) - wypisuje łańcuch znaków tekst w miejscu wskazanym myszką, title( tekst ) - wypisuje tytuł wykresu w postaci łańcucha znaków tekst i umieszcza go nad wykresem, leg( tekst1, tekst2...., tekstn ) - wypisuje legę do wykresu w postaci łańcucha znaków tekst1, tekst2,... tekstn, grid on (lub grid off) - narysowanie pomocniczej siatki współrzędnych (grid on) lub jej wyłączenie (grid off). Polecenie grid bez parametrów powoduje przełączanie wyświetlania siatki. W MATLAB ie możliwe jest również rysowanie wykresów w innych układach współrzędnych (np. polar(t,r) - wykres w układzie biegunowym), wykresów animowanych (np. comet(x,y) - ruchomy wykres imitujący lot komety), wykresów słupkowych (np. bar(x,y) - wykres słupkowy) czy histogramów (np. hist (y,x) - histogram słupkowy, rose(t,x) - histogram kołowy). Dane, które zawierają wartości zespolone można rysować przy użyciu specjalnych funkcji matematycznych wyodrębniających ich części rzeczywiste i urojone. Przykładowymi użytecznymi funkcjami są: plot(real(z),imag(z)), compass(x,y), feather(x,y). Oprócz przedstawionych wyżej poleceń związanych z grafiką dwuwymiarową w MATLAB ie możliwe jest również rysowanie wykresów trójwymiarowych, poziomicowych i innych, szczegółowo opisanych w pomocy MATLAB a. 4. Bibliografia Brzózka J. Ćwiczenia z automatyki w Matlabie i Simulinku. Wydawnictwo MIKOM, 1997. Brzózka J., Dorobczyński L. Matlab - środowisko obliczeń naukowo - technicznych. Wydawnictwo MIKOM, 2005. Mrozek B., Mrozek Z. Matlab i Simulink. Poradnik użytkownika. Wydanie II. Wydawnictwo HELION, 2004. - 11 -
Pratap R. Matlab 7 dla naukowców i inżynierów. Wydawnictwo HELION, 2010. Sradomski W. Matlab. Praktyczny poradnik modelowania. Wydawnictwo HELION, 2015. Zalewski A., Cegieła R. Matlab - obliczenia numeryczne i ich zastosowania. Wydawnictwo NAKOM, 1996. - 12 -