Programowanie Środ Matlab

Z Skrypty dla studentów Ekonofizyki UPGOW

(Różnice między wersjami)
(Macierze)
m (Macierze)
Linia 280: Linia 280:
Parametrem tych funkcji może być liczba naturalna np. ''n'', wówczas powstaje macierz kwadratowa o wymiarach ''n'' * ''n'', lub para liczb naturalnych np. (''n'', ''m'') co prowadzi do utworzenia macierzy o wymiarach ''n'' * ''m''.
Parametrem tych funkcji może być liczba naturalna np. ''n'', wówczas powstaje macierz kwadratowa o wymiarach ''n'' * ''n'', lub para liczb naturalnych np. (''n'', ''m'') co prowadzi do utworzenia macierzy o wymiarach ''n'' * ''m''.
   
   
-
'''magic'''()      - macierz kwadratowa o wymiarze >2, każdy składnik macierzy jest liczbą naturalną (całkowitą dodatnią) różną od wszystkich pozostałych. Suma liczb w każdej kolumnie, na każdej przekątnej i w każdym wierszu jest taka sama.  
+
'''magic'''()      - macierz kwadratowa o wymiarze >2, każdy składnik macierzy jest liczbą naturalną (całkowitą dodatnią) różną od wszystkich pozostałych. Taka macierz jest też zwana [http://pl.wikipedia.org/wiki/Kwadrat_magiczny_(matematyka) kwadratem magicznym]. Suma liczb w każdej kolumnie, na każdej przekątnej i w każdym wierszu jest taka sama.  
Parametrem '''magic'''() może być tylko jedna liczba naturalna np. ''n'' ( ''n'' > 2), wtedy macierz ma wymiar ''n'' * ''n''. Zobaczmy jak wygląda najmniejsza macierz magiczna ( ''n'' = 3)
Parametrem '''magic'''() może być tylko jedna liczba naturalna np. ''n'' ( ''n'' > 2), wtedy macierz ma wymiar ''n'' * ''n''. Zobaczmy jak wygląda najmniejsza macierz magiczna ( ''n'' = 3)

Wersja z 08:49, 6 lut 2011

Środowisko Matlab

MATLAB jest obecnie bardzo rozbudowanym narzędziem obliczeniowo-programistycznym, w tym rozdziale przedstawię tylko wybrane, podstawowe elementy środowiska MATLAB.

Spis treści


Informacje podstawowe

MATLAB jest obecnie bardzo rozbudowanym narzędziem obliczeniowo-programistycznym, w tym podrozdziale przedstawię tylko wybrane, podstawowe elementy środowiska MATLAB.

Po uruchomieniu MATLAB w oknie pojawia się znak

>>

(ang. prompt) zachęcający do pisania instrukcji. Napiszmy

>> 3 + 4 + 3

Po wpisaniu instrukcji należy nacisnąć klawisz Enter/Return, co oznacza polecenie jej wykonania przez interpreter MATLAB. Wówczas na ekranie pojawi się wynik działania, przypisany do standardowej nazwy ans (ang. answer czyli odpowiedź)

ans = 10

Zakończenie instrukcji średnikiem powoduje, iż rezultat jej działania nie pojawi się na ekranie, jest to wygodne, gdy np. nie interesują nas pośrednie wyniki sekwencji obliczeń.

Instrukcję składającą sie z bardzo dużej liczby wyrażeń, znaków, itp - przez to niewygodną do manipulowania, nieczytelną - możemy dowolnie, według naszego uznania, podzielić na większa liczbę linii. Po napisaniu trzech kropek ... w dogodnym dla nas miejscu, przechodzimy do nowej linii i piszemy dalej. Interpreter potraktuje wyrażenie zapisane w dwóch lub więcej liniach, jako jedną całość. Z drugiej strony, w jednej linii możemy napisać kilka instrukcji, wystarczy je oddzielać przecinkami np.

>> 2 + 4 + 10, 100 – 30, 1000 – 1, 4 + 4 – 8

Na ekranie pojawi się sekwencja wyników,

ans = 16

ans = 70

ans = 999

ans = 0

Do nawigacji pomiędzy poprzednimi i następnymi instrukcjami służą klawisze oznaczone strzałkami (góra, dół). Zadania wykonywane przez MATLAB można w każdej chwili zatrzymać wywołując wbudowaną funkcję pause - do momentu naciśnięcia klawisza dowolnego znaku - ,pause(n) zatrzymać na n sekund, definitywnie przerwać naciskając kombinację klawiszy ctrl c. Instrukcja cls czyści okno, quit lub exit powoduje wyjście z MATLAB.

Znak % (procent) rozpoczyna krótki komentarz, czyli wszystkie znaki napisane po nim, aż do końca linii, są pomijane przez interpreter, służą tylko programiście do opisu.

Zmienne w MATLAB nie wymagają wcześniejszego deklarowania, tworzone są „w locie”, w momencie ich pierwszego użycia (inicjalizacji, nadania wartości), np. instrukcja

>> x = 1.4

powoduje utworzenie zmiennej o nazwie x, jej wartość wynosi 1.4. Dokładniej mówiąc, interpreter rezerwuje odpowiednią ilość komórek pamięci (bajtów) dla zmiennej o nazwie x, do tych komórek pamięci wprowadza wartość, którą w systemie dziesiętnym przedstawiamy jako 1.4. Nazwa zmiennej może zawierać tylko litery alfabetu łacińskiego (duże lub małe), cyfry od 0 do 9, znak podkreślenia, musi przy tym zaczynać się od litery. Naturalnie, nazwa zmiennej nie może się pokrywać ze słowem kluczowym MATLAB. Lista słów kluczowych MATLAB pojawi się na ekranie monitora, po komendzie iskeyword. Wartość danej zmiennej można zobaczyć podając jej nazwę i naciskając Enter, lub korzystając z funkcji disp( ), np.

>> disp(' Wynik testu ')

>> disp(' Karol 4.0 Basia 4.5 Andrzej 3.5')


W MATLAB wszystkie zmienne są traktowane jako tablice, zmienna skalarna traktowana jest jako tablica jednoelementowa.

MATLAB operuje na liczbach zmiennoprzecinkowych podwójnej precyzji. Domyślnie wyświetla jednak tylko 4 cyfry po kropce, aby zapewnić czytelność - taki format nazywany jest w MATLAB format short. Użytkownik może ustalić inny format wyświetlania liczb, pokażę to na przykładzie predefiniowanej w MATLAB zmiennej o nazwie pi:

>> format long  % pokazywać liczby z precyzją 14 miejsc po kropce dziesiętnej

>> pi

>> 3.14159265358979


>> format longE  % precyzja 14 miejsc po kropce, reprezentacja potęgowa

>> pi

>> 3.141592653589793e+000 . Przy definiowaniu zmiennej łańcuchowej (tekstowej) korzysta się z pojedynczych apostrofów, np.

>> napis = ‘Hej !! ‘

>> napis

>> Hej !!

Zmienna typu łańcuchowego może zawierać nazwę instrukcji, taką instrukcję uruchamia funkcja eval( ), np.

>> napis = ‘cos(sin(0)) ‘

>> eval(napis)

>> ans = 1

Funkcja input( ) służy do komunikacji z użytkownikiem programu, wypisuje ona na ekran treść swojego argumentu (łańcuch znaków) i MATLAB oczekuje na reakcję użytkownika. Oto jej typowe zastosowanie

>> n = input( ‘Wpisz n: ‘ )

>> Wpisz n:  % system czeka na wpisanie wartości n

Po wpisaniu za dwukropkiem np. liczby 10 i jak zwykle naciśnięciu Enter, zobaczymy na ekranie wynik podstawienia

>> n = 10

Drugi przykład,

>> pierwszy_atom = input (‘ Nazwa atomu numer jeden: ‘ , ‘s’ )

>> Nazwa atomu numer jeden:  % system czeka na wpisanie nazwy

Wpisanie drugiego parametru funkcji input( ) w postaci ‘s’ oznacza, że interpreter ma potraktować wprowadzoną daną jako ciąg znaków. Pisząc za dwukropkiem np. tlen dostajemy

>> pierwszy_atom = tlen

Funkcja num2str( ) zamienia liczbę na ciąg znaków, str2num( ) zamienia ciąg znaków na liczbę.

Komenda who powoduje wyświetlenie nazw wszystkich zmiennych zdefiniowanych w bieżącym programie (przestrzeni roboczej), whos podaje listę zmiennych wraz z dodatkowymi szczegółami (precyzja, rozmiar macierzy). Usunięcie wszystkich zmiennych powoduje komenda clear, wybraną zmienną, np o nazwie a, usuwamy instrukcją clear a.

Użycie komendy diary podczas sesji MATLAB powoduje, iż od tego momentu cały przebieg aktualnej sesji MATLAB jest zapisywany w pliku o nazwie diary. Komenda,

>> diary moja_sesja

zapisuje przebieg sesji w pliku, który nazwałem moja_sesja. Rejestrację sesji zawiesza komenda diary off, diary on nakazuje wznowienie rejestracji sesji.

MATLAB posiada liczny arsenał funkcji standardowych, np. polecenie

>> exp(1)

kreuje odpowiedź

ans = 2.7183

Kolejny przykład,

>> exp(sin(0)) + cos(0)

ans = 2

Wywołując funkcję rand() otrzymujemy zmiennoprzecinkowa liczbę losową z przedziału < 0, 1 >, natomiast rand(n, m) tworzy macierz o wymiarach n * m takich liczb losowych. Po każdym uruchomieniu MATLAB algorytm generowania liczby losowej w funkcji rand() startuje od tego samego, domyślnego ziarna (ang. seed). Aby tego uniknąć można wywołać rand() jak następuje

>> rand('state',sum(100*clock));

Tym sposobem „seed” jest wybierany na podstawie wskazań zegara systemowego, a więc za każdym wywołaniem inny.

Dotychczasowe przykłady były wypisywane bezpośrednio, w wierszu poleceń po znaku zachęty. Takie postępowanie jest czytelne, niezbyt uciążliwe i efektywne tylko przy niewielkiej sekwencji instrukcji, zajmujących kilka linii. W praktyce kod programu wygodniej przygotowywać, modyfikować bądź poprawiać w oddzielnym pliku. Jeżeli zapiszemy ten plik z rozszerzeniem *.m, na przykład moj_kod.m, to MATLAB potraktuje go jako skrypt, tzw. m – plik. Wpisanie w linii komend nazwy m-pliku (bez rozszerzenia)

>> moj_kod

powoduje wykonywanie wszystkich instrukcji zapisanych w tym pliku, jak gdyby były one wpisywane po kolei w linii poleceń.

MATLAB oferuje nie tylko szeroką paletę funkcji standardowych, ale umożliwia tworzenie przez programistę jego własnych funkcji. Definicję takiej funkcji należy koniecznie umieścić w pliku o rozszerzeniu *.m, podobnie jak w przypadku skryptu. Różnica polega na tym, iż nazwa m – pliku skryptowego może być dowolna, natomiast nazwa m – pliku zawierającego funkcję definiowaną samodzielnie przez programistę musi by taka sama, jak nazwa funkcji. Definicja własnej funkcji musi zaczynać się od słowa kluczowego function i dalej zawiera:

- nazwę zmiennej zwracającej wartość obliczoną przez funkcję. Jeżeli takich zmiennych jest więcej, ich listę umieszcza się w nawiasie kwadratowym [ ]
- znak podstawienia ( = )
- wybraną przez programistę nazwę funkcji z umieszczoną w nawiasach półokrągłych listą parametrów wejściowych, od których funkcja zależy.

Dalej zaleca się zamieszczenie komentarza informującego, co ta funkcja robi, potem jest ciąg instrukcji do wykonywania przez funkcję czyli tzw ciało funkcji. Definicję funkcji kończy słowo kluczowe end. Wszystkie zmienne kreowane w ciele funkcji są lokalne. Przykład,

function  wynik   =  moja(x, y)
% oblicza kombinację funkcji trygonometrycznych 
wynik = sin(x) + cos(y)sin(y) * cos (x);
end

Po zapisaniu tego kodu w pliku moja.m, korzystamy z tej funkcji wywołując ją z linii komend

z  =  moja(0, pi)
z   =  - 1

W plikach *.m umieszcza się zwykle bardziej rozbudowane funkcje. Istnieje możliwość definiowania własnych funkcji bezpośrednio w linii komend, bez zapisywania do *.m pliku – nazywamy ją wówczas funkcją inline. W praktyce tym sposobem definiuje się funkcje o niewielkim kodzie. W przykładzie

>> f = inline( ‘4*x + 7’ , ‘x’ )

tworzę funkcję f(x) = 4 x + 7 i od tego momentu jest ona do dyspozycji

>> f(2)

>> ans = 15

Jeżeli chcemy, aby ta sama zmienna/macierz mogła być używana przez kilka różnych funkcji, była "widoczna" w całej przestrzeni roboczej, należy ją porzedzić słowem 'global. Komenda what podaje listę m-plików zapisanych w bieżącym katalogu. Użyteczną funkcją jest polyval( ), która ułatwia posługiwanie się wielomianami. Należy podać dwa parametry wejściowe; wektor współczynników wielomianu oraz wektor wartości, dla których ten wielomian ma być obliczony. Jeżeli interesują mnie wartości wielomianu, np. f(x) = x3 + 4x2 – 2x -3 w punktach x = {0, 1, 2, ….9, 10}, wystarczą trzy instrukcje

>> x = 0 : 10; c = [1 4 -2 3]; f = polyval(c, x);

Wykres tego wielomianu f(x) w przedziale <0, 10> otrzymamy po wywołaniu plot( )

>> plot(x, f)

Dostęp do dokumentacji MATLAB zapewnia polecenie doc. Pojawia się lista zagadnień (menu). Wybieramy interesujący nas temat, zagłębiając się w bardziej szczegółowe poziomy dokumentacji „on line”. Warto także skorzystać z komendy help, na przykład

>> help sin

wyświetla informację o funkcji sinus. Komenda help plot prowadzi do szczegółowego opisu opcji funkcji plot i pokrewnych. Komenda lookfor, np.

>> lookfor sqrt

powoduje przeszukiwanie plików pomocy szukając łańcucha wpisanego po lookfor, tutaj sqrt. Nawiasem mówiąc, jest to nazwa wbudowanej funkcji pierwiastek kwadratowy.

Macierze

W MATLAB zmienne domyślnie są traktowane jako macierze (tablice), niezbędne jest poznanie podstawowych zasad posługiwania się takimi zmiennymi. Macierz składa się z elementów ułożonych w wierszach (poziomo) i kolumnach (pionowo). Macierz o m wierszach i n kolumnach zawiera m * n elementów. Szczególnym przypadkiem jest wektor, czyli macierz o tylko jednym wierszu i n kolumnach (1 * n) lub tylko jednej kolumnie i m wierszach (m * 1). Skalar to po prostu tablica jednoelementowa, dla której m = n = 1. Istnieje kilka sposobów definiowania tablicy, jak w poniższych przykładach:

>> m = [ 2 5; 6 10]  % wyrazy w wierszu rozdziela spacja lub przecinek, po średniku lub

% przejściu do nowej linii rozpoczyna się następny wiersz

m =

2     5
6    10

>> m = [5 10 15 20]  % definicja 4-elementowego wektora wierszowego (poziomego)

m =

5   10   15   20

>> m = [10; 11; 12]  % definicja 3-elementowego wektora kolumnowego (pionowego)

m =

10
11
12

m = [min: krok: max]  % tworzy wektor o elementach od min do max, z krokiem postępu

% krok, pominięcie parametru krok domyślnie oznacza krok = 1

>> m = [0: 1: 10]

m =

0  1  2  3  4  5  6  7  8  9  10 

>> m = [1: 5; 10: 10: 50]

m =

 1    2    3    4    5 
10  20  30  40  50 

Wywołanie funcji linspace(a, b, n) tworzy wektor o n elementach równomiernie (liniowo) rozmieszczonych, poczynając od pierwszego a, kończąc na ostatnim b,

>> m = linespace(0, 20, 3)

m =

 0   10   20

Nic nie stoi na przeszkodzie aby nową macierz (tablicę) ”poskładać” z już istniejących, trzeba przy tym pamiętać o zgodności wymiarów, np.


>> m1 = [1 2 3; 4 5 6];

>> m2 = [7 8; 9 10];

>> m3 = [0 0 0 0 0; 0 0 0 0 0];

>> m = [m1 m2; m3]

m =

 1    2    3    7    8
 4    5    6    9   10
 0    0    0    0    0
 0    0    0    0    0

MATLAB wykonuje operacje rachunku macierzowego; dodawanie, odejmowanie, na szerszy komentarz zasługuje mnożenie. Przy dwóch danych tablicach A i B, z których A ma tyle kolumn co B wierszy, zapis

>> C = A * B

oznacza mnożenie zgodnie z regułą rachunku macierzowego (mnożenie Cauchy’ego), tj. element Cij macierzy C jest sumą Cij = Aik Bkj ( sumowanie po powtarzających się wskaźnikach). Zapis C = A^2 jest równoważny C = A * A, z kolei C = A/B jest równoważny C = A B-1 (B-1 jest macierzą odwrotną do B).

Druga opcja to tzw. mnożenie tablicowe. Komenda A.*B ( mnożenie z kropką) powoduje mnożenie każdego elementu tablicy A przez jego odpowiednik w tablicy B. Tak mnożone tablice muszą mieć ten sam wymiar, przykład

>> A = [1 2; 3 4];

>> B = [5 6; 7 8];

>> C = A. * B

C =

 5   12
21   32

Dzielenie i potęgowanie tablicowe zapisujemy A./B, A.^2, odpowiednio. W celu wywołania pojedynczego elementu macierzy, np. Cij piszemy C(i, j). Pierwszy wskaźnik to numer wiersza, drugi kolumny, przy czym wiersze i kolumny numerowane są od jedynki. MATLAB dysponuje funkcjami, wykonującymi typowe operacje na macierzach, zwłaszcza kwadratowych.

MATLAB posiada funkcje, umożliwiające szybkie tworzenie typowych, często używanych macierzy oraz niektórych tzw. macierzy specjalnych, oto kilka z nich:

zeros() - macierz składająca się z samych zer

eye() - macierz jednostkowa, jedynki na głównej przekątnej, pozostale elementy zerowe

ones() - macierz składająca się z samych jedynek

Parametrem tych funkcji może być liczba naturalna np. n, wówczas powstaje macierz kwadratowa o wymiarach n * n, lub para liczb naturalnych np. (n, m) co prowadzi do utworzenia macierzy o wymiarach n * m.

magic() - macierz kwadratowa o wymiarze >2, każdy składnik macierzy jest liczbą naturalną (całkowitą dodatnią) różną od wszystkich pozostałych. Taka macierz jest też zwana kwadratem magicznym. Suma liczb w każdej kolumnie, na każdej przekątnej i w każdym wierszu jest taka sama.

Parametrem magic() może być tylko jedna liczba naturalna np. n ( n > 2), wtedy macierz ma wymiar n * n. Zobaczmy jak wygląda najmniejsza macierz magiczna ( n = 3)

>> m = magic(3)

m =

 8    1    6
 3    5    7
 4    9    2


W celu zwiększenia szybkości pracy programu wykonywanego w środowisku MATLAB, można przeprowadzać tzw. wektoryzację algorytmów. Dotyczy to zwłaszcza algorytmów intensywnie używających instrukcji sterujących (np. pętli for). Instrukcje MATLAB wpisane przez użytkownika są odczytywane i przetwarzane potokowo, za pośrednictwem interpretera kodu. Wprowadza to pewne "organiczne" opóźnienie wykonywania w porównaniu do takich języków jak asembler czy C/C++. MATLAB jest silnie zoptymalizowany pod kątem wykonywania działań na macierzach. Wektoryzacja polega zatem na zastępowaniu klasycznych instrukcji sterujących (pętli) przez takie specyficzne operacje na macierzach czy wektorach, które wykonywane/interpretowane są bardzo szybko w środowisku MATLAB. Posłużę się bardzo prostym przykładem - utworzenie wektora, którego składowymi są wartości funkcji sinus. Przy okazji wspomnę o parze współpracujących ze sobą matlabowskich funkcji tic() i toc(), które w duecie działają jak stoper do pomiaru czasu wykonywania bloku instrukcji w programie. Funkcja tic() włącza stoper, toc() go zatrzymuje i wypisuje na ekran czas (elapsed time) jaki upłynął od ostatniego wywołania tic().

x = 0.0;
disp('Bez wektoryzacji:')
tic
for m = 1:10001
y(m) = sin(x); 
x = x + 1; 
end
toc

Po wykonaniu programu na ekranie mojego komputera zobaczyłem komunikat

Elapsed time is 0.42 seconds.

Wektoryzacja tego samego programu wygląda następująco,

disp('Po vectoryzacji:')
tic
x = 0:10000;
y = sin(x);
toc

Tym razem pojawił się napis,

Elapsed time is 0.0039 seconds.

Kod wektoryzowany został wykonany ponad sto (!) razy szybciej, chyba warto wektoryzować, prawda ? Takie "przebicie" w transakcjach ekonomicznych, rynkowych to już raczej marzenie inwestora/menadżera. Zobaczmy jeszcze drugi przyklad, mnożenie macierzowe i tablicowe dwóch macierzy

 

Jeżeli szybkość działania przygotowywanego przez Ciebie programu w środowisku MATLAB jest bardzo istotna, wektoryzacja powinna pomóc. Naturalnie, o ile wykorzystywane w programie algorytmy poddają się wektoryzacji.

Instrukcje sterujące

W MATLAB nie występują zmienne typu logicznego. W zamian obowiązuje konwencja; jeżeli wyrażenie lub zmienna ma liczbową wartość zero, to jego logiczna wartość (stan) jest false. Gdy wartość liczbowa wyrażenia różni się od zera, wówczas jego stan logiczny jest true. Naturalnie, stan logiczny true albo false otrzymamy również, gdy w danym wyrażeniu występują operatory logiczne (np. > , < , = =, ...). Omawiam niżej grupę instrukcji w MATLAB, które służą do podejmowania decyzji w programie, są to tzw. instrukcje sterujące.

Instrukcja warunkowa if

Wymienię warianty instrukcji warunkowej if:

a)

if warunek
instrukcja
end
Przykład,
if ( z < 0 )
disp(‘ z ujemna’)
end

b)

if warunek
instrukcja_1
else
instrukcja_2
end
Przykład,
if  z  < 0
disp(‘ Uwaga ! liczba ujemna’)
else
disp(‘OK')
end

Konstrukcja ze słowem kluczowym elseif umożliwia kolejne sprawdzanie kilku warunków. Warunek występujący przy elseif jest sprawdzany tylko wtedy, gdy warunki pojawiające się wcześniej nie są prawdziwe:

c)

if warunek_1
instrukcja_1
elseif warunek_A
instrukcja_A
elseif warunek_B
instrukcja_B
elseif warunek_Z_
instrukcja_Z
else
instrukcja_2
end

Przykład:

if      z < 0
disp(‘z mniejsza od zera ’) 
elseif  z > 0
disp(‘z większa od zera’)
else
disp(‘Uwaga, zmienna z ma wartość zero !!’)
end

Pętla while

while
warunek
instrukcja
end

Jeżeli warunek jest prawdziwy, to instrukcja zostaje wykonywana i ponownie przystępuje się do testowania prawdziwości warunku. Instrukcja wykonywana jest tak długo, jak długo jest prawdziwy warunek. Przykład,

k  =  10;
while k  >  0
k  =  k - 1;
disp(k)
end

Na ekranie pojawi sie kolumna liczb poczynając od 9 aż do 0.

Pętla for

Pętla for umożliwia wykonanie instrukcji lub sekwencji instrukcji określoną ilość razy. Schemat pętli

for zmienna_iterowana = wyrażenie
instrukcja
end

Zamiast jednej instrukcji, może być ich wiele, oddzielonych np. przecinkami. Wyrażenie występujące w pętli for ma często typową postać: indeks = pocz: krok: koniec. Przykład, obliczanie wartości średniej losowo wybranych n liczb z przedziału <0, 1>

n = 10;
los  = rand(1,n);
suma = 0;
for k = 1 : n
suma =suma + los(k);
end
srednia = suma/n

>> srednia = 0.62738  % ta wartość zależy od wylosowanych wartości wektora los.

Następny przykład,

for k  = 1 : 2
for n = 1 : 2 
wynik =  k + n;
disp( wynik)
end
end

Na ekranie pojawi się 4 – elementowa kolumna

2
3
3
4

Instrukcja wyboru switch

Umożliwia wybieranie jednej z wielu możliwych ścieżek postępowania. Mówiąc w języku kodu programowania, umożliwia wybieranie jednej instrukcji (lub bloku instrukcji) z szerszej palety. Składnia instrukcji wyboru switch:

switch WYBOR  % tylko skalar lub łańcuch
case wyraz_1
instrukcja  % lub blok instrukcji oddzielonych przecinkami
case wyraz_2
instrukcja  % lub blok instrukcji oddzielonych przecinkami
...................
case wyraz_n
instrukcja
otherwise  % nie musi koniecznie wystąpić
instrukcja  % lub blok instrukcji, nie musi wystąpić
end

Porównuje się wyrażenie na wejściu switch (nazwałem je WYBOR) po kolei z wyrażeniami występującymi przy słowach kluczowych case. Jeżeli np. WYBOR = = wyraz_2, to będzie wykonana instrukcja (blok) zapisana poniżej drugiego case, pozostałe instrukcje będą pominięte. Jeżeli wyrażenie WYBOR nie zgadza się z żadną z wartości podanych przy etykietach case, to wykonywane są instrukcje po otherwise. Uwaga, przy etykiecie case można w nawiasach klamrowych wpisać grupę wyrażeń, np. case {wyraz1, wyraz2, wyraz3, ...}. Instrukcja (blok instrukcji) występująca po tej etykiecie będzie wykonana, gdy WYBOR zgadza się z którymkolwiek z wyrażeń w nawiasie klamrowym. Przykład,

switch (sign(x))
case -1
disp(‘ujemna’)
case 1
disp(‘dodatnia’)
otherwise
disp(‘zero’)
end

Następny krótki przykład:

switch k
case 1
n =  10
case 2
n =  50
case 3
n = 100
otherwise
disp(’dopuszczalne tylko k = 1, 2 lub 3)
end

Popatrz jeszcze na poniższy programik o charakterze dydaktycznym, wspomagający nauczanie mnożenia liczb naturalnych (tabliczka mnożenia "do stu"). Innymi słowy, instrukcja wyboru switch na usługach naszych milusińskich.

disp('ILOCZYN LICZB NATURALNYCH - SAMOUCZEK ' )
disp(' ')
a = 't' ;
 
while a == 't' | a == 'T'
 
m = floor(10*rand) + 1;
n = floor(10*rand) + 1;
iloczyn = m * n;
disp(['Ile wynosi iloczyn: ' num2str(m) ' * ' num2str(n) '        '])
disp('  ')
odpowiedz = input( '  ');
if odpowiedz == iloczyn
los = 1 + fix(6 * rand());
disp('  ')
switch los 
case 1
disp(' Wspaniale ')
case 2
disp(' Doskonale sobie radzisz ' )
case 3
disp(' Bardzo dobrze, zadziwiasz mnie ')
case 4
disp(' Doskonale ')
case 5
disp(' Gratulacje, no, no ')
case 6
disp(' Bardzo fajnie, tak trzymaj ')
end
 
else
los = 1 + fix(6 * rand());
disp('  ')
 
switch los 
case 1
disp(' Kiepsko ')
case 2
disp(' No niestety, .... ' )
case 3
disp(' Niedobrze ')
case 4
disp(' Przykro mi, ale musisz jeszcze popracowac ')
case 5
disp(' Wynik niepoprawny ')
case 6
disp(' Nie, nie, policz jeszcze raz ')
end
end
 
disp('  ')
a = input('Jeszcze raz, T/N  ? ', 's');
if a == 'n' | a == 'N'
disp('    ')
disp('Bye, bye, bye, ...')
disp('  ')
end
end

Instrukcja break

Przerywa instrukcję switch, powoduje także natychmiastowe zakończenie/przerwanie wykonywania pętli; for, while, ... .

Jeżeli mamy do czynienia z kilkoma pętlami, zagnieżdżonymi jedna wewnątrz drugiej, to instrukcja break powoduje przerwanie tylko tej najbardziej wewnętrznej pętli, w której występuje. To przerwanie pętli z wyjściem o jeden poziom wyżej.

Instrukcja continue

Instrukcja continue występuje zwykle wewnątrz pętli while, for, ... . Powoduje ona zaniechanie wykonywania instrukcji będących treścią pętli, jednak sama pętla nie zostaje przerwana. Instrukcja continue przerywa tylko bieżący obieg pętli i zaczyna następny obieg, kontynuując pracę pętli. Innymi słowy, napotkanie instrukcji continue odpowiada natychmiastowemu przejściu/skokowi na sam koniec pętli, komputer "pomyśli", że wykonał treść pętli i przystąpi do następnego obiegu. W ten sposób instrukcje pętli leżące poniżej continue, aż do końca pętli, nie będą realizowane.

Grafika

MATLAB umożliwia tworzenie grafiki, rozmaitych wykresów, prezentację przebiegów funkcji,...itp. Szczegółowe omówienie tych zagadnień wykraczałoby znacznie poza ramy tego krótkiego wprowadzenia do MATLAB. Wspomnę tylko o najprostszej opcjach popularnej funkcji plot( ), służącej do tworzenia dwuwymiarowych wykresów. Funkcja plot(), samoczynnie otwiera nowe okno, o ile nie istnieje juz wcześniej otwarte okno graficzne. Jeśli już istnieje otwarte okno graficzne, plot() skorzysta z tego okna i nie otworzy nowego. W każdej chwili możesz otworzyć nowe, aktywne okno graficzne, wpisując komendę

>> figure

Bywa tak, iż masz kilka otwartych okien graficznych, aby jedno z nich uczynić bieżącym (aktywnym), użyj komendy

>> figure(n)

gdzie n jest numerem okna. W MATLAB każde okno graficzne ma swój numer, który jest widoczny na na pasku tytułowym okna. Wyniki działania używanych w programie funkcji graficznych będą pokazywane w tym oknie, wskazanym jako bieżące.Komenda close zamyka aktywne okno, close(n) zamyka okno numer n, close all zamyka wszystkie okna.

Komenda hold umożliwia dodawanie krzywych do istniejących już wykresów. Gdy wpiszesz

>> hold on

MATLAB nie usunie istniejącego wykresu, lecz doda do niego nowe dane i jeśli będzie to konieczne, przeskaluje wykres. Komenda hold off przywraca stan naturalny tzn. aktualne okno jest czyszczone przed narysowaniem w nim nowej grafiki. Argumentami funkcji plot() są dwa ciągi liczb, podane np. jako nazwy wektorów, lub wpisane bezpośrednio. Wartości pierwszego wektora są pokazywane na osi X (poziomej), drugiego na osi Y (pionowej). Argumentem może być tylko jeden wektor, na osi X wówczas pojawiają się kolejne indeksy wektora, natomiast jego wartości na osi Y. Dla wektora o wartościach zespolonych np. o nazwie Z, instrukcja plot(Z) jest ekwiwalentna następującej,

>> plot(real(Z),imag(Z)).

Przykład tworzenia wykresu funkcji trygonometrycznej cos(x) w przedziale - 2 pi < x < 2 pi

>> x = -2*pi: 0.1 : 2*pi; >> y = cos(x); >> plot(x, y)


Pm1.jpg

Komenda clf czyści okno z aktualnym rysunkiem. Do opisu wykresu służą funkcje;

xlabel('napis1') – umieszcza łańcuch znaków napis1 pod osią x (odciętych)

ylabel('napis2') – umieszcza łańcuch znaków napis2 wzdłuż osi y (rzędnych)

title('napis3') – umieszcza łańcuch znaków napis3 centralnie nad wykresem

Funkcja text() służy do umieszczania łańcucha znaków w dowolnym miejscu wykresu. Jeżeli x oraz y są zmiennymi skalarnymi, komenda text(x, y, ’napis’) umieszcza dolny lewy kraniec łańcucha (tutaj napis) w punkcie (x, y) wykresu, przy czym x oraz y są mierzone w jednostkach bieżącego wykresu, zob. help text. Funkcja gtext( ) spełnia analogiczne zadanie jak text( ), jednakże łańcuch będący jej argumentem jest umieszczany na wykresie w miejscu wskazanym myszką, po kliknięciu jej klawisza lub jakiegokolwiek znaku na klawiaturze. Funkcja subplot(), która posiada trzy parametry (liczby naturalne), pozwala podzielić aktualne okno graficzne na wiele samodzielnych podokien. Wywołanie

>> subplot(n, m, k)

dzieli okno graficzne na m * n podokien (m numeruje wiersze, n kolumny) i ustala jako aktywne podokno o numerze k. Każde podokno ma bowiem swój własny układ współrzędnych i nadany numer wynikający z numerowania podokien wierszami od góry do dołu, natomiast w wierszu od lewej do prawej). Zobaczmy konkretny przykład, kilka niżej wypisanych linii kodu pozwala w jednym oknie przedstawić cztery wykresy różnych funkcji matematycznych.

t = 0:pi/15: 4*pi;
[x,y] = meshgrid(t);
subplot(2,2,1)
plot(sin(t),cos(t)) 
axis equal
subplot(2,2,2)
z = sin(x).*sin(x)-cos(y).*cos(y);
plot(t,z)
axis([0 4*pi -2 2])
subplot(2,2,3)
% z = sin(x).*cos(y);
z = (sin(x).^2).*(cos(y).^2);
plot(t,z)
axis([0 4*pi -1 1])
subplot(2,2,4)
z = (sin(x).^3)-(cos(y).^2);
plot(t,z)
axis([0 4*pi -1 1])
end

Oto wynik interpretacji powyższego kodu przez MATLAB,

Sub3.gif

Wykorzystajmy jeszcze MATLAB do obliczenia wartości czterech funkcji Bessela J(n, x) (n = 0, 1, 2, 3) i spójrzmy na ich wykresy

x = 0:0.1:30;
for k = 1:4,
subplot(2,2,j)
plot(x, besselj(k*ones(size(x)), x))   
end

Bes.gif

Zadania

  1. Napisz program, który oblicza sumę kwadratów liczb naturalnych, od 1 do n.
  2. Dane są dwie macierze M = [3 1; 5 2] oraz N = [1 2; 3 7]. Użyj MATLAB do obliczenia:
    sumy, różnicy, iloczynu macierzowego, iloczynu tablicowego tych macierzy. Oblicz także ich iloraz macierzowy i tablicowy. Sprawdź wyrywkowo wyniki wykonując rachunki bez MATLAB.
  3. Wygeneruj 50 liczb losowych z przedziału < 0, 1 > i przedstaw ten zbiór liczby na wykresie.
  4. Utwórz funkcję inline f(x) = x + cos(x2 ) i przedstaw ją na wykresie dla -5 < x < 5.
  5. Utwórz wektor o n elementach i oblicz średnią arytmetyczną elementów tego wektora.
  6. Napisz program, który pokazuje przebiegi następujących funkcji: cos(x), cos(2x), cos(4x), cos(6x), cos(8x) na jednym, wspólnym wykresie, dla 0 ≤ x ≤ 2 π. Skorzystaj z systemu pomocy MATLAB (komenda help plot), aby poznać więcej opcji funkcji plot( ).
  7. Narysuj wykres wielomianu x5 + 4x3 − 2x + 4, używając do tego celu 50 punktów z przedziału −4 < x < 4.
  8. Wypisz wszystkie kwadraty n2 tych liczb naturalnych n, które spełniają warunek n3 < 2200.