ŚRODOWISKO MATLAB WPROWADZENIE dr inż. Dariusz Borkowski (drobne) modyfikacje: dr inż. Andrzej Wetula
Przebieg III części przedmiotu - 10 zajęć = 6 laboratoriów Matlab + 2 laboratoria Simulink + 2 kolokwia. - aktywność na zajęciach jest oceniana zadania do wykonania w trakcie ćwiczeń
Co to jest MATLAB? MATLAB jest językiem wysokiego poziomu przeznaczonym do obliczeń technicznych. MatLab = Matrix Laboratory
Zastosowania MATLABa Obliczenia numeryczne Modelowanie, symulacja, budowanie prototypów Analiza danych, przetwarzanie sygnałów, wizualizacja Budowa aplikacji, w tym także z GUI i dla systemów wbudowanych (DSP, FPGA) Współpraca z aparaturą (np. karty pomiarowe, procesory sygnałowe, itp.) Obliczenia symboliczne Do różnych zastosowań wykorzystuje się dedykowane toolboxy rozszerzające możliwości podstawowego środowiska
MATLAB opis narzędzi
Podstawowe polecenia >> help nazwa_polecenia wyświetla pomoc w formacie tekstowym >> doc nazwa_polecenia wyświetla ilustrowaną pomoc w w formacie HTML w oknie pomocy >> clear all usuwa z pamięci wszystkie zmienne, stosowane zazwyczaj na początku programu >> clc czyści okno poleceń z poprzednio wyświetlanego tekstu >> close all zamyka wszystkie okna z wykresami >> clf czyści aktualne okno wykresu >> who wyświetla listę zmiennych znajdujących się w pamięci Matlaba >> whos wyświetla szczegółową listę zmiennych wraz z ich rozmiarem i typem danych Lista zmiennych jest też dostępna w zakładce Workspace okna głównego
Macierz Macierzą nazywamy prostokątną tablicę liczb, np.: Macierz jest podstawowym rodzajem danych w Matlabie. Liczby są traktowane jak macierze 1x1, a ciągi znaków jak macierze 1xN wypełnione znakami. Możliwe są operacje na macierzach liczb zespolonych.
Podstawy składni. kropka oddziela część całkowitą od ułamkowej, np: >> a = 3.1415 [ ] nawiasy prostokątne są stosowane przy definiowaniu macierzy: >> v = [ 8 2 5 ] ; średnik kończy wiersz, np. przy definiowaniu macierzy: >> M = [ 1 2 ; 3 4 ; 6 7 ] oraz zapobiega wyświetleniu wyniku z bieżącej linii: >> a = 5; ( ) nawiasy okrągłe są stosowane przy odwołaniach do wybranych elementów istniejącej macierzy: >> a = M( 3, 2 ) oraz ograniczają listę argumentów funkcji: >> sum( v, 1 ), przecinek oddziela argumenty funkcji, polecenia w jednej linii, indeksy macierzy, np: >> a = xcorr(x, y), b = six(x), M(3,2) % procent jest znakiem komentarza, znaki od % do końca linii są ignorowane Matlab rozróżnia wielkość liter! Zmienne A oraz a to dwie różne zmienne.
Tworzenie macierzy i wektorów zmienne traktowane są jak macierze o określonych wymiarach, czyli ilości wierszy i kolumn; liczby wpisujemy wierszami, wiersze macierzy oddzielamy średnikiem: >> Macierz = [1 2 3 ; 4 5 6 ; 7 8 9] >> WektorPoziomy = [1 2 3] >> WektorPionowy = [1; 2; 3] pojedyncza liczba (skalar) - jest macierzą o wymiarach 1x1. >> Liczba = 6 oznacza tyle samo co >> Liczba(1,1)=6 każdy element macierzy może być określany za pomocą jego współrzędnych w macierzy, czyli indeksów, np.: >> V(1,3) = 7 powoduje, że pierwsze dwa nieokreślone elementy wektora V będą wypełnione zerami czyli V = [0 0 7] elementy macierzy indeksowane są od 1 (inaczej niż w języku C). Indeksy muszą być całkowite domyślnie, gdy definiujemy nową zmienną bez części ułamkowej, może być ona użyta jako indeks wektora lub macierzy (nie musimy deklarować typu całkowitego): >> k = 2; % definicja indeksu >> a( k ) = 4 daje w wyniku a = [ 0 4 ]
Indeksowanie elementów Operator : dwukropek, służy do tworzenia ciągów arytmetycznych, np: >> v = 2 : 6 zwróci liczby od 2 do 6 czyli v = [2 3 4 5 6] >> v = 3 : 1.5 : 8 zwróci liczby od 3 do 8 ze skokiem 1.5 v = [3.0 4.5 6.0 7.5] >> v = 8 : -3 : 0 zwróci wektor malejących liczb ze skokiem -3 czyli v = [8 5 2] Inne zastosowanie operatora : to wskazywanie elementów macierzy i wektorów np: >> A = [ 4 8 1 7 3 0 5 ] ; >> B = A( 2 : 4 ) daje w wyniku wektor B = [8 1 7] Sam operator : oznacza też wszystkie elementy kolumny (lub wiersza) macierzy, np: >> M = [ 1 2 ; 3 4 ] ; >> v = M( :, 2 ) oznacza tyle co >> v = M( 1:2, 2 ) lub >> v = M( 1:end, 2 ) i kopiuje drugą kolumnę macierzy M do wektora v dając v = [ 2 ; 4 ] Operator end służy do odwołania się do ostatniego elementu wektora np: >> B = A( 5 : end ) daje B = [ 3 0 5 ] >> B = A( end : -3 : 1 ) daje B = [ 5 7 4 ] Wybór dowolny wielu elementów macierzy (z możliwością powtarzania) wygląda tak: >> B = A([ 7 1 2 1 ]) daje B = [ 5 4 8 4 ] lub >> B = M(2,[1 1 2]) daje B = [ 3 3 4 ] Polecenie size( ) zwraca rozmiar zmiennej, np: >> v = [ 1 ; 2 ; 3 ]; size(v) zwraca ans = [ 3 1 ] Uwaga!!! łatwo pomylić zapis v(1:3), który oznacza pierwsze 3 elementy wektora v z zapisem v(1,3), który odwołuje się do 1 wiersza i 3 kolumny macierzy v oraz z v(1;3), który jest błędny
Zadanie 1 (czas 25 min) =[ 2 1 2 3 9] 0 a) utwórz macierz M 4 5 6 oraz wektor 4 7 8 v=[ 0] 1 b) utwórz macierz A przez skopiowanie do niej fragmentu macierzy M zawierającego 2 i 3 wiersz oraz kolumny od 1 do 2 macierzy M c) skopiuj 3 ostatnie elementy wektora v w miejsce ostatniego wiersza macierzy M d) utwórz nowy wektor x poprzez skopiowanie do niego co drugiego elementu wektora v od końca (czyli w odwrotnej kolejności), wykorzystaj operator end e) utwórz nowy poziomy wektor y poprzez skopiowanie do niego 1, 2 i 5 elementu wektora v f) skopiuj ostatnią kolumnę macierzy M do wektora v (jaki jest wynikowy rozmiar wektora v?)
Operacje macierzowe Operator Opis + dodawanie, np. A + A - odejmowanie * mnożenie, np. A * A (mnożenie macierzy nie jest przemienne) / dzielenie \ lewostronne dzielenie macierzy stosowane w rozwiązywaniu układów równań liniowych (także nadokreślonych) typu A x = B, gdzie A, B to macierze, x to niewiadoma, rozwiązanie x = A \ B ^ potęgowanie, np. x^3 (x do sześcianu) lub A^0.5 (pierwiastek z A) ' apostrof transpozycja macierzy czyli zamiana wierszy z kolumnami, np. B = A'.*./.^ kropka przed operatorem powoduje wykonanie operacji dla kolejnych elementów macierzy lub wektora, np.: x.^2 każdy element x do kwadratu, x.*y mnoży elementy x i y
Łączenie macierzy łączenie w poziomie (kolumny) >> C = [ A, B ] A B A B łączenie w pionie (wiersze) >> F = [ D ; E ] D E D E dopisywanie liczb na koniec wektora >>v = [v, a] v a v a Uwaga! Dopisywanie liczb na końcu długich wektorów (macierzy) odbywa się przez ich kopiowanie w pamięci przez co może być bardzo powolne i może wystąpić brak pamięci!
Usuwanie elementów macierzy usuwanie elementów z macierzy jest równoznaczne z przypisaniem na ich miejsce elementu pustego [ ] w miejscu usuwanego elementu nie będzie nic, a zatem macierz (wektor) zmniejszy swój rozmiar, np. dla wektora >> w = [1 2 3 4 5]; >> w(3) = [ ] usuwa trzeci element wektora i daje w wyniku w = [1 2 4 5] a w przypadku macierzy >> M = [ 1 2 ; 3 4 ]; >> M(:,2) = [ ] usuwa 2 kolumnę i daje M = [ 1 ; 3 ] lub >> M = [ 1 2 ; 3 4 ; 5 6 ; 7 8 ]; >> M([1 3],:) = [ ] usuwa wiersze 1 i 3 i daje M = [ 3, 4 ; 7, 8 ]
Zadanie 2 (czas 15 min) a) utwórz zmienne: A=[ 1 2 3 4] B=[ 2 2 =[ 2] 1 2 3 M 4 5 6 2 7 8 9] x=[ 1 2 3] =[ 3 3] y 3 b) wykonaj operacje: A*B, B*A, A*A, A.*A i uzasadnij wyniki c) spróbuj wykonać: A*M, x*y, A+M, A+5 i wyjaśnij problemy d) wykonaj na 3 możliwe sposoby mnożenie wektorów x oraz y (zastosuj operatory transpozycji i mnożenia pojedynczych elementów) e) pokaż 2 sposoby mnożenia wektora x z macierzą M f) wykonaj iloczyn trzech elementów: wektora x, macierzy M i wektora y g) rozwiąż układ równań M z = y gdzie z jest niewiadomą, którą trzeba wyznaczyć (wykorzystaj operator dzielenia lewostronnego backslash) h) tą samą metodą jak wyżej rozwiąż nadokreślony układ równań (rozwiązanie wymaga pionowego łączenia macierzy) [ M M ] z= [ x y ]
Tworzenie macierzy ones (n,m) tworzy macierz jedynek o wymiarach n wierszy m kolumn zeros(n,m) tworzy macierz zer o wymiarach n wierszy m kolumn eye(n) macierz jednostkowa I czyli kwadratowa wypełniona zerami za wyjątkiem przekątnej głównej wypełnionej jedynkami rand(n,m) macierz wypełniona liczbami pseudolosowymi z przedziału od 0 do 1 (generator o rozkładzie równomiernym) randn(n,m) macierz wypełniona liczbami pseudolosowymi o rozkładzie normalnym diag(v) tworzy macierzy diagonalną, która na przekątnej będzie miała elementy wektora v blkdiag(a,b,c,...) tworzy macierzy blokowo-diagonalną, która na przekątnej będzie miała macierze A, B, C, a pozostałe elementy zerowe linspace(a,b,n) zwraca N równomiernie rozłożonych liczb w zakresie od a do b logspace(a,b,n) zwraca N logarytmicznie-równomiernie rozłożonych liczb z zakresu od 10^a do 10^b, np. >> L = logspace(-2,2,5) daje L = [ 0.01 0.1 1 10 100 ] diag(a) zwraca wektor elementów przekątnej macierzy kwadratowej A
Operacje na macierzach det(a) oblicza wyznacznik macierzy kwadratowej A inv(a) oblicza macierz odwrotną do macierzy kwadratowej A czyli oblicza A -1 fliplr(a) odwraca macierz lub wektor poziomy z lewej na prawą (zamienia kolejność elementów lewo-prawo) czyli >> fliplr([1 2 3]) daje [3 2 1] flipud(a) odwraca macierz lub wektor pionowy z gór na dół (zamienia kolejność elementów góra-dół) rot90(a) obraca macierz o 90 stopni, przeciwnie do kierunku wskazówek zegara reshape(a,m,n) zmienia rozmiar macierzy A na m wierszy i n kolumn, układając w niej element wzięte kolejno (wierszami) z macierzy A, iloczyn n*m musi być równy ilości elementów macierzy A, np.: >> A = [ 1 2 3 ; 4 5 6 ] tworzy macierz o 2 wierszach i 3 kolumnach >> B = reshape(a, 1, 6) daje wektor (czyli macierz 1x6) B = [ 1 2 3 4 5 6 ] size( ) zwraca rozmiar macierzy, np: >> size( [1 2 3; 4 5 6] ) zwraca liczbę wierszy i kolumn ans = [ 2 3 ] >> size( [1 2 3; 4 5 6],2) zwraca liczbę kolumn macierzy (drugi wymiar) ans = 3 length( ) zwraca długość wektora lub największy wymiar macierzy, np: >> length( [1 2; 3 4; 5 6] ) zwraca liczbę wierszy i kolumn ans = 3
Operacje na elementach sum() sumowanie elementów macierzy >> sum(a) sumowanie kolumn (lub elementów dowolnego wektora) >> sum(a,k) sumowanie po k-tym wymiarze macierzy, np. wierszy gdy k = 2 >> sum(sum(a)) suma wszystkich elementów macierzy dwuwymiarowej max(), min() wyznaczenie największego (najmniejszego) elementu, np: >> max(max(a)) znajduje najpierw wektor poziomy zawierający maksima z kolumn macierzy A, a następnie znajduje największe z nich operatory ==, >, < >=, <= czyli operacje porównania wartości elementów >> A > B zwraca 1 dla elementów, dla których spełniono A(n,m) > B(n,m) oraz 0 dla pozostałych >> A == B jw. tylko sprawdza równość elementów >> (A > B) I (A == B) oznacza to to samo co >> A >= B find() wyszukiwanie elementów spełniających warunek logiczny >> k = find(a > 5) zwraca indeksy elementów macierzy większych od 5 Uwaga! domyślnie find zwraca tzw. liniowe indeksy (kolumnami od lewej do prawej), nie zaś współrzędne elementów w postaci wierszy i kolumn, np. >> k = find( [ 7 2 0 ; 9 4 8 ] > 5 ) daje indeksy k = [ 1 2 6 ] >> [n, m] = find([1 2; 3 4] > 2) zwraca numery wierszy i kolumn n = [ 2 ; 2 ] m = [ 1 ; 2 ]
Zadanie 3 (czas 15 min) a) utwórz macierz M =[ 1 2 3 4 5 6 7 8 9] b) wyznacz cztery sumy: po wierszach, po kolumnach, po elementach na obu przekątnych (wykorzystaj funkcję diag() oraz...) macierzy M c) oblicz wyznacznik i odwrotność macierzy M d) wygeneruj macierz o R rozmiarze 4x7 wartości pseudolosowych z zakresu od 0 do 10 (rozkład równomierny polecenie rand() i mnożenie wyniku) e) obróć wygenerowaną macierz R o 90 stopni, a następnie usuń z niej pierwsze dwa wiersze f) znajdź w wynikowej macierzy z punktu e) elementy większe od 7 i posumuj je (wykorzystaj funkcje find() i sum()) g) oblicz najmniejszą wartość z całej macierzy (funkcja min())
Funkcje matematyczne, stałe MATLAB udostępnia baaaaaaardzo wiele funkcji matematycznych: max(), min(), sqrt(), exp(), sin(), tan(), acos(), log(), log10(), log2(), abs(), angle(), real(), imag(), conj(), round(), fix(), floor(), ceil(), mean(), std(), var(), inv().. oraz wiele stałych: pi - 3.14159265... realmin - najmniejsza liczba zmiennoprzecinkowa, realmax - największa liczba zmiennoprzecinkowa Inf - Nieskończoność NaN - Not-a-Number eps - dokładność reprezentacji numerycznej j, i - operator części urojonej czyli zastosowanie ich jest intuicyjne, np: >> a = pi * log( 71 / 21 ) + 2; 1 dużym ułatwieniem w Matlabie jest fakt, że większość funkcji może operować na argumentach wektorowych, co pozwala uniknąć tworzenia zbędnych pętli, np: >> t = 0 : 0.001 : 1; % generujemy wektor czasu >> w = 2 * pi * 50; % określamy pulsację sygnału (skalar) >> x = sin( w * t ); % jednym poleceniem, bez pętli, generujemy cały wektor liczb!
Generowanie sygnałów sygnały i funkcje jednowymiarowe są zapisywane w postaci wektorów, np. generowanie sygnału losowego >> szum = randn(1,1000); gdy tworzymy sygnał będący funkcją czasu, warto najpierw przygotować wektor chwil czasowych, w których będą określone wartości sygnału >> czas = 0:0.001:1; lub bardziej precyzyjnie określając ilość elementów i odstęp czasowy >> N = 200, Ts = 0.005, czas = (0:N-1)*Ts; wtedy możemy wygenerować sygnał jako funkcję czasu >> f = 2, sygnal1 = 10 * sin( 2 * pi * f * czas ); wektory sygnałów można łatwo łączyć, np. dodawanie sygnałów >> sygnal2 = 2 * cos( 2 * pi * 3 * f * czas ); >> sygnal3 = sygnal1 + sygnal2; lub mnożenie sygnałów (modulacja) >> sygnal4 = sygnal1.* exp( czas / 0.4 ); % drgania tłumione można też łatwo dodać do sygnału szum o odpowiednim rozmiarze >> sygnal5 = sygnal4 + 2 * randn( size(sygnal4) );
Wykresy 2D plot() podstawowa funkcja do rysowania wykresów 1D: >> fi = linspace(0,2*pi,1000); % generuje kąty w radianach >> plot( fi, sin(fi) ) % rysuje sinus w funkcji zmiennej fi title() dodaje tytuł wykresu, np: >> title('nazwa wykresu') legend() dodaje legendę, np: >> legend('linia1','linia2') xlabel(), ylabel() dodają opisy osi wykresu, np: >> xlabel( nazwa Osi X ) axis() ustawia widoczny obszar wykresu (zoom), np: >> axis([0 10-3 3]) ustawia zakres osi X od 0 do 10 i osi Y od -3 do 3 Styl linii i opcje: 'red' 'green' 'blue',... kolory wykresu (są też skróty: 'r' 'g' 'b' 'c' 'm' 'y' 'k'): >> plot (x,y, red ) rysuje linię czerwoną, a >> plot(x,y,'k') rysuje linię czarną '-' '--' '.-' ':' styl wykresu (linia ciągła, przerywana, kropka-kreska, kropki), np: >> plot(x,y, g-- ) linia zielona przerywana '.' '+' 'o' 'x'... styl znaczników (kropki, plusy, kółka, iksy, itd. patrz help) >> plot(x,y, gx- ) linia zielona ciągła ze znakami x w punktach wykresu 'linewidth' grubość linii: >> plot(x,y, linewidth,5) rysuje linię grubości 5 pkt. 'color' dowolny kolor wykresu: >> plot(x,y,'color',[1 0.8 0]) rysuje linię o składowych R=100%, G = 80%, B = 0%
Wielokrotne wykresy 2D rysowanie kilku wykresów naraz, na przykładzie sygnałów z poprzedniego slajdu: >> figure(2) % otwiera nowe lub wybiera drugie okno wykresu >> plot(czas, sygnal5, 'g-') % rysuje sygnal5, zielony ciągły >> hold on % przytrzymuje wykres >> plot(czas, sygnal4, 'k--','linewidth',3) % rysuje sygnal4, czarny przerywany gruby >> plot(czas, sygnal1 + sygnal2, 'r.-') % rysuje sumę sygnalow >> legend('sin. tlum. + szum','sin. tlum.','suma harm.') >> hold off % zwalnia wykres >> title('sygnaly') % tytul >> xlabel('czas [s]') % opisy osi X >> ylabel('wartosc') % opisy osi Y >> box on % rysuje ramke wokół >> grid on % rysuje siatke można też kilka wykresów otrzymać stosując pojedyncze wywołanie plot(): >> x1 = 0:0.01:2*pi; x2 = x1, x3 = x1; >> y1 = sin(x1); y2 = cos(x2); >> y3 = y1 + y2; >> plot(x1,y1,'r',x2, y2, 'g', x3, y3, 'b')
Zadanie 4 (czas 15 min) a) wykreśl funkcję y = x 3 1 czerwoną kropkowaną linią grubości 3 dla 5 x 2 15 x 15, przy czym skok zmiennej x ma wynosić 0.2 b) otwórz nowe okno wykresu i wykreśl w nim na jednym wykresie funkcje: cos(x), dla x w zakresie od 0 do 2*pi ze skokiem 0.01*pi, niebieską linią ciągłą, ze znacznikami '+' sin(x), dla x w zakresie od pi do 3*pi ze skokiem 0.25*pi, zieloną linią kropkowaną ze znacznikami 'o' c) dodaj legendę, tytuł i opisy (dowolne) osi X i Y d) włącz siatkę e) ustaw zakres (zoom) osi Y na -2 do 2 oraz osi X od pi do 2*pi