Ćwiczenia z MATLAB`em - Wydział Elektrotechniki i Automatyki

Transkrypt

Ćwiczenia z MATLAB`em - Wydział Elektrotechniki i Automatyki
Politechnika Gdańska
Wydział Elektrotechniki i Automatyki
Katedra Inżynierii Systemów Sterowania
Podstawy automatyki
MATLAB – instrukcje i funkcje zewnętrzne. Grafika w Matlabie.
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ż.
Gdańsk, luty 2010
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.
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 pokazany jest na Rys. 2.
Rys. 1. Otwarcie nowego m-pliku
2
Rys. 2. Przykładowy m-plik
W MATLAB’ie użytkownik na do dyspozycji dwa rodzaje funkcji zewnętrznych: skrypty i
funkcje. Każda z tych funkcji 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ą.
3
Przykład 1
% Przykładowy skrypt MATLAB’a kreślący wykres funkcji
x=-5:0.1:5;
y=x.^2;
plot(x,y);
grid;
title('Przykladowy wykres funkcji');
xlabel('x');
ylabel('y');
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)
ciąg-instrukcji
W przypadku, gdy funkcja nie zwraca argumentów wyjściowym może zostać apisana 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.
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.
4
Podstawowymi instrukcjami MATLAB’a są:
 polecenia – te które omawialiśmy do tej pory i inne,
 instrukcje iteracyjne (pętle) for i while,
 instrukcja warunkowa if,
 instrukcje return, break
Instrukcja for (“dla”)
Ogólna postać instrukcji for MATLAB’a przedstawia się następująco:
for zmienna-iterowana=macierz-wartości,
ciąg-instrukcji,
end
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;
end
Ś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
»
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
end;
y=
1
y=
1.0000
0.5000
y=
1.0000
0.5000
0.3333
5
y=
1.0000
y=
1.0000
»
0.5000
0.3333
0.2500
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ą zmiennej-iterowanej decyduje
programista-użytkownik.
Można tworzyć w MATLAB’ie 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);
end
end
»
»A
A=
1.0000
0.5000
0.3333
»
0.5000
0.3333
0.2500
0.3333
0.2500
0.2000
0.2500
0.2000
0.1667
0.2000
0.1667
0.1429
Należy zwrócić uwagę na to, że każda pętla for musi być zakończona instrukcją end. 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 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:
6
» A=[];
» t=[-1,0,1,3,5]'
t=
-1
0
1
3
5
» n=max(size(t))
n=
5
» for j=1:n
for i=1:n
A(i,j)=t(i)^(n-j);
end
end
»A
A=
1
-1
0
0
1
1
81 27
625 125
1
0
1
9
25
-1
0
1
3
5
1
1
1
1
1
»
Można jednak rozwiązać to zadanie za pomocą pojedynczej pętli stosując indeksowanie
wsteczne.
» A=[]
A=
[]
» A(:,n)=ones(n,1)
A=
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
» for j=n-1:-1:1
A(:,j)=t.*A(:,j+1);
end
7
»A
A=
1
-1
0
0
1
1
81 27
625 125
1
0
1
9
25
-1
0
1
3
5
1
1
1
1
1
»
Instrukcja while (“dopóki”)
Instrukcja while (dopóki) odpowiada analogicznym instrukcjom
programowania takich jak C czy Pascal i ma następującą postać:
z
języków
while wyrażenie-warunkowe,
ciąg-instrukcji,
end
Instrukcja ta powoduje wykonywanie ciągu-instrukcji dopóki wartość wyrażeniawarunkowego 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 the elements.
For vectors, PROD(X) is the product of the elements of X.
For matrices, PROD(X) 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;
end
Odczytamy wynik:
»n
n=
70
8
Bardziej praktycznym przykładem zastosowania instrukcji while jest jej wykorzystanie
do obliczenia eksponenty macierzy, czyli policzenia:
A2 A3
A
e  IA

...
2! 3!
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:
» help norm
NORM
Matrix or vector norm.
For matrices..
NORM(X) is the largest singular value of X, max(svd(X)).
NORM(X,2) is the same as NORM(X).
NORM(X,1) is the 1-norm of X, the largest column sum,
= max(sum(abs((X)))).
NORM(X,inf) is the infinity norm of X, the largest row sum,
= max(sum(abs((X')))).
NORM(X,'inf') is same as NORM(X,inf).
NORM(X,'fro') is the F-norm, sqrt(sum(diag(X'*X))).
NORM(X,P) is available for matrix X only if P is 1, 2, inf or 'fro'.
Zadanie rozwiążemy dla przykładowej macierzy A.
» A=[2,5;1,3]
A=
2
1
5
3
Propozycja rozwiązania zadania jest następująca:
» E=zeros(size(A))
E=
0 0
0 0
» F=eye(size(A))
F=
1
0
0
1
» k=1
9
k=
1
» while norm(E+F-E,1)>0
E=E+F;
F=A*F/k;
k=k+1;
end
»
Wynik otrzymany wynosi:
»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.
Instrukcja warunkowa
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
end
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 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]
10
A=
1
-3
1
-3
-4
2
3
1
-1
» n=2
n=
2
» if n<0
A=-A
elseif rem(n,2)==0
A=2*A
else
B=invA;
end
Sprawdzimy prawidłowość wykonania instrukcji. Macierz A powinna mieć wszystkie
elementy pomnożone przez 2, macierz B powinna być pusta.
>> A
A=
2
-6
2
-6
-8
4
6
2
-2
»B
B=
[]
»
Instrukcja break
Instrukcja break powoduje przerwanie wykonywania pętli, przy czym opuszczony jest
tylko jeden poziom zagłębienia pętli.
Instrukcja return
Instrukcja return powoduje bezwarunkowe opuszczenie danej funkcji lub skryptu
i powrót do miejsca jej/jego wywołania.
11
Grafika w Matlabie
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 y=x dla x  0,10 można uzyskać po wprowadzeniu
następującego programu:
x=0:0.1:10;
y=x;
plot(x,y)
Inną formą zapisu funkcji plot jest:
plot (x1, y1, x2, y2, …)
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 (błękitny)
magenta (purpurowy)
yellow (¿ó³ty
black (czarny)
white (biały)
Tabela 2. Rodzaje linii wykresu
Symbol
–
:
–.
––
Opis
ciągła
punktowa
kreskowo – punktowa
kreskowa
12
Tabela 3. Oznaczenia punktów wykresu
Symbol
.

x
+
*
s
d
v
?
>
<
p
h
Opis
punkt 
okrąg 
znak x
znak +
gwiazdka
kwadrat
znak ?
trójkąt 
trójkąt ?
trójkąt prawy
trójkąt lewy
gwiazda pięciokątna
gwiazda sześciokątna
Okno graficzne można oczyścić po wywołaniu funkcji clg, natomiast funkcja close
zamyka okno.
Inne wybrane funkcje związane z grafiką dwuwymiarową przedstawia tabela 4.
Tabela 4. Wybrane funkcje związane z grafiką dwuwymiarową
Funkcje
subplot(m,n,p)
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
axis([xmin xmax ymin ymax]) Skalowanie wykresu (xmin xmax ymin ymax – zakresy skal na
poszczególnych osiach układu współrzędnych
hold on (lub hold off)
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
loglog(x,y)
Rysowanie wykresu z użyciem skal logarytmicznych na obu
osiach
semilogx(x,y)
Rysowanie wykresu z użyciem skali logarytmicznej na osi
odciętych
semilogy(x,y)
Rysowanie wykresu z użyciem skali logarytmicznej na osi
rzędnych
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
13
 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
 legend(„tekst1‟,„tekst2‟. ... , „tekstn‟) – wypisuje legendę 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.
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.
The Mathworks. Control System Toolbox for use with Matlab. Natick, 2001.
Zalewski A., Cegieła R. Matlab – obliczenia numeryczne i ich zastosowania.
Wydawnictwo NAKOM, 1996.
14