Wykład 1
Transkrypt
Wykład 1
WIMIM/MIBM/N1/-/B04 WIMIM/ME/S1/-/C46 WIMIM/IM/S1/-/B19 Co mam zrobić, jeżeli obliczenia potrzebne są na wczoraj, trzeba jeszcze zrobić wykres, a do tego mam użyć Bardzo Skomplikowanego Czegoś wiedząc o tym raczej niewiele? Aby móc obliczyć jak rozchodzi się tsunami, albo czy jutro będzie padał deszcz, albo jak wygnie się belka pod obciążeniem potrzebne są odpowiednie równania i sposób na obliczenie rozwiązań tych równań. Im dokładniej chcemy wykonać takie obliczenia, tym większą ilością liczb będziemy się posługiwać. Sensownie jest więc użyć macierzy zamiast robić rachunki na pojedynczych wartościach liczbowych. Dodawanie Odejmowanie Mnożenie Dzielenie Transponowanie Sprzęganie, sprzęganie hermitowskie Odwracanie i obliczanie wyznacznika Obliczanie śladu macierzy Obliczanie wektorów i wartości własnych Tworzenie macierzy Wyodrębnianie fragmentu Dekompozycje Czytanie/pisanie/drukowanie/rysowanie Konwersja Uwaga: wektory to też macierze. for (i = 1; i <= N; i++) for (j = 1; j <= N; j++) { c[i][j] = 0; for (k = 1; k <= N; k++) c[i][j] = c[i][j] + a[i][k] * b[k][j]; } Ten algorytm działa, ale zwykle działa zbyt powoli – są szybsze sposoby na mnożenie. To zbyt pracochłonne – łatwiej przecież napisać po prostu A * B Matlab jest programem licencjonowanym, można go kupić http://www.mathworks.com/ Alternatywą są darmowe programy ◦ Octave (GNU) http://www.gnu.org/software/octave/ ◦ SciLab (Open Source INRIA) http://www.scilab.org/ Interaktywnie ◦ CLI ◦ GUI Wsadowo ◦ skrypty (polecenie diary) run "skrypt.m" matlab –r "skrypt" ◦ funkcje (alternatywa dla skryptów) MAT-files ◦ zapis poleceniem save ◦ odczyt poleceniem load ◦ zawierają wartości zmiennych na jakich prowadzi się obliczenia M-files ◦ zapis jako pliku z dowolnego edytora tekstu ◦ uruchomienie przez podanie nazwy pliku jako polecenia/funkcji (bez .m) MEX-files Simulink: pliki .SLX oraz .MDL Najprościej – Google Napisać help Napisać helpdesk Napisać doc Odnaleźć opcję menu „help” Uruchomić programy przykładowe Przeczytać PDF Przeczytać podręcznik Uwaga: dokumentacja do tworzonych funkcji Duże i małe litery są traktowane jako różne znaki, zmienna A i zmienna a to dwie różne zmienne. Nie przejmujemy (?) się typami zmiennych Gdy chcemy zobaczyć co jest w zmiennej to ją piszemy w oknie poleceń i naciskamy enter Gdy nie chcemy widzieć wyniku stawiamy średnik Polecenie clear pozwala pozbyć się niepotrzebnych już zmiennych Możemy macierz wczytać z pliku Możemy ją wpisać z klawiatury [1, 2.1e-8; pi, 1+i] Możemy użyć funkcji do tworzenia macierzy np.: ◦ eye(n), speye(n), zeros(n), ones(n), magic(n) ◦ rand(n), randi(n), randn(n) ◦ gallery(nazwa_macierzy_z_galerii, p1, p2, …) Możemy utworzyć jako ciąg, np. 5:5:25 Dodawanie, odejmowanie, mnożenie – zapisujemy jako +-* Transpozycje – kropka-apostrof i apostrof Odwracanie macierzy – funkcja inv Dzielenie macierzy – są dwie odmiany – ze ukośnikiem i ukośnikiem odwrotnym Wyznacznik det, ślad trace Suma, różnica, iloczyn elementów – sum, diff, prod i mnóstwo innych operacji, np. reshape Normalnie Matlab każdą operację robi „na macierzach” (czyli jako operację na macierzach, wektorach i liczbach – zależnie od tego co jest użyte) Jeżeli operator poprzedzi się kropką, to Matlab wykona daną operację skalarnie, choć przetworzy tak wszystkie elementy macierzy Funkcje takie jak sinus też wykonują się na wszystkich elementach macierzy naraz. MatLab pozwala tworzyć bardzo złożone rysunki i zapisywać je np. jako pliki PS (nadają się do druku!) Na początek przydadzą się polecenia ◦ plot(x,y) które rysuje wykres y(x) ◦ surf(x,y,z) rysujące wykres trójwymiarowy ◦ contour(x,y,z) rysujący poziomice Przy pomocy odpowiednich poleceń można umieścić na rysunku tytuły, opisać osie współrzędnych, zmienić skale na logarytmiczne itd. http://www.mathworks.com/products/matlab/demos. html?file=/products/demos/shipping/matlab/ dostarczane wraz z programem Matlab Język programowania pakietu Matlab jest językiem programowania Wikipedia M-pliki MEX-pliki Skrypty w Matlabie Funkcje w Matlabie Instrukcje warunkowe Instrukcje pętli Obsługa wyjątków Programowanie obiektowe?! Skrypty to pliki, w których jest to czego nie chcemy wpisywać z klawiatury za każdym razem od nowa. Nazwa skryptu powinna mieć rozszerzenie .m, np. policz.m Skrypty to po prostu pliki tekstowe: ◦ Notepad++ ◦ edit policz.m ◦ diary ' policz.m' Aby uruchomić polecenia zapisane w skrypcie piszemy jego nazwę bez .m: policz.m wywołuje się pisząc policz Skrypt używa zmiennych globalnych. Zmienne zmodyfikowane przez skrypt będą miały nowe wartości także i poza skryptem. Skrypt nie ma zmiennych lokalnych. Skrypty są uruchamiane z bieżącego katalogu. Gdy nie ma w bieżącym, przeszukiwana jest tzw. ścieżka. ◦ cd – zmiana katalogu ◦ addpath – dopisywanie katalogu do ścieżki ◦ run - uruchamianie skryptu z dowolnego katalogu Kolizje nazw skryptów i zmiennych Funkcje w Matlabie są lepsze niż skrypty zmienne lokalne zmienne globalne parametry wejściowe parametry wyjściowe uchwyty dokumentacja dla help Funkcje podstawowe Funkcje inlinie Funkcje anonimowe Funkcje lokalne Funkcje prywatne Funkcje zagnieżdżone Funkcje przeładowane/przeciążone (overloaded) Jeżeli funkcja nazywa się fun to musi być zapisana w pliku fun.m Na początku musi być napisane słowo kluczowe function, co ma być wynikiem działania, jaka jest nazwa i jakie są parametry Na końcu może być napisane end Wszystkie zmienne wewnątrz funkcji są lokalne… chyba że są globalne Specjalne komentarze - autodokumentacja Zamiast pliku fun.m możemy użyć funkcji inline, np.: fun = inline('x^3 - 1'); fzero(fun, [0, 1]) Funkcje anonimowe to funkcje nie mające własnej nazwy – są wygodniejsze niż inline fzero(@(x)x^3 - 1, pi/4) Można je nazwać, np.: fun1 = @(x,y)x * y / (x + y) ; Funkcje prywatne są to tak samo napisane funkcje jak funkcje podstawowe… ale umieszczone w folderze private W ten sposób stają się one niedostępne do normalnego wywołania… …chyba że wywołuje je inna funkcja, taka która jest w folderze w którym jest folder private elseif opcja = 'WARIANT1'; switch opcja case {'WARIANT1','WARIANT2'} disp('1 albo 2 ') case 'WARIANT3' disp('3') otherwise disp('ani 1, ani 2, ani 3') end eps = 1; while (1+eps) > 1 eps = eps/2; end eps = eps*2 a = zeros(k,k) for m = 1:k for n = 1:k a(m,n) = 1/(m + n -1); end end for s = 1.0: -0.1: 0.0,..., end for s = [1,5,8,17], ..., end for e = eye(n), ..., end for V = A, ..., end for k = 1:n, V = A(:,k); ..., end A = rand(3); B = ones(5); try C = [A; B]; catch err % -- tu możemy coś zrobić -rethrow(err); end global, persistent break return ~ do pomijania parametrów nargin nargout ,…;%# i, j Matlab jest bardzo prosty w użyciu, efektywność Matlaba jest bardzo wysoka, ale wymaga wektoryzacji problemu, tj. zapisania go macierzowo. Większość obliczeń można równie dobrze wykonać w programach Octave lub SciLab używając takich samych poleceń lub po automatycznej translacji – ale niektórych obliczeń nie da się wykonać równie łatwo w darmowych programach. Możliwości graficzne Matlaba znacznie przewyższają konkurencję. Wydajność samych obliczeń numerycznych jest praktycznie taka sama dla wszystkich programów.