Z Skrypty dla studentów Ekonofizyki UPGOW
Linia 208: | Linia 208: | ||
:: 1 2 3 4 5 | :: 1 2 3 4 5 | ||
::10 20 30 40 50 | ::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 C<sub>ij</sub> 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 |
Wersja z 11:11, 25 mar 2010
Ś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)
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