Języki Modelowania i Symulacji 2018 Wprowadzenie: MATLAB Wykład 2 dr inż. Marcin Ciołek Katedra Systemów Automatyki Wydział ETI, Politechnika Gdańska
Języki Modelowania i Symulacji dr inż. Marcin Ciołek Katedra Systemów Automatyki Konsultacje: wtorek 13:15-16 Pokój: ETI EA 546 e-mail: marcin.ciolek@pg.edu.pl e-wizytówka: http://pg.edu.pl/marciole
O czym będziemy mówili 1. MATLAB 2. Help 3. Skalary, wektory, macierze 4. Podstawy programowania: for, while, if, switch 5. Wizualizacja wyników 6. Tworzenie interfejsu graficznego 7. SIMULINK
Literatura Brian R., Ronald L. Lipsman, Jonathan M. Rosenberg: A Guide to MATLAB: For Beginners and Experienced Users 3rd Edition, Cambridge University Press, 2014 J. Brzózka i L. Dorobczyński, Programowanie w Matlab, MIKOM, Warszawa 1998 Dokumentacja MATLABa, https://www.mathworks.com/help/matlab/ MathWorks, Inc., MATLAB Tutorials and Learning Resources, http://www.mathworks.com/academia/student_center/tutorials/launchpad.html Moler, Cleve. Numerical Computing with MATLAB. Natick, MA: The MathWorks, Inc., 2004. Moler, Cleve, Experiments with MATLAB, https://au.mathworks.com/moler/exm/chapters.html MathWorks, Inc., List of Matlab-based books. http://www.mathworks.com/support/books.html
Dobre maniery programowania Styl programowania w MATLAB-ie korzystanie z notacji kropkowej, czyli operacji tablicowych (.*./.^.\) służących do wykonywania działań ne elementach wektorów lub macierzy używanie zrozumiałych nazw zmiennych, np. theta, phi, wym_a komentowanie algorytmów, skrytptów używanie m-plików funkcyjnych zamiast m-plików skrytptowych m-pliki powinny być napisane tak aby działały dla skalarów jak i dla macierzy ograniczenie stosowania pętli for ("życie jest za krótkie, aby spędzić je na pisaniu pętli for") używanie notacji dwukropkowej we wszystkich możliwych zastosowaniach 5
Pierszy skrypt Nazwa pliku nie nadpisujemy funkcji MATLABa np. cos = 1 nie używamy spacji, znaków specjalnych np.\/:*?"<> +nie zaczynamy od liczby np. 11nazwa nazwa nie może być zbyt długa można używać polskich znaków: ś,ć itp. Poprawne nazwy: MyFile.m, My_File.m Przydatne funkcje clear all wyczyść wszystkie zmienne w Workspace clear zmiennaa zmiennab zmienna C close all zamyka wszystkie okna z wykresami clc czyści Command Window Komentarze % znak komentarza Ctrl+R komentarz wielu linii kodu Ctrl+T odkomentowanie zaznaczonych linii kodu Ctrl+J zwinięcie zakomentowanego kodu w jedną linię Pozycjonowanie kodu Ctrl+] przesuń zaznaczony blok w prawą Ctrl+[ przesuń zaznaczony blok w lewą Ctrl+I przesuń zaznaczony blok do brzegu Zapamiętaj Skrypt uruchamiamy klawiszem F5 lub 6
Pętle i warunki for loop for index = values statements end while loop while expression statements end switch, case, otherwise switch expression case expression statements case expression statements... otherwise statements end If, elseif, else if expression statements elseif expression statements else statements end specjalne pause return continue break Zapamiętaj znak ; na końcu linii sprawia, że zawartość zmiennych nie jest wypisywana w Command Window 7
Pętla for Przykłady zastosowania pętli for Przykład 1 for t=1:10 statements end Przykład 2 for t=1:2:10 statements end Przykład 3 for t=10:-1:1 statements end Przykład 4 for v = [1 5 8 17] disp(v) end Aby opuścić pętlę użyj wyrażenia break Przykład 5 for t=1:10 if t == 5 break end end 8
Pętla for Aby pominąć resztę instrukcji w pętli i rozpocząć kolejną iterację użyj wyrażenia continue Unikaj stosowania pętli for jeżeli to możliwe Przykład 6 x = 0; for t=1:10 if t == 5 continue end x = x + t; end Przykład 7 z = zeros(3,1); s = 0; x = [1 2 3]; y = [4 5 6]; for t=1:3 z(t) = x(t)*y(t); s = s + z(t); end Ile operacji matematycznych (*/+) należy wykonać, aby pomnożyć dwie macierze o wymiarach n x n? Odpowiedź: n 3 i (n 1)n 2 (+)? z = x.*y s = x*y.' 9
Mnożenie macierzowe Algorytmy używane do mnożenia bardzo dużych macierzy kwadratowych o wymiarach n x n asymptotyczna złożoność obliczeniowa przed 1969 najgorszy przypadek ω = O(n 3 ) 1969 Volker Strassen ω = O(n 2.807 )...... 1990 Coppersmith Winograd ω = O(n 2.376 ) 2013 Virginia Vassilevska Williams ω = O(n 2.3729 ) 2014 François Le Gall ω = O(n 2.3728639 ) ω > O(n 2 ) obliczanie wyznacznika macierzy odwracanie macierzy procedura eliminacji Gaussa https://en.wikipedia.org/wiki/matrix_multiplication 10
Algorytm Strassen'a rok 1969 Niech A, B, C R 2n x2 n będą macierzami kwadratowymi C = AB Podzielmy macierze na cztery równe podmacierze, w razie potrzeby dopełniamy zerami A = A 1,1 A 1,2 A 2,1 A 1,2 B = B 1,1 B 1,2 B 2,1 B 1,2 C = C 1,1 C 1,2 C 2,1 C 1,2 C 1,1 = A 1,1 B 1,1 + A 1,2 B 2,1 C 1,2 = A 1,1 B 1,2 + A 1,2 B 2,2 C 2,1 = A 2,1 B 1,1 + A 2,2 B 2,1 C 2,2 = A 2,1 B 1,2 + A 2,2 B 2,2 M 1 = (A 1,1 +A 2,2 )(B 1,1 + B 2,2 ) M 2 = (A 2,1 +A 2,2 )B 1,1 M 3 = A 1,1 (B 1,2 B 2,2 ) M 4 = A 2,2 (B 2,1 B 1,1 ) M 5 = (A 1,1 +A 2,2 )B 2,2 M 6 = (A 2,1 A 1,1 )(B 1,1 + B 1,2 ) M 7 = (A 1,2 A 2,2 )(B 2,1 + B 2,2 ) C 1,1 = M 1 + M 4 M 5 + M 7 C 1,2 = M 3 + M 5 C 2,1 = M 2 + M 4 C 2,2 = M 1 M 2 + M 3 + M 6 Algorytm rekurencyjny - do każdego mnożenia macierzowgo używamy algorytm Strassen'a 11
Funkcje skrypt główny global t t = 1; x = 5; y = 3; [z1, z2] = my_fun(x,y); z3 = my_fun(x,y); wynik = my_fun2(x,y); varargin{1} = 'x'; varargin{2} = 'y(x)'; [j,k] = myplot(x,y,varargin) function z = my_fun2(x,y) z = x+y; end funkcja lokalna function [z,w] = my_fun(x,y) global t z = 2*x^2 + y; w = x + y + z + t; end funkcja lokalna function varargout = myplot(x,y,varargin) var1 = varargin{:}; x_axis = var1{1}; y_axis = var1{2}; varargout{1} = 1; varargout{2} = 'k'; plot(x,y) xlabel(x_axis) ylabel(y_axis) end Zapamiętaj funkcję należy zapisać pod taką samą nazwą: my_fun.m Zapamiętaj zmienne lokalne zostają usunięte, gdy program opuści funkcję lokalną Zapamiętaj varargin i varargout przechowują "dowolną" liczbę zmiennych wejściwych i wyjściowych 12
O czym będziemy mówili 1. Podstawy programowania: for, while, if, switch, funkcje 2. Wizualizacja wyników 3. Tworzenie interfejsu graficznego 4. SIMULINK
Prezentacja danych plot pie3 mesh plot histogram bar3 waterfall plot
Prezentacja modeli Step Response Root locus G = tf([1],[1 1 1]); step(g) G s = 1 s 2 + s + 1 G = tf([2 5 1],[1 2 3 4]); rlocus(g) G s = 2s2 + 5s + 1 s 3 + 2s 2 + 3s + 4 15
Prezentacja modeli Bode Diagram Nyquist Diagram G = tf([1],[1 1 1]); margin (G) G s = 1 s 2 + s + 1 G = tf([2 5 1],[1 2 3]); nyquist(g) G s = 2s2 + 5s + 1 s 2 + 2s + 3 16
Plot: Marker, line style, color plot properties x = -pi:pi/10:pi; y = tan(sin(x)) - sin(tan(x)); figure plot(x,y,'--rs',... 'LineWidth',2,... 'MarkerSize',10,... 'MarkerEdgeColor','b',... 'MarkerFaceColor',[0.5,0.5,0.5]) xlabel('$x$','interpreter','latex') ylabel('$\frac{y(x)}{x}$','interpr eter','latex','fontsize',18) title('plot','fontname','timesne wroman') grid on Marker 'o' '+' '.' 's' Line style '-' '--' ':' '-.' Color 'r' 'g' 'b' 'k' Desription Circle plus sign point square Desription Solid line Dashed line Dotted line Dash-dotted line Desription red green blue black 17
More Properties 18
More Properties 19
fplot wykres A fplot(@(x) sin(x)) A sin(x) wykres B xt = @(t) cos(3*t); yt = @(t) sin(2*t); fplot(xt,yt) B x = cos(3t) y = sin(2t) 20
fplot wykres C fplot(@(x) exp(x),[-3 0],'b') hold on fplot(@(x) cos(x),[0 3],'b') grid on C e x 3 < x < 0 cos(x) 0 < x < 3 D wykres D fplot(@(x) sin(x+pi/5),'linewidth',2); hold on fplot(@(x) sin(x-pi/5),'--or'); fplot(@(x) sin(x),'-.*c') set(gcf,'position',[1;1;250;200]) 21
fplot fplot easy function plot fplot(@sin,[-2*pi 2*pi]) grid on title('sin(x) from -2\pi to 2\pi') xlabel('x'); ylabel('y'); ax = gca; %get current axes ax.xtick = -2*pi:pi/2:2*pi; ax.xticklabel = {'-2\pi','-3\pi/2','-\pi','-\pi/2','0', '\pi/2','\pi','3\pi/2','2\pi'}; 22
fplot fplot easy function plot fp = fplot(@(x) sin(x)) fp = FunctionLine with properties: Function: @(x)sin(x) Color: [0 0.4470 0.7410] LineStyle: '-' LineWidth: 0.5000 text(-3.6,0.7,'po zmianach') fp.linestyle = ':'; fp.color = 'r'; fp.marker = 'x'; fp.markeredgecolor = 'b'; set(gcf,'position',[1;1;250;200]) 23
Subplot subplot(m,n,p) subplot(2,2,1) x = linspace(0,10); y1 = sin(x); plot(x,y1) title('subplot 1: sin(x)') subplot(2,2,2) y2 = sin(2*x); plot(x,y2) title('subplot 2: sin(2x)') subplot(2,2,3) y3 = sin(4*x); plot(x,y3) title('subplot 3: sin(4x)') subplot(2,2,4) y4 = sin(8*x); plot(x,y4) title('subplot 4: sin(8x)') 24
Histogram wykres A x = randn(1000,1); nbins = 25; h = histogram(x,nbins) h = Histogram with properties: Data: [1000x1 double] Values: [1x25 double] NumBins: 25 BinEdges: [1x26 double] BinWidth: 0.2800 BinLimits: [-3.4000 3.6000] Normalization: 'count' FaceColor: 'auto' EdgeColor: [0 0 0] A B wykres B x = 2*randn(5000,1) + 5; histogram(x,'normalization','pd f') hold on y = -5:0.1:15; mu = 5; sigma = 2; f = exp(-(yu).^2./(2*sigma^2))./ (sigma*sqrt(2*pi)); plot(y,f,'linewidth',1.5) f(x, u, σ) = 1 (x u)2 exp[ σ 2π 2σ 2 ] 25
Bar wykres A y = [2 4 6; 3 4 5]; b = bar(y); wykres B y = [2 2 3; 2 5 6; 2 8 9; 2 11 12]; bar(y,'stacked') wykres C c = categorical({'apples','pears', 'oranges'}); prices = [1.23 0.99 2.3]; bar(c,prices) A C B D wykres D load count.dat Z = count(1:10,:); bar3(z) 26
fplot3 wykresy 3D wykres A xt = @(t) exp(-t/10).*sin(5*t); yt = @(t) exp(-t/10).*cos(5*t); zt = @(t) t; fplot3(xt,yt,zt,[-10 10]) set(gcf,'position',[1;1;250;200]) set(gca,'box','on') A x = e t/10 sin(5t) y = e t/10 cos(5t) z = t B wykres B fplot3(@(t)sin(t), @(t)cos(t), @(t)t, [0 2*pi], 'LineWidth', 2) hold on fplot3(@(t)sin(t), @(t)cos(t), @(t)t, [2*pi 4*pi], '--or') fplot3(@(t)sin(t), @(t)cos(t), @(t)t, [4*pi 6*pi], '-.*c') x = sin(t) y = cos(t) z = t 27
fsurf wykresy 3D wykres A r = @(u,v) 2 + sin(7.*u + 5.*v); funx = @(u,v) r(u,v).*cos(u).*sin(v); funy = @(u,v) r(u,v).*sin(u).*sin(v); funz = @(u,v) r(u,v).*cos(v); fsurf(funx,funy,funz,[0 2*pi 0 pi]) camlight wykres B x = @(u,v) exp(- abs(u)/10).*sin(5*abs(v)); y = @(u,v) exp(- abs(u)/10).*cos(5*abs(v)); z = @(u,v) u; fs = fsurf(x,y,z) A x = sin(t) y = cos(t) z = t B x = e u /10 sin(5 v ) x = e u /10 cos(5 v ) z = u 28
O czym będziemy mówili 1. MATLAB 2. Pomoc 3. Skalary, wektory, macierze, struktury 4. Podstawy programowania: for, while, if, switch 5. Wizualizacja wyników 6. Tworzenie interfejsu graficznego 7. SIMULINK
User Interface - guide 30
User Interface - guide Push Button -> View Callbacks -> Callback % --- Executes on button press in pushbutton1. function pushbutton1_callback(hobject, eventdata, handles) % hobject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) x = linspace(0,10); y = sin(x); plot(x,y,'-o','markerindices',1:5:length(y)) 31
User Interface - guide Push Button -> View Callbacks -> Callback % --- Executes on button press in pushbutton1. function pushbutton1_callback(hobject, eventdata, handles) % hobject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) x = linspace(0,10); y = sin(x); set(handles.axes2) plot(x,y,'-o','markerindices',1:5:length(y)) 32
O czym będziemy mówili 1. MATLAB 2. Help 3. Skalary, wektory, macierze, struktury 4. Podstawy programowania: for, while, if, switch 5. Wizualizacja wyników 6. Tworzenie interfejsu graficznego 7. SIMULINK
SIMULINK SIMULINK jest interaktywnym środowiskiem graficznym, służącym do modelowania, analizy, syntezy i symulacji różnych układów dynamicznych (ciągłych, dyskretnych, dyskretno-ciągłych). Posiada bardzo rozbudowaną bibliotekę bloków dynamicznych i statycznych służących do tworzenia układów o jednym wejściu i wyjściu (SISO) oraz układów wielowymiarowych (MIMO). edycja graficzna i tekstowa modelu matematycznego symulacja komputerowa linearyzacja modelu wokół wybranego punktu pracy zapis modelu w postaci równań w przestrzeni stanu i w postaci funkcji przejścia różne algorytmy całkowania...
SIMULINK
SIMULINK yሶ t = 1 [u t y(t)] T
ሶ ሶ SIMULINK Rozważmy przykład układu drgającego z pominięciem sił tarcia. Niech sygnałem wejściowym będzie siła u(t), natomiast sygnałem wyjściowym niech będzie przesunięcie x(t) Model matematyczny ma postać równania różniczkowego xሷ t = 1 [u t cx(t)] m gdzie m = 2 jest masą suwaka, c = 0.1 jest sztywnością sprężyny x(t) u(t) c x 1 (t) 0 1 x 2 (t) = c x 1 (t) 0 m 0 x 2 (t) + 1 m u(t)
ሶ ሶ SIMULINK x 1 (t) 0 1 x 2 (t) = c x 1 (t) m 0 x 2 (t) + 0 1 m u(t)
O czym będziemy mówili 1. MATLAB 2. Help 3. Skalary, wektory, macierze, struktury 4. Podstawy programowania: for, while, if, switch 5. Wizualizacja wyników 6. Tworzenie interfejsu graficznego 7. SIMULINK
Co muszę zapmiętać Szybkie mnożenie macierzy funkcje for, if, switch, while Metody wizualizacji wyników SIMULINK
Zadania domowe 1) Zaprezentuj działanie for, while, if, switch 2) Omów i zaimplementuj algorytm Strassen'a 3) Metody wizualizacji danych: przedstaw na przykładach
Języki Modelowania i Symulacji Dziękuję za uwagę