cz. 1. - Politechnika Warszawska
Transkrypt
cz. 1. - Politechnika Warszawska
Matlab/Octave Tomasz Sobiech, Politechnika Warszawska, Wydział Fizyki 29 stycznia 2016 atlab jest środowiskiem stworzonym głównie w celu wykonywania obliczeń numerycznych. W skład środowiska wchodzi język wysokiego poziomu, w większości kompatybilny z darmowymi odpowiednikami takimi jak Octave oraz interpreter tego języka. Matlab posiada zaawansowane funkcje do numerycznego rozwiązywania powszechnych problemów algebry liniowej, analizy sygnałów, statystyki, przetwarzania obrazów i innych. Jest łatwo rozszerzalny i konfigurowalny poprzez definiowane funkcji w języku Matlab lub używając dynamicznie ładowanych modułów napisanych w C++, C, Fortran lub innych językach. M 1 Wprowadzenie Poniższy poradnik będzie stanowił pomoc w pierwszych krokach nauki programowania w Matlabie, jednak prawdopodobnie niezbędne okaże się korzystanie z innych źródeł i pomocy, jak np. dokumentacja dostępna na stronie: http://www.mathworks.com/help/matlab/. Można również wykorzystać wbudowaną pomoc i dokumentację, dostępną po wpisaniu: • doc • docsearch • help - spis dostępnych kategorii funkcji, lista funkcji należących do danej kategorii, opis wybranej funkcji • lookfor - przeszukanie za pomocą słowa kluczowego • demo • echodemo Kilka dodatkowych uwag: • Możliwe są dwa podstawowe typy pracy: interakcja w linii poleceń lub uruchamianie gotowych skryptów zapisanych w M-plikach. • Rozróżniane są duże i małe litery. • Średnik na końcu linijki powoduje, że nie zostanie wyświetlony wynik tego polecenia. • Komentarze rozpoczynają się znakiem %. • Uzyskanie informacji o zdefiniowanych zmiennych, polecenie: who, whose • Pracę kończy się przez wpisanie polecenia exit lub quit. Strona 1 z 22 2 Podstawy 2.1 Ogólnie Podstawową strukturą danych jest macierz. Standardowo liczby przechowywane są jako double (zakres < 10−308 , 10308 >), możemy korzystać z wbudowanych stałych, takich jak: liczba π, jednostka urojona i, itd. i wbudowanych funkcji sin, exp, besselj itd. 2.2 Operacje na macierzach Skalar – Macierz o rozmiarze 1x1: >> a = 1 a = 1 Wektor – w tym przypadku macierz o jednym wierszu: >> b = [2 4 6 8] b = 2 4 6 8 Wektor – tutaj macierz o jednej kolumnie: >> c = [2; 4; 6; 8] c = 2 4 6 8 Transpozycja macierzy: >> c’ ans = 2 4 Strona 2 z 22 6 8 Macierze można budować bezpośrednio: >> d = [1,2,3,4; 5,6,7,8] d = 1 5 2 6 3 7 4 8 >> e = [8,7,6, 5; 4,3,2,1] e = 8 4 7 3 6 2 5 1 Lub łączyć składowe: >> f = [d; e] f = 1 5 8 4 2 6 7 3 3 7 6 2 4 8 5 1 Istnieje możliwość definiowania każdego elementu osobno: >> b b = 2 4 6 8 6 8 >> b(1) = 1 b = 1 4 W ten sposób można automatycznie rozszerzyć macierz: >> b(8) = 10 b = Strona 3 z 22 1 4 6 8 0 0 0 10 0 0 0 20 Macierze można dodawać: >> b+b ans = 2 8 12 16 Mnożyć (element po elemencie): >> b.*b ans = 4 64 144 256 0 0 0 400 Brak kropki oznaczałby, że operacja ma zostać wykonana w sensie macierzowym: >> b*b’ ans = 868 Tak samo jest również w przypadku potęgowania: >> p=[1,2;3,4] p = 1 3 2 4 >> p.^2 ans = 1 9 4 16 >> p^2 ans = 7 15 Strona 4 z 22 10 22 2.3 Generatory macierzy Można stworzyć macierz zawierającą same zera, jedynki lub liczby losowe z zakresu [0, 1): >> z = zeros(2,4) z = 0 0 0 0 0 0 0 0 >> o = ones(3,3) o = 1 1 1 1 1 1 1 1 1 >> n = rand(1,5) n = 0.868423 0.195988 0.861193 0.717563 0.099785 Można otrzymać wektor liczb z pewnego zakresu: >> 1:10 ans = 1 2 3 4 5 3 5 7 9 6 7 8 9 10 >> 1:2:10 ans = 1 linspace(a, b, n) zwraca n liczb z zakresu ha, bi >> linspace(1, 3, 5) ans = 1.0000 Strona 5 z 22 1.5000 2.0000 2.5000 3.0000 2.4 Instrukcje sterujace, petle ˛ i funkcje Instrukcja warunkowa if: if warunek 1 instrukcje - wersja 1 elseif warunek 2 instrukcje - wersja 2 else instrukcje - wersja N end 1 2 3 4 5 6 7 Pętla while while warunek instrukcje end 1 2 3 Pętla for umożliwia wykonanie bloku instrukcji dla każdego elementu wektora. for i = wektor instrukcje end 1 2 3 Oprócz korzystania z funkcji standardowych można tworzyć także własne funkcje: function [zmienne wyjsciowe] = nazwa_funkcji(argumenty wejsciowe); instrukcje end 1 2 3 Istnieje również możliwość definiowania funkcji anonimowych. Są to krótkie, jednolinijkowe funkcje (wyrażenia lambda): nazwa_funkcji = @(argumenty wejsciowe) instrukcja 1 2.5 Prezentacja wyników Podstawową instrukcją tworzącą dwuwymiarowe wykresy jest funkcja plot: >> x = -2*pi: 0.1 : 2*pi >> plot(x, sin(x)) Do rysowania histogramów wykorzystujemy funkcję hist: >> hist(randn (100, 1), 20) Strona 6 z 22 a) b) Rysunek 1: Wykres funkcji sinus (a), histogram (b) Do rysowania wykresów 3D służą funkcję takie jak: mesh, surface, waterfall i wiele innych, przykład: >> z = peaks(25); >> mesh(z); >> colormap(hsv) Przykład 1. Zadanie do wykonania: zrobić sprawozdanie z prawa Ohma (lab. CLF) 1 2 3 4 5 6 7 8 %niepelne dane U = [0.09, 0.18, 0.29, 0.37, 0.46, 0.54, ..., 3.4, 4, 4.5, 5.5, 6, 6.5, 7, 8, 8.5, 9, 9.5]; I = [0.0017, 0.00341, 0.00565, 0.00713, 0.00905, 0.01053, ..., 0.125, 0.138, 0.150, 0.186]; dI = [0.0001,0.00005,0.00008,0.0001,0.0001,0.0002,...,0.003,0.003,0.003,0.003,0.003,0.003]; % errorbar rysuje wykres z niepewnosciami pomiarowymi (tylko dy) % argument 'r*' oznacza rysuj czerwone gwiazdki (standardowo niebieska linia) errorbar(U, I, dI, 'r*'); hold on; % wstrzymuje wykres przed usunieciem zawartosci po ponownym rysowaniu 9 10 11 12 13 14 P = polyfit(U, I, 1); %dopasowanie wielomianu stopnia n, %zwraca P = [a_n, ..., a_0] - wektor wspolczynikow wielomianu x = 0:0.01:10; %polyval oblicza wielomian y = a_n.*x.^n + ... + a_1.*x + a_0 plot(x, polyval(P, x)); hold off; 15 16 17 18 %podpisywanie osi xlabel('U [V]'); ylabel('I [A]'); 19 20 21 %wypisywanie na ekran z formatowaniem fprintf('Opor elektryczn R = %0.2f Ohm\n', P(1)); Strona 7 z 22 Rysunek 2: Charakterystyka napięciowo prądowa Przykład 2. Zadanie do wykonania: zgubiłeś wyniki pomiarów śrubą mikrometryczną, ale musisz oddać jutro sprawozdanie. 1 2 % srednica preta 10 [mm] odchylenie standardowe sig = 0.05 d = 0.05*randn(1, 20) + 10; 3 4 5 mu = mean(d); %warosc srednia sig = std(d); %odchylenie standardowe 6 7 hist(d) Przykład 3. Rozważ krzywą daną równaniami parametrycznymi x(t) = sin(2t), y(t) = cos(t), z(t) = t, gdzie t ∈ h0, 2πi). Rb p Oblicz długość łuku tej krzywej. Długość łuku liczymy ze znanego z analizy wzoru: L = (dx(t))2 + (dy(t))2 + (dz(t))2 . a 1 2 3 4 t = 0:0.1:3*pi; plot3(sin(2*t),cos(t),t); % definiujemy funkcje podcalkowa jako funkcje anonimowa f = @(t) sqrt(4*cos(2*t).^2 + sin(t).^2 + 1); 5 6 len = integral(f,0,3*pi); Strona 8 z 22 3 Praca zdalna Matlab kosztuje niemało, więc aby z niego korzystać legalnie musimy iść na wydział: $ ssh -Y [email protected] a następnie wejść do sali 228 i usiąść przy wolnym komputerze, na przykład 02: $ ssh -Y sl228-02 Opcja -Y w poleceniu ssh przekieruje okno matlaba na twój komputer. Teraz uruchamiamy matlaba: $ matlab Strona 9 z 22 4 Operatory (raz jeszcze) 4.1 Operator zakresu Składnia operatora : wygląda następująco start : krok : nie większe niż . Przykład: >> a = 3:0.7:7 a = 3.0000 3.7000 4.4000 5.1000 5.8000 6.5000 Domyślna wartość kroku to jeden, składnia upraszcza się wtedy do postaci: >> a = 3:7 a = 3 4 5 6 7 W kontekście macierzy operator ten może przybrać jeszcze jedną formę: >> A = zeros(3,4); >> A(:,2) = 1 A = 0 0 0 1 1 1 0 0 0 0 0 0 Zapis A(:,2) weź wszystkie wartości z kolumny 2. Operatora zakresu możemy też używać z typem danych char: >> s = ’a’:’f’ s = abcdef 4.2 4.2.1 Działania arytmetyczne Operatory macierzowe Możliwość wykonywania działań macierzowych jest absolutnie niezbędna dla programisty-fizyka, środowisko Matlab/Octave pozwala na wykonywanie takich obliczeń w szybki sposób przez zdefiniowane operatory (tab. 1), bez pisania zbędnych pętli for. Strona 10 z 22 Tablica 1: Operatory macierzowe Operacja Dodawanie Odejmowanie Mnożenie Potęgowanie Lewostronne dzielenie Prawostronne dzielenie Operator + * ^ \ / Jeszcze słowo komentarza á propos dzielenia, oprócz dzielenia prawostronnego (/) mamy do dyspozycji dzielenie lewostronne (\). Dzielenie takie stosowane jest w równaniach macierzowych. W szczególności polecenie x = A\b rozwiązuje równanie Ax = b. Jest ono odpowiednikiem inv(A)*b, ale działa szybciej i numerycznie stabilniej. 4.2.2 Operatory tablicowe Prawdopodobnie dużo częściej wykorzystywane są operatory tablicowe (tab. 2). Za ich pomocą możemy uzyskać takie struktury jak v.*w = [v1 w1 , v2 w2 , ..., vn wn ], czy v.^w = [v1w1 , v2w2 , ..., vnwn ]. Te same zasady stosują się do macierzy. Dla dwóch macierzy A i B polecenie C = A.*B, w wyniku daje macierz z elementami Cij = Aij Bij . Tablica 2: Działania tablicowe Operacja Dodawanie Odejmowanie Mnożenie Potęgowanie Lewostronne dzielenie Prawostronne dzielenie 4.3 Operator + .* .^ .\ ./ Operatory relacji Działania z użyciem operatorów relacji dają wynik w postaci macierzy o tej samej wielkości co argumenty, gdzie 1 oznacza prawdziwość relacji, a 0 oznacza fałsz. Tablica 3: Operatory relacji Operacja Mniejszy niż Mniejszy lub równy Większy niż Większy lub równy Równy Różny od Strona 11 z 22 Operator < <= > >= == = Przykłady: >> x = [1, 5, 3, 7]; >> y = [0, 2, 8, 7]; >> k = x<y k = 0 0 >> k = x>=y 1 0 0 1 1 0 k = 1 1 >> k = x~=y k = 1 4.4 1 Operatory logiczne Operatory logicznie działają analogicznie do operatorów relacji, zwracają macierz o tej samej wielkości co argumenty: Tablica 4: Operatory logiczne Operacja Koniunkcja Alternatywa Negacja Alternatywa wykluczająca Strona 12 z 22 Operator & | ~ xor 5 Praca z macierzami 5.1 Indeksowanie macierzy W środowisku Matlab/Octave istnieją dwa sposoby indeksowania tablic (patrz rys. 3) tzw. index oraz subscripts, jak to działa sprawdzimy na prostym przykładzie: >> A = rand(4, 5) A = 0.6557 0.0357 0.8491 0.9340 0.6787 0.7577 0.7431 0.3922 0.6555 0.1712 0.7060 0.0318 0.2769 0.0462 0.0971 0.8235 0.6948 0.3171 0.9502 0.0344 >> A(4) %w notacji index ans = 0.9340 >> A(4,1) %to samo w notacji subscripts ans = 0.9340 >> A(5) %w notacji index ans = 0.6787 >> A(1, 2) %to samo w notacji subscripts ans = 0.6787 Rysunek 3: Dwa sposoby indeksowania macierzy Strona 13 z 22 Oczywiście tyczy się to też macierzy o większej ilości wymiarów. Do konwersji pomiędzy tymi dwoma stylami indeksowania macierzy można wykorzystać funkcję ind2sub oraz sub2ind. Przykład (Macierz A z poprzedniego przykładu): >> idx = [sub2ind(size(A), 3, 2), sub2ind(size(A), 4, 4), sub2ind(size(A), 4, 5)] ... %tworzymy wektor 3 indeksów które chcemy wybrać z macierzy idx = 7 16 20 >> A(idx) %wypisujemy podane elementy ans = 0.7431 0.8235 0.0344 >> A(idx) = 0; %nadpisujemy wartość podanych elementów >> A A = 0.6557 0.0357 0.8491 0.9340 0.6787 0.7577 0 0.3922 0.6555 0.1712 0.7060 0.0318 0.2769 0.0462 0.0971 0 0.6948 0.3171 0.9502 0 Możemy też podawać w obu konwencjach wektory. W konwencji index przykład jest już wyżej, z macierzy wybierane są wszystkie elementy, których index jest podany w wektorze. Trochę więcej przykładów: >> A([1, 3, 5, 6, 7]) ans = 0.6557 0.8491 0.6787 0.7577 0 0 0.6555 >> A(1:2:20) %co drugi element ans = Columns 1 through 9 0.6557 0.8491 0.6787 0.7060 Column 10 0.9502 >> i = 5:5:20 %co piąty indeks od piątego do dwudziestego Strona 14 z 22 0.2769 0.0971 0.6948 i = 5 10 15 20 >> A(i) ans = 0.6787 0.1712 0.0971 0 W konwencji subscripts zwracany jest produkt kartezjański podanych indeksów: >> A([1, 2], [1, 2]) %produkt kartezjański to elementy (1, 1), (1, 2), (2, 1), (2, 2) ans = 0.6557 0.0357 0.6787 0.7577 >> A(1:3,1:3) %wykorzystując operator zakresu ans = 0.6557 0.0357 0.8491 0.6787 0.7577 0 0.6555 0.1712 0.7060 >> A(1:2:3,1:3) %co drugi wiersz od pierwszego do trzeciego i od pierwszej kolumny do trzeciej ans = 0.6557 0.8491 0.6787 0 0.6555 0.7060 Należy tu jeszcze wspomnieć o kolejnym ważnym elemencie dotyczącym indeksowania, mianowicie słowo kluczowe end. Standardowo słowo end kończy blok kodu po for, if itd., w tym kontekście indeksowania ma ono inne znaczenie, tj. oznacza ostatni element macierzy. >> A(end) ans = 0 >> A(end-4:end) %ostatnie pięć elementów ans = Strona 15 z 22 0 0.6948 0.3171 0.9502 0 >> A(end-1:end, 1) %korzystając z subscripts: przedostatni i ostatni element pierwszej kolumny ans = 0.8491 0.9340 >> A(2:end, 1:end-3) ans = 0.0357 0.8491 0.9340 0.7577 0 0.3922 Typowe zastosowanie wybierania indeksów z którym na pewno się spotkacie: >> x = 0:0.01:10*pi; >> y = sin(x); >> idx = find(abs(y) < 5e-3); ... %funkcja find zwraca indeksy elementów wektora równych 1 (działanie operatora relacji już znacie) >> plot(x, y, ’b-’, x(idx), y(idx), ’ro’) Na rysunku 4 przedstawiony jest wynik powyższych operacji. Rysunek 4: Miejsca zerowe funkcji f (x) = sin(x) Strona 16 z 22 5.2 Wektoryzacja Przez wektoryzację rozumiemy nadanie obliczeniom takiej struktury, w której można zastosować zmienne wektorowe lub tablicowe z operatorami tablicowymi zamiast seryjnych obliczeń skalarnych. Jako przykład rozważ aproksymację funkcji wykładniczej za pomocą pierwszych dziesięciu wyrazów rozwinięcia w szereg ex = X xk−1 (k − 1)! k Można to liczyć w pętli, co jest czasochłonne, gdyż interpreter musi dziesięć razy wykonać tą czynność (interpreter jest wolny). W formie zwektoryzowanej interpreter parsuje jedną linijkę, reszta liczy się w wewnętrznych funkcjach Matlab/Octave napisanych w szybkich językach typu C/C++ >> x = 1; >> k=1:10; >> e = sum(x.^(k-1)./factorial(k-1)) e = 2.7183 >>%lub w inny sposób po wykonaniu drobnych przekształceń w głowie >> format long >> sum(1./factorial(0:10))-exp(1) ans = -2.731266102173890e-08 >> sum(1./factorial(0:10))-exp(1) %policzmy błąd takiego przybliżenia ans = -2.731266102173890e-08 >> sum(1./factorial(0:20))-exp(1) %zwiększmy nieco ilość wyrazów szeregu ans = 0 W ten oto prosty sposób policzyliśmy liczbę Nepera. Stosować wektoryzację należy zawsze (o ile to jest możliwe)! Inny przykład, odtworzymy sobie działanie funkcji diff, i policzmy pochodną funkcji: >> plot(x, y, x, Dy) >> dx = 0.001; >> x = 0:dx:2*pi; >> y = sin(x); >> Dy = (y(2:end)-y(1:end-1))./dx; ... %diff => y(2:end)-y(1:end-1), dzieląc przez dx otrzymujemy pochodną Strona 17 z 22 >> Dy = [Dy, Dy(end)]; %powielenie ostatniego elementu, żeby zgadzały się długości wektorów >> plot(x, y, x, Dy) Rysunek 5: Funkcja f (x) = sin(x) oraz jej pochodna f 0 (x) = cos(x) 5.3 Trudniejsze przykłady Rozwiążmy teraz typowy fizyczny problem tj. rozwiążemy dwuwymiarowe równanie Poissona ( ∇u(x, y) = f (x, y) ∀(x,y) ∈ h0, 100i × h0, 100i = Ω u(x, y) ∂Ω = 0 gdzie ( 100 f (x, y) = 0 ∀(x,y) ∈ h49, 51i × h10, 90i = ω ∀(x,y) ∈ Ω\ω Przedstawione tu rozumowanie jest nieco uproszczone, więcej o rozwiązywaniu równań różniczkowych można dowiedzieć się na wykładnie z Metod Numerycznych lub w internecie. Dyskretyzując równanie dla prostokątnej siatki otrzymujemy: ui−1,j + ui,j−1 + ui+1,j + ui,j+1 − ui,j = fi,j 4 (1) u0,j = u100,j = ui,0 = ui,100 = 0 (2) Obliczenie tego wyrażenia w C wymagałoby iteracji po całej macierzy w dwóch pętlach for, możemy jednak to zwektoryzować. Graficznie pierwszy składnik tego równania można przedstawić jak poniżej: 1 6 11 16 21 1 6 11 16 21 2 7 12 17 22 + 2 7 12 17 22 3 8 13 18 23 3 8 13 18 23 4 9 14 19 24 4 9 14 19 24 5 10 15 20 25 5 10 15 20 25 Strona 18 z 22 1 6 11 2 7 12 3 8 13 4 9 14 5 10 15 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 6 11 2 7 12 3 8 13 4 9 14 5 10 15 16 21 17 22 + 18 23 19 24 20 25 + 16 21 17 22 18 23 19 24 20 25 16 17 18 19 20 21 22 23 24 25 + 1 6 2 7 3 8 4 9 5 10 11 12 13 14 15 1 6 2 7 3 8 4 9 5 10 11 16 21 12 17 22 13 18 23 14 19 24 15 20 25 1 6 2 7 3 8 4 9 5 10 11 12 13 14 15 16 21 17 22 18 23 19 24 20 25 16 21 17 22 18 23 19 24 20 25 Tak powstałą nową macierz należy jeszcze podzielić przez cztery i odjąć od niej macierz początkową. 1 close all, clear all, clc %zamknij wszystkie wykresy, wyczysc zmienne, wyczysc linie komend 2 3 4 5 6 7 8 9 10 11 %definicja geometrii N = 100; u = zeros(N, N); %rysuje prostokat %wybieramy podmacierz i przypisujemy ladunek %floor (podloga) zaokraglenie, aby miec pewnosc ze bedzie liczba calkowita w1 = floor((N/2))-1; w2 = floor((N/2))+1; u(10:N-10, w1:w2) = 100; 12 13 14 15 16 17 18 19 20 21 for i = 0:1e4 %liczymy laplasjan (to tu cala magia) nabla = zeros(N, N); nabla(1:end-1,:) = nabla(1:end-1,:) + nabla(2:end,:) = nabla(2:end,:) + nabla(:,1:end-1) = nabla(:,1:end-1) + nabla(:,2:end) = nabla(:,2:end) + nabla = nabla./4.0; nabla = nabla - u; u(2:end,:); u(1:end-1,:); u(:,2:end); u(:,1:end-1); 22 23 u = u + nabla; 24 25 26 27 28 29 %warunki u(1,:) u(end,:) u(:,1) u(:,end) brzegowe = zeros(1, = zeros(1, = zeros(1, = zeros(1, N); N); N); N); 30 31 32 u(10:N-10, w1:w2) = 100; end 33 34 35 contourf(u); hold on; rectangle('Position',[w1, 10, w2-w1, N-20],'FaceColor','k') Strona 19 z 22 Rysunek 6: Rozwiązanie równania Zadanie 1. Wygenerować macierz 3D zgodnie ze wzorem v = x ∗ sin x2 − y 2 − z 2 w przedziale [−2, 2] z krokiem 0.05. Wyświetlić ją na ekranie. 1 close all, clear all, clc %zamknij wszystkie wykresy, wyczysc zmienne, wyczysc linie komend 2 3 4 [X,Y,Z] = meshgrid(-2:0.05:2,-2:0.05:2,-2:2); %tworzymy 3 macierze 3D V = X.*sin(X.^2-Y.^2-Z.^2); %tworzymy nowa macierz 3D z wartosciami ze wzoru 5 6 7 8 for i = 1:5 % conturf rysuje wykres w formie mapy [¬,h] = contourf(X(:,:,3), Y(:,:,3), V(:,:,3)); hold on; 9 10 11 12 13 %tu troche magicznych funkcji w sumie nieistotne hh = get(h,'Children'); set(hh, {'ZData'}, cellfun(@(x) (i-3)*ones(size(x)), get(hh,{'XData'}), 'UniformOutput',false)) end Rysunek 7: Mapy kostki Strona 20 z 22 6 Wizualizacja W tym rozdziale przedstawione zostały różne przykłady wizualizacji danych w Matlab/Octave. Najbardziej użyteczną funkcją generującą wykresy jest plot, jej składnia wygląda następująco: plot(vec_x1, vec_y1, ’opcje stylu’, vec_x1, vec_y1, ’opcje stylu’, ...) Przykładowo: plot(y) %tworzy domyślny wykres na osi x odłożone są ideksy wektora y plot(x,y,’--’) %zamiast linii ciągłej jest przerywana plot(x,y,’ro’) %rysuje czerwone kółka Tablica 5: Opcje stylów Opcje koloru y żółty m purpurowy c granatowy r czerwony g zielony b niebieski w biały k czarny 6.1 Opcje stylu linii - linia ciągła – linia przerywana : linia kropkowana -. linia kreskowo-kropkowa Opcje stylu znacznika + symbol plusa o kółko * gwiazdka x znak x . kropka ^ daszek s kwadrat d rąb Etykiety, tytuły, legendy i inne Wykresy można opisywać za pomocą poleceń: xlabel(’napis x’) ylabel(’napis y’) title(’tytul’) text(x, y, ’napis’) % % % % tytuł osi x tytuł osi y tytuł wykresu umieszcza na wykresie napis w pozycji (x,,y) Legendę można utworzyć, jak nie trudno się zgadnąć, za pomocą funkcji legend legend(’linia 1’, ’linia 2’, ...) legend(’StylLinii1’, ’linia 1’, ...) legend(..., pos) legend off % % % % tworzy legendę zawierającą etykiety ’linia 1’, ... przypisuje każdej etykiecie styl linii pos = 1 (lub inna wartość) ustawia pozycję legendy wyłącza legendę Ustawiać zakresy osi możemy za pomocą polecenia axis axis([x_min, x_max]) % ustawia zakres osi x axis([x_min, x_max, y_min, y_max]) % ustawia zakres osi x i y axis(’equal’) % ustawia jednakową skalę na obu osiach itd. 6.2 Wykresy nakładane Istnieje kilka sposobów narysowania wielu linii na jednym wykresie, oto przykład: Strona 21 z 22 1 2 3 4 t = linspace(0, 2*pi, 100); y1 = sin(t); y2 = t; y3 = t - (t.^3)/6 + (t.^5)/120; 5 6 7 8 9 10 11 %rysuje y1 jako ciagla linie (domyslnie) plot(t,y1) % %dodaje y2 jako linie przerywana line(t,y2, 'linestyle', '--') % %dodaje y3 jako serie kolek line(t,y3, 'linestyle', 'o') 12 13 14 15 16 17 18 %inaczej ale robi to samo plot(t,y1) hold on plot(t,y2, 'linestyle', '--') plot(t,y3, 'linestyle', 'o') hold off 19 20 21 %w ten sposob podobnie ale dodatkowo automatycznie zmienia kolory linii plot(t,y1,t,y2, '--',t,y3, 'o') 22 23 24 25 26 27 6.3 axis([0 5 -1 5]) %nowe zakresy osi xlabel('t') ylabel('aproksymacja sin(t)') title('Wykresy nakladane') legend('sin(t)', 'aproksymacja liniowa', 'aproksymacja piatego rzedu') Tworzenie wykresów równoległych Do rysowania kilku wykresów w jednym oknie służy polecenie subplot. Funkcja ta dzieli okno na siatkę (n, m) podwykresów, na przykład: subplot(3,2,1) % trzeci argument oznacza na którym wykresie aktualnie rysujemy plot(x) subplot(3,2,2) plot(y) ... 1 2 t = linspace(0, 8*pi, 200); y = t.*sin(t); 3 4 5 6 7 8 9 10 figure(1) %tworzy okno subplot(1, 2, 1)% dzieli okno na macierz (1,2) wykresow rysuje na 1 area(t, y); subplot(1, 2, 2)% teraz rysuje na 2 t = linspace(0, 2*pi, 200); y = sqrt(abs(2.*sin(5.*t))); polar(t, y) 11 12 13 14 15 16 17 18 19 20 figure(2) %tworzy drugie okno subplot(1, 2, 1) hist(randn(1, 1000)); subplot(1, 2, 2) t = linspace(0, 2*pi, 500); r = sqrt(abs(2.*sin(5.*t))); x = r.*cos(t); y = r.*sin(t); fill(x, y, 'r') Strona 22 z 22