Kier. MTR Programowanie w MATLABie Laboratorium Ćw. 3 M-pliki skryptowe w MATLABie. Instrukcje programowania: if, switch, for, while, break, return Wprowadzenie. Tworzenie m-plików skryptowych i uruchamianie skryptów Wpisywanie rozbudowanych poleceń lub skomplikowanych wyrażeń matematycznych bezpośrednio w linii poleceń w oknie Command Window jest uciążliwe, a zaprogramowanie bardziej złożonych obliczeń w taki sposbó staje się praktycznie niemożliwe. Dlatego szereg poleceń do wykonania grupuje się w skryptach, będących plikami tekstowymi zapisywanymi na dysku z rozszerzeniem *.m. Stąd też używane jest określenie m-plik (ang. m-file). Na początku skryptu powinno umieścić się komentarz (dowolny tekst umieszczony liniach poprzedzonych znakiem %), opisujący działanie skryptu. Ze względu na zachowanie uniwersalności pisanych programów wskazane jest używanie w komentarzu tylko znaków ASCII (bez polskich znaków). Z poziomu skryptu możliwe jest wywołanie także innego skryptu. Co prawda m-pliki można tworzyć korzystając z dowolnego edytora ASCII, jednak na ogół znacznie bardziej efektywne jest wykorzystywanie edytora będącego częścią zintegrowanego środowiska programistycznego. Oferuje on szereg narzędzi wspomagających pracę programisty, m. in. kolorowanie składni, podkreślanie par nawiasów, system podpowiedzi. Otwarcie okna edytora w celu utworzenia nowego m-pliku skryptowego jest możliwe przez wybranie opcji New Script w grupie File zakładki HOME na pasku narzędziowym lub wciśnięcie kombinacji klawiszy Ctrl+N. Isniejący plik można otworzyć za pomocą Open lub kombinacji Ctrl+O. Edytor, w zależności od potrzeb, można otworzyć w odrębnym oknie lub jak okno osadzone w oknie MATLABa. Pasek narzędziowy edytora znajduje się w zakładce menu EDITOR. Z poziomu tego paska możliwe jest przeprowadzanie m in. operacji na plikach. Zmiana parametrów edytora (np. wielkość, kolor i krój czcionki, sposób kolorowania składni) możliwa jest dzięki opcji Preferences (Editor /Debugger) dostępnej na głównym pasku narzędzowym w zakładce HOME w grupie ENVIRONMENT. Uruchomienie skryptu polega na wpisaniu w linii poleceń nazwy m-pliku bez rozszerzenia i wciśnięciu klawisza Enter, przy czym plik ten powinien on znajdować się w aktualnym katalogu roboczym lub katalogu do którego została wcześniej zdefiniowana ścieżka dostępu. Konieczne jest przed uruchomieniem zapisanie do m-pliku skryptowego wszystkich zmian (niezapisanie ich spowoduje wykonanie wersji skryptu zapisanej aktualnie na dysku, bez uwzględnienia wprowadzonych zmian). Uruchamianie skryptów możliwe jest także z poziomu wbudowanego edytora na pomocą wywołania opcji Run lub wciśnięcie klawisza F5 (przed uruchomieniem skryptu zmiany wprowadzone do pliku zostają zapisane na dysku). Gdy tak uruchamiany m-plik nie znajduje się w bieżącym katalogu roboczym, MATLAB wyświetla komunikat i prośbę o wybór jednej z opcji: zmiana katalogu roboczego na katalog, w którym znajduje się uruchamiany m-plik (Change Folder), dodanie katalogu do listy ścieżek dostępu (Add Path) lub przerwanie operacji uruchamiania. Wyniki działania skryptu i ewentualne komunikaty o błędach można obserwować w oknie Command Window. Zmienne występujące w pliku skryptowym mają charakter globalny i są dostępne w dowolnej linii realizowanego programu obliczeń. Po zakończeniu wykonania skryptu nadal pozostają w przestrzeni robocznej (o ile nie został usunięte za pomocą funkcji clear).. Wprowadzanie danych z klawiatury
Zatrzymanie działania programu do czasu prowadzenia danych z klawiatury możliwe jest za pomocą funkcji input. Na ekranie wyświetlany jest komunikat będący parametrem funkcji: komunikat = 'Podaj liczbe: '; a = input(komunikat); y = 5 + a; Pod zmienną a podstawiona zostanie stała liczbowa, tablica lub wynik wyrażenia, które wprowadzono z klawiatury. Jeśli wprowadzony z klawiatury ciąg znaków ma być zachowany jako łańcuch znakowy należy użyć funkcji z parametrem s : a = input(komunikat, s ); 3. Operatory relacji i operatory logiczne Sterowanie realizacją programu wymaga podejmowania określonych decyzji będących wynikiem operacji wykazujących operatory relacji i operatory logiczne. Operatory relacji służą porównywaniu wartości i w zależności od wyniku porównania zwraca jest wartość jeśli wynik porównania jest prawdą oraz wartość 0 w przeciwnym przypadku. Są one traktowane w wyrażeniach jako operatory arytmetyczne. W przypadku porównywania wartości skalarnych wynikiem jest wartość skalarna (0 lub ), zaś przy porównywaniu macierzy (muszą mieć wtedy jednakowy wymiar) porównanie jest realizowane element po elemencie i wynikiem jest macierz o tej samym wymiarze wypełniona wartościami 0 lub w zależności od wyniku porównania. Do operatorów relacji należą: < mniejsze od <= mniejsze lub równe > większe od >= większe lub równe == równe ~= różne od (nierówne) Przykłady działania operacji relacji: A=[8 3; 4 8 5; 6 0 8]; B=[8 3 ; 5 8 4; 7 6 8]; A<B 0 0 0 0 0 A<=B 0 0 0 A>B 0 0 0 0 0 0 A==B A~=B 0 0 0 0
0 0 A>4 0 0 0 Operatory relacji mogą być wykorzystane również jako elementy wyrażenia będącego parametrem funkcji find do identyfikacji indeksów elementów wektora, spełniających daną relację. Przykładowo: >> U=[30 5 9 3 35 0 30 9 3 30]; >> a=find(u<30) a = 3 6 8 >> b=find(u>30) b = 4 5 9 Wywołanie funkcji i= find(u) zwraca indeksy elementów wektora U różnych od zera. >> U=[30 5 9 3 35 0 30 9 0 30]; >> i=find(u) i = 3 4 5 6 7 8 0 W przypadku operatorów logicznych operandami są liczby, przy czym wartość różna od zera jest traktowana jako prawda, zaś zerowa jako fałsz logiczny, w wyniku zwracają wartość (prawda) lub 0 (fałsz). Operacja logiczna na wartościach skalarnych daje wartość skalarną (0 lub ), zaś w przypadku macierzy operacja jest realizowana element po elemencie. Operator negacji (zaprzeczenia) ma tylko jeden operand, pozostała operatory dwa. Do operatorów logicznych należą: & iloczyn logiczny (koniunkcja, and), suma logiczna (alternatywa, or), ~ negacja (zaprzeczenie, not). Operacje logiczne można także realizować za pomocą funkcji logicznych: and(a,b) odpowiednik A&B or(a,b) odpowiednik A B xor(a,b) różnica symetryczna (exclusive-or) not(a) odpowiednik ~ all(a) zwraca, gdy wszystkie elementy wektora A są niezerowe, 0 w przeciwnym przypadku, any(a) zwraca, gdy przynajmniej jeden element wektora A jest niezerowy, 0 w przeciwnym przypadku, Kolejność realizacji operacji arytmetycznych i logicznych przedstawia tab.. Tab.. Kolejność wykonywania operacji arytmetycznych i logicznych Kolejność Operacja Nawiasy 3
Potęgowanie 3 Operator NOT 4 Mnożenie, dzielenie 5 Dodawanie odejmowanie 6 Operatory relacji 7 Operator AND 8 Operator OR Przykłady działania operatorów logicznych: A=[8 3; 4 8 5; 6 0 8]; B=[8 3 ; 5 8 4; 7 6 8]; A&B 0 A B ~A 0 0 xor(a,b) 0 0 4. Instrukcje sterujące działaniem programu W poleceniach, m-plikach skryptowych i funkcyjnych można stosować następujące instrukcje sterujące działaniem programu: warunkowe: if, switch iteracyjne: for, while uzupełniające: return, break, continue. Instrukcja warunkowa if elseif else Składnia instrukcji: if wyrazenie_logiczne instrukcje elseif wyrazenie_logiczne instrukcje else instrukcje3 Występowanie elseif oraz else jest opcjonalne. Ponadto może wystąpić kilka instrukcji elseif. 4
W wyrażeniach logicznych stosowane są operatory logiczne. Schemat blokowy instrukcji warunkowej przedstawia rys.. N wyrazenie_logiczne T wyrazenie_logiczne N instrukcje T instrukcje3 instrukcje Instrukcja warunkowa switch Rys.. Schemat blokowy instrukcji warunkowej Składnia instrukcji: switch wyrazenie_przelaczajace case wartosc_wyrazenia_przelaczajacego instrukcje,... instrukcje case {WWP, WWP, WWP3,...} instrukcje,... instrukcje otherwise instrukcje,... instrukcje Instrukcje po case są wykonywane, gdy wyrazenie_przelaczające przyjmie wartosc_wyrazenia_przelaczajacego (WWP). Jeżeli wyrazenie_przelaczajace nie przyjmie żadnej wartości z podanych po case wykonywane są instrukcje znajdujące się po otherwise. Po słowie case można umieścić więcej niż jedną wartość wyrażenia przełączającego kolejne wartości umieszcza się w nawiasie klamrowym i oddziela przecinkami. Wyrażenie przełączające może być liczbą całkowitą lub łańcuchem znakowym. Instrukcja iteracyjna for Składnia instrukcji: for zmienna=wyrazenie instrukcje 5
Pętla for służy do powtarzania wyszczególnionych instrukcji zawartych pomiędzy słowami for i określoną liczbę razy. Wyrażenie występuje na ogół w postaci wektora zapisanego w notacji dwukropkowej. k:n lub k:m:n w którym poszczególne kolumny mogą być zwykłymi skalarami, np. for i=:n instrukcje Za zmienną sterującą w pętli for często postawia się wektor zawierający kolejne liczby całkowite, ale może to być też wektor z dowolymi wartościami liczbowymi. W każdym obiegu pętli zmienna przyjmuje wartości odpowiadające elementom tego wektora a liczba obiegów pętli jest równa jego długości. Pętle for mogą wzajemnie zagnieżdżane. Przerwanie pętli for przed zakończeniem jej wykonania może być dokonane za pomocą break. W przypadku pętli zagnieżdżonych użycie break powoduje przejście do pętli nadrzędnej. Należy dodać, że wykonanie instrukcji for w MATLABie należy do stosunkowo czasochłonnych, dlatego wskazane jest, jeśli to możliwe, zastępowanie jej innymi operacjami. Przykładowo, należy wygenerować wektor złożony z kwadratów kolejnych liczb naturalnych. Program z wykorzystaniem pętli for: x=:6; y=zeros(,length(x)); for i = : length(x) y(i) = x(i)^; Zapis w postaci potęgowania tablicowego: y = x.^; jest bardziej czytelny a przede wszystkim znacznie szybszy w realizacji. Instrukcja iteracyjna while Składnia instrukcji: while wyrazenie_warunkowe instrukcje Instrukcje między while i są wykonywane dopóki wartość wyrazenie_warunkowe przyjmuje logiczne true, tzn. gdy macierz będąca wartością wyrazenie_warunkowe posiada wszystkie elementy niezerowe. Pętla while jest zatem wykonywana nieokreśloną z góry liczbę razy. Przerwanie pętli while umożliwia instrukcja break. Instrukcja pomocnicze return - powoduje opuszczenie danego skryptu lub funkcji, a następnie powrót do jego/jej wywołania (normalnie funkcja jest opuszczana po jej wykonaniu), break - przerywa działanie instrukcji iteracyjnych (for i while), 6
continue wywołane w obrębie instrukcji iteracyjnej opuszcza wykonanie pozostałych instrukcji i przechodzi do wykonania pierwszej instrukcji. Ćwiczenie laboratoryjne. Po zapoznaniu się z Wprowadzeniem należy kolejno otworzyć w edytorze, przeanalizować a następnie uruchomić skrypty lancuchy, petlafor, warif, pwhile, przerwij. Zadania laboratoryjne. Napisać program generujący dowolną macierz liczb losowych z zakresu od 0 do 0 i zliczający elementy: Dodatnie i ujemne, Mieszczące się w zakresie od a min do a max, przy czym wartości graniczne (w zakresie od 0 do 0) podaje się z klawiatury. Opracować wersję z wykorzystaniem operacji relacji (bez wykorzystania pętli for) oraz wersję z pętlą for. Do generowania macierzy wykorzystać funcję rand.. Napisać program przeliczający jednostki energii, J na Wh (dżule na watogodziny). Z klawiatury, za pomocą funkcji input, należy podać wartość i jednostkę wejściową oraz jednostkę wyjściową. W tab. 3 podano przeliczniki wybranych jednostek energii. Tab. 3. Przeliczniki jednostek energii Nazwa jednostki Symbol J cal Wh Dżul J 0,39 0,780-3 Kaloria cal 4,87,630-3 Watogodzina Wh 3600 860 3. Obliczyć funkcji sin x, cos x, sinh x, cosh x za pomocą formuł rekurencyjnych: n sin x uk Rn x k, x u x, uk uk, k,,, n ; 0 x kk 4 n cos x uk Rn x k, x u, uk uk, k,,, n ; 0 x kk 4 n sinh x uk Rn x k, x u x, uk uk, kk 7
n cosh x uk Rn x k 0 x u0, uk uk. kk Wykonać obliczenia dla x = 0,5, n = 5, 0, 50 i porównać uzyskane wyniki z wartościami funkcji otrzymanymi za pomocą funkcji bibliotecznych. Do wyświetlania wyników użyć polecenia format long. 8