Matlab/Octave Tomasz Sobiech, Politechnika Warszawska, Wydział Fizyki

Podobne dokumenty
Matlab/Octave wprowadzenie

MATLAB ŚRODOWISKO MATLABA OPIS, PODSTAWY

GNU Octave (w skrócie Octave) to rozbudowany program do analizy numerycznej.

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

PODSTAWY INFORMATYKI 1 MATLAB CZ. 3

Grafika w Matlabie. Wykresy 2D

Matlab Składnia + podstawy programowania

MATLAB wprowadzenie śycie jest zbyt krótkie, aby tracić czas na pisanie pętli!

Podstawy MATLABA, cd.

Wprowadzenie do pakietów MATLAB/GNU Octave

Metody Numeryczne. Laboratorium 1. Wstęp do programu Matlab

WYDZIAŁ ELEKTROTECHNIKI, AUTOMATYKI I INFORMATYKI INSTYTUT AUTOMATYKI I INFORMATYKI KIERUNEK AUTOMATYKA I ROBOTYKA STUDIA STACJONARNE I STOPNIA

Wizualizacja funkcji w programie MATLAB

Metody i analiza danych

Matlab Składnia + podstawy programowania

Mathcad c.d. - Macierze, wykresy 3D, rozwiązywanie równań, pochodne i całki, animacje

Modelowanie Systemów Dynamicznych Studia zaoczne, Automatyka i Robotyka, rok II. Podstawy MATLABA, cz2.

1 Programowanie w matlabie - skrypty i funkcje

Wstęp do Programowania Lista 1

Ćwiczenie 3. MatLab: Algebra liniowa. Rozwiązywanie układów liniowych

Wprowadzenie do środowiska

zajęcia 2 Definiowanie wektorów:

Laboratorium metod numerycznych numer 1

Scilab - podstawy. Wersje instalacyjne programu Scilab mogą zostać pobrane ze strony

Wprowadzenie do Scilab: macierze

Diary przydatne polecenie. Korzystanie z funkcji wbudowanych i systemu pomocy on-line. Najczęstsze typy plików. diary nazwa_pliku

Programowanie: grafika w SciLab Slajd 1. Programowanie: grafika w SciLab

1) Podstawowe obliczenia. PODSTAWY AUTOMATYKI I ROBOTYKI Laboratorium. Wykonał: Łukasz Konopacki Sala 125. Grupa: poniedziałek/p,

Matlab MATrix LABoratory Mathworks Inc.

Wprowadzenie do Scilab: macierze

Spis treści. I. Skuteczne. Od autora... Obliczenia inżynierskie i naukowe... Ostrzeżenia...XVII

Graficzna prezentacja wyników

Laboratorium Algorytmy Obliczeniowe. Lab. 9 Prezentacja wyników w Matlabie

MATLAB tworzenie własnych funkcji

Operatory arytmetyczne

Elementy okna MatLab-a

Technologie informacyjne lab. 3

Elementy metod numerycznych - zajęcia 9

1 Podstawy c++ w pigułce.

MATLAB Podstawowe polecenia

Metody numeryczne Laboratorium 2

Matlab, zajęcia 3. Jeszcze jeden przykład metoda eliminacji Gaussa dla macierzy 3 na 3

Przetwarzanie sygnałów

Elementy projektowania inzynierskiego Przypomnienie systemu Mathcad

Metody i analiza danych

Podstawowe operacje na macierzach

Podstawy Automatyki ćwiczenia Cz.1. Środowisko Matlab

Wprowadzenie do MATLABa

Rozwiązywanie równań różniczkowych cząstkowych metodą elementów skończonych - wprowadzenie

WPROWADZENIE DO ŚRODOWISKA SCILAB

1 Typy i formaty danych

Proste programy w C++ zadania

Laboratorium 3 Grafika 2D i 3D w Matlabie. Wprowadzenie do programowania

WEKTORY I MACIERZE. Strona 1 z 11. Lekcja 7.

Ćwiczenie 3: Wprowadzenie do programu Matlab

Ćwiczenia 11 (12) (4 godziny). Wizualizacja i manipulacja w Matlabie

Wprowadzenie do Octave

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

PRZYKŁADOWE SKRYPTY (PROGRAMY W MATLABIE Z ROZSZERZENIEM.m): 1) OBLICZANIE WYRAŻEŃ 1:

MATLAB PROJEKTOWANIE GRAFICZNE. Maciej Ulman ETI 9.2. Funkcje graficzne moŝna podzielić na cztery podstawowe grupy:

Wykresy i interfejsy użytkownika

Funkcje wielu zmiennych

Wykorzystanie programów komputerowych do obliczeń matematycznych

Ćwiczenie 1. Wprowadzenie do programu Octave

SKRYPTY. Zadanie: Wyznaczyć wartość wyrażenia arytmetycznego

Laboratorium Cel ćwiczenia Ćwiczenie ma na celu praktyczne przedstawienie grafiki 3D.

Wartości x-ów : Wartości x ów można w Scilabie zdefiniować na kilka sposobów, wpisując odpowiednie polecenie na konsoli.

Przykładowo, jeśli współrzędna x zmienia się od 0 do 8 co 1, a współrzędna y od 12 co 2 do 25, to punkty powinny wyglądać następująco:

Przetwarzanie i analiza danych w języku Python / Marek Gągolewski, Maciej Bartoszuk, Anna Cena. Warszawa, Spis treści

; B = Wykonaj poniższe obliczenia: Mnożenia, transpozycje etc wykonuję programem i przepisuję wyniki. Mam nadzieję, że umiesz mnożyć macierze...

Podstawy Programowania C++

do MATLABa programowanie WYKŁAD Piotr Ciskowski

Funkcja pierwotna, całka oznaczona na podstawie funkcji pierwotnej

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

, h(x) = sin(2x) w przedziale [ 2π, 2π].

Różniczkowanie numeryczne

MATLAB - laboratorium nr 1 wektory i macierze

Podstawy Programowania Podstawowa składnia języka C++

Program na zaliczenie: Odejmowanie widm

Wprowadzenie do systemu Scilab

01.Wprowadzenie do pakietu MATLAB

Przykład 1 -->s="hello World!" s = Hello World! -->disp(s) Hello World!

ROZKŁAD MATERIAŁU DO II KLASY LICEUM (ZAKRES ROZSZERZONY) A WYMAGANIA PODSTAWY PROGRAMOWEJ.

Ćwiczenie 1. Matlab podstawy (1) Matlab firmy MathWorks to uniwersalny pakiet do obliczeń naukowych i inżynierskich, analiz układów statycznych

SCILAB. Wprowadzenie do Scilaba:

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Materiały do Laboratorium Programowania Obliczeń Komputerowych MATLAB

Obliczenia iteracyjne

ŚRODOWISKO MATLAB WPROWADZENIE. dr inż. Dariusz Borkowski. Podstawy informatyki. (drobne) modyfikacje: dr inż. Andrzej Wetula

1 Podstawy c++ w pigułce.

Wprowadzenie do Scilab: macierze

1 Wizualizacja danych - wykresy 2D

Obliczenia w programie MATLAB

WIMIM/MIBM/N1/-/B04 WIMIM/ME/S1/-/C46 WIMIM/IM/S1/-/B19

Podstawowe operacje graficzne.

3 1 + i 1 i i 1 2i 2. Wyznaczyć macierze spełniające własność komutacji: [A, X] = B

Matlab II skrypty, funkcje, wizualizacja danych. Piotr Wróbel Pok. B 4.22

Dynamiczne przetwarzanie stron. dr Beata Kuźmińska-Sołśnia

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

W naukach technicznych większość rozpatrywanych wielkości możemy zapisać w jednej z trzech postaci: skalara, wektora oraz tensora.

Transkrypt:

Matlab/Octave Tomasz Sobiech, Politechnika Warszawska, Wydział Fizyki 29 stycznia 2016 Matlab 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. 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, 10 308 >), 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 2 4 6 8 Strona 2 z 22

Macierze można budować bezpośrednio: >> d = [1,2,3,4; 5,6,7,8] d = 1 2 3 4 5 6 7 8 >> e = [8,7,6, 5; 4,3,2,1] e = 8 7 6 5 4 3 2 1 Lub łączyć składowe: >> f = [d; e] f = 1 2 3 4 5 6 7 8 8 7 6 5 4 3 2 1 Istnieje możliwość definiowania każdego elementu osobno: >> b b = 2 4 6 8 >> b(1) = 1 b = 1 4 6 8 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 Macierze można dodawać: >> b+b 2 8 12 16 0 0 0 20 Mnożyć (element po elemencie): >> b.*b 4 64 144 256 0 0 0 400 Brak kropki oznaczałby, że operacja ma zostać wykonana w sensie macierzowym: >> b*b 868 Tak samo jest również w przypadku potęgowania: >> p=[1,2;3,4] p = 1 2 3 4 >> p.^2 >> p^2 1 4 9 16 7 10 15 22 Strona 4 z 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 1 2 3 4 5 6 7 8 9 10 >> 1:2:10 1 3 5 7 9 linspace(a, b, n) zwraca n liczb z zakresu a, b >> linspace(1, 3, 5) 1.0000 1.5000 2.0000 2.5000 3.0000 Strona 5 z 22

2.4 Instrukcje sterujace, pętle i funkcje Instrukcja warunkowa if: 1 if warunek 1 2 instrukcje - wersja 1 3 elseif warunek 2 4 instrukcje - wersja 2 5 else 6 instrukcje - wersja N 7 end Pętla while 1 while warunek 2 instrukcje 3 end Pętla for umożliwia wykonanie bloku instrukcji dla każdego elementu wektora. 1 for i = wektor 2 instrukcje 3 end Oprócz korzystania z funkcji standardowych można tworzyć także własne funkcje: 1 function [zmienne wyjsciowe] = nazwa_funkcji(argumenty wejsciowe); 2 instrukcje 3 end Istnieje również możliwość definiowania funkcji anonimowych. Są to krótkie, jednolinijkowe funkcje (wyrażenia lambda): 1 nazwa_funkcji = @(argumenty wejsciowe) instrukcja 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 %niepelne dane 2 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]; 3 I = [0.0017, 0.00341, 0.00565, 0.00713, 0.00905, 0.01053,..., 0.125, 0.138, 0.150, 0.186]; 4 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]; 5 % errorbar rysuje wykres z niepewnosciami pomiarowymi (tylko dy) 6 % argument 'r*' oznacza rysuj czerwone gwiazdki (standardowo niebieska linia) 7 errorbar(u, I, di, 'r*'); 8 hold on; % wstrzymuje wykres przed usunieciem zawartosci po ponownym rysowaniu 9 10 P = polyfit(u, I, 1); %dopasowanie wielomianu stopnia n, 11 %zwraca P = [a_n,..., a_0] - wektor wspolczynikow wielomianu 12 x = 0:0.01:10; 13 %polyval oblicza wielomian y = a_n.*x.^n +... + a_1.*x + a_0 14 plot(x, polyval(p, x)); hold off; 15 16 %podpisywanie osi 17 xlabel('u [V]'); 18 ylabel('i [A]'); 19 20 %wypisywanie na ekran z formatowaniem 21 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 % srednica preta 10 [mm] odchylenie standardowe sig = 0.05 2 d = 0.05*randn(1, 20) + 10; 3 4 mu = mean(d); %warosc srednia 5 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 0, 2π ). b 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 t = 0:0.1:3*pi; 2 plot3(sin(2*t),cos(t),t); 3 % definiujemy funkcje podcalkowa jako funkcje anonimowa 4 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 user@student.fizyka.pw.edu.pl 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 1 0 0 0 1 0 0 0 1 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 Działania arytmetyczne 4.2.1 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 Operator Dodawanie + Odejmowanie - Mnożenie * Potęgowanie ^ Lewostronne dzielenie \ Prawostronne dzielenie / 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 = [v 1 w 1, v 2 w 2,..., v n w n ], czy v.^w = [v w1 1, vw2 2,..., vwn n ]. Te same zasady stosują się do macierzy. Dla dwóch macierzy A i B polecenie C = A.*B, w wyniku daje macierz z elementami C ij = A ij B ij. Tablica 2: Działania tablicowe Operacja Operator Dodawanie + Odejmowanie - Mnożenie.* Potęgowanie.^ Lewostronne dzielenie.\ Prawostronne dzielenie./ 4.3 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 Operator Mniejszy niż < Mniejszy lub równy <= Większy niż > Większy lub równy >= Równy == Różny od = Strona 11 z 22

Przykłady: >> x = [1, 5, 3, 7]; >> y = [0, 2, 8, 7]; >> k = x<y k = 0 0 1 0 >> k = x>=y k = 1 1 0 1 >> k = x~=y k = 1 1 1 0 4.4 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 Operator Koniunkcja & Alternatywa Negacja Alternatywa wykluczająca xor Strona 12 z 22

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.6787 0.6555 0.2769 0.6948 0.0357 0.7577 0.1712 0.0462 0.3171 0.8491 0.7431 0.7060 0.0971 0.9502 0.9340 0.3922 0.0318 0.8235 0.0344 >> A(4) %w notacji index 0.9340 >> A(4,1) %to samo w notacji subscripts 0.9340 >> A(5) %w notacji index 0.6787 >> A(1, 2) %to samo w notacji subscripts 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 0.7431 0.8235 0.0344 >> A(idx) = 0; %nadpisujemy wartość podanych elementów >> A A = 0.6557 0.6787 0.6555 0.2769 0.6948 0.0357 0.7577 0.1712 0.0462 0.3171 0.8491 0 0.7060 0.0971 0.9502 0.9340 0.3922 0.0318 0 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]) 0.6557 0.8491 0.6787 0.7577 0 >> A(1:2:20) %co drugi element Columns 1 through 9 0.6557 0.8491 0.6787 0 0.6555 0.7060 0.2769 0.0971 0.6948 Column 10 0.9502 >> i = 5:5:20 %co piąty indeks od piątego do dwudziestego Strona 14 z 22

i = 5 10 15 20 >> A(i) 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) 0.6557 0.6787 0.0357 0.7577 >> A(1:3,1:3) %wykorzystując operator zakresu 0.6557 0.6787 0.6555 0.0357 0.7577 0.1712 0.8491 0 0.7060 >> A(1:2:3,1:3) %co drugi wiersz od pierwszego do trzeciego i od pierwszej kolumny do trzeciej 0.6557 0.6787 0.6555 0.8491 0 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) 0 >> A(end-4:end) %ostatnie pięć elementów 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 0.8491 0.9340 >> A(2:end, 1:end-3) 0.0357 0.7577 0.8491 0 0.9340 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 e x = k x k 1 (k 1)! 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) -2.731266102173890e-08 >> sum(1./factorial(0:10))-exp(1) %policzmy błąd takiego przybliżenia -2.731266102173890e-08 >> sum(1./factorial(0:20))-exp(1) %zwiększmy nieco ilość wyrazów szeregu 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 (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) 0, 100 0, 100 = Ω u(x, y) Ω = 0 gdzie f(x, y) = { 100 (x,y) 49, 51 10, 90 = ω 0 (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: u i 1,j + u i,j 1 + u i+1,j + u i,j+1 4 u i,j = f i,j (1) u 0,j = u 100,j = u i,0 = u i,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 16 21 2 7 12 17 22 3 8 13 18 23 4 9 14 19 24 5 10 15 20 25 1 6 11 16 21 2 7 12 17 22 3 8 13 18 23 4 9 14 19 24 5 10 15 20 25 + + 1 6 11 16 21 2 7 12 17 22 3 8 13 18 23 4 9 14 19 24 5 10 15 20 25 1 6 11 16 21 2 7 12 17 22 3 8 13 18 23 4 9 14 19 24 5 10 15 20 25 1 6 11 16 21 2 7 12 17 22 3 8 13 18 23 4 9 14 19 24 5 10 15 20 25 + 1 6 11 16 21 2 7 12 17 22 3 8 13 18 23 4 9 14 19 24 5 10 15 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 %definicja geometrii 4 N = 100; 5 u = zeros(n, N); 6 %rysuje prostokat 7 %wybieramy podmacierz i przypisujemy ladunek 8 %floor (podloga) zaokraglenie, aby miec pewnosc ze bedzie liczba calkowita 9 w1 = floor((n/2))-1; 10 w2 = floor((n/2))+1; 11 u(10:n-10, w1:w2) = 100; 12 13 for i = 0:1e4 14 %liczymy laplasjan (to tu cala magia) 15 nabla = zeros(n, N); 16 nabla(1:end-1,:) = nabla(1:end-1,:) + u(2:end,:); 17 nabla(2:end,:) = nabla(2:end,:) + u(1:end-1,:); 18 nabla(:,1:end-1) = nabla(:,1:end-1) + u(:,2:end); 19 nabla(:,2:end) = nabla(:,2:end) + u(:,1:end-1); 20 nabla = nabla./4.0; 21 nabla = nabla - u; 22 23 u = u + nabla; 24 25 %warunki brzegowe 26 u(1,:) = zeros(1, N); 27 u(end,:) = zeros(1, N); 28 u(:,1) = zeros(1, N); 29 u(:,end) = zeros(1, N); 30 31 u(10:n-10, w1:w2) = 100; 32 end 33 34 contourf(u); hold on; 35 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 ( x 2 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 [X,Y,Z] = meshgrid(-2:0.05:2,-2:0.05:2,-2:2); %tworzymy 3 macierze 3D 4 V = X.*sin(X.^2-Y.^2-Z.^2); %tworzymy nowa macierz 3D z wartosciami ze wzoru 5 6 for i = 1:5 7 % conturf rysuje wykres w formie mapy 8 [,h] = contourf(x(:,:,3), Y(:,:,3), V(:,:,3)); hold on; 9 10 %tu troche magicznych funkcji w sumie nieistotne 11 hh = get(h,'children'); 12 set(hh, {'ZData'}, cellfun(@(x) (i-3)*ones(size(x)), get(hh,{'xdata'}), 'UniformOutput',false)) 13 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 Opcje stylu linii Opcje stylu znacznika y żółty - linia ciągła + symbol plusa m purpurowy linia przerywana o kółko c granatowy : linia kropkowana * gwiazdka r czerwony -. linia kreskowo-kropkowa x znak x g zielony. kropka b niebieski ^ daszek w biały s kwadrat k czarny d rąb 6.1 Etykiety, tytuły, legendy i inne Wykresy można opisywać za pomocą poleceń: xlabel( napis x ) % tytuł osi x ylabel( napis y ) % tytuł osi y title( tytul ) % tytuł wykresu text(x, y, napis ) % 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,...) % tworzy legendę zawierającą etykiety linia 1,... legend( StylLinii1, linia 1,...) % przypisuje każdej etykiecie styl linii legend(..., pos) % pos = 1 (lub inna wartość) ustawia pozycję legendy legend off % 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 t = linspace(0, 2*pi, 100); 2 y1 = sin(t); 3 y2 = t; 4 y3 = t - (t.^3)/6 + (t.^5)/120; 5 6 %rysuje y1 jako ciagla linie (domyslnie) 7 plot(t,y1) 8 % %dodaje y2 jako linie przerywana 9 line(t,y2, 'linestyle', '--') 10 % %dodaje y3 jako serie kolek 11 line(t,y3, 'linestyle', 'o') 12 13 %inaczej ale robi to samo 14 plot(t,y1) 15 hold on 16 plot(t,y2, 'linestyle', '--') 17 plot(t,y3, 'linestyle', 'o') 18 hold off 19 20 %w ten sposob podobnie ale dodatkowo automatycznie zmienia kolory linii 21 plot(t,y1,t,y2, '--',t,y3, 'o') 22 23 axis([0 5-1 5]) %nowe zakresy osi 24 xlabel('t') 25 ylabel('aproksymacja sin(t)') 26 title('wykresy nakladane') 27 legend('sin(t)', 'aproksymacja liniowa', 'aproksymacja piatego rzedu') 6.3 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 t = linspace(0, 8*pi, 200); 2 y = t.*sin(t); 3 4 figure(1) %tworzy okno 5 subplot(1, 2, 1)% dzieli okno na macierz (1,2) wykresow rysuje na 1 6 area(t, y); 7 subplot(1, 2, 2)% teraz rysuje na 2 8 t = linspace(0, 2*pi, 200); 9 y = sqrt(abs(2.*sin(5.*t))); 10 polar(t, y) 11 12 figure(2) %tworzy drugie okno 13 subplot(1, 2, 1) 14 hist(randn(1, 1000)); 15 subplot(1, 2, 2) 16 t = linspace(0, 2*pi, 500); 17 r = sqrt(abs(2.*sin(5.*t))); 18 x = r.*cos(t); 19 y = r.*sin(t); 20 fill(x, y, 'r') Strona 22 z 22