Programowanie Środ Matlab

Z Skrypty dla studentów Ekonofizyki UPGOW

Ś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łowami kluczowymi MATLAB. Wartość danej zmiennej można zobaczyć podając jej nazwę i naciskając Enter, lub korzystając z funkcji disp( ), np. 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

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:

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

Po zapisujemy 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

Komenda what podaje listę m-plików zapisanych w bieżącym katalogu.

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. Argumentami tej funkcji 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,

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

Pm1.jpg

Komenda clf czyści okno z aktualnym rysunkiem.

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.

Maceirze

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 parametr 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 (zob. Dodatek).

Instrukcje sterujące

W MATLAB nie występują zmienne typu logicznego, obowiązuje taka sama konwencja, jak w języku C. 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. Instrukcje sterujące w MATLAB służą do takich samych celów, jak ich odpowiedniki w C. Istnieją jednak drobne różnice, również w składni, dlatego je krótko omówię.

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_A else instrukcja_B 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_A instrukcja_A
elseif warunek_B instrukcja_B
elseif warunek_C instrukcja_C
else instrukcja_N 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

Funkcjonowanie pętli jest analogiczne jak w języku programowania C. 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;

>> 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