Seminář z MATLABU Jiří Krejsa A2/710 krejsa@fme.vutbr.cz Obsah kurzu Posluchači se seznámí se základy systému Matlab, vědeckotechnickými výpočty, programováním v Matlabu včetně pokročilých technik, vizualizací výsledků, modelováním dynamických systémů pomocí Matlabu Literatura Studijní opory: http://www.umt.fme.vutbr.cz/~ruja/vyuka/matlab/matlab.html Publikace o Matlabu: přehled na: http://www.humusoft.cz/produkty/matlab/knihy/ Hodnocení Problémově orientovaný semestrální projekt, pokud možno související s bakalářskou/diplomovou prací, zadání po konzultaci s přednášejícím. Výstupem je krátký dokument s přílohou ve formě Matlabovských zdrojových kódů, případně modelů.
Úvod Matlab layout - command window - workspace - current directory - history a=[1 2 3;4 5 6;7 8 9] % vytvoreni matice 3x3 Zadávání matic - uzavřeny v hranatých závorkách - prvky na řádku odděleny mezerou nebo čárkou - řádky odděleny středníkem c=a(2,2) who whos % Získání prvku matice % vypis promennych v pameti % vypis promennych v pameti detailne b=ones(1,10); % jednotkovy vector delky 10 d=zeros(1,50); % nulovy vektor delky 50 Možnosti ovládání pro přerušení prováděného příkazu CTRL+C klávesy šipka nahoru/dolu umožňují pohyb po historii příkazů editace řádku se provádí šipkami vlevo/vpravo, klávesami delete, backspace klávesa ESC vymaže celý řádek proměnné v MATLABu musí začínat písmenem a mohou mít až 31 znaků rozlišují se malá a velká písmena příkaz ukončený středníkem (;) se nevypisuje na obrazovku pokud se příkaz nevleze na řádek, zakončí se třemi tečkami a entrem a pokračuje se na dalším řádku Nápověda příkaz help help příkaz helpwin lookfor info Popis nápověda, výpis příkazů a funkcí nápověda konkrétního příkazu nápověda v okně Hledá klíčové slovo v helpu informace o Matlabu a fy. Mathworks
Speciální proměnné Spec. prom. ans pi eps flops inf Nan, nan i,j nargin nargout realmin realmax Popis proměnná k uložení výsledku Ludolfovo číslo nejmenší použitelné číslo počet operací označení pro nekonečno (např.1/0) označení nedefinované hodnoty komplexní jednotka počet vstupních parametrů funkce počet výstupních parametrů funkce nejmenší použitelné kladné reálné číslo největší použitelné kladné reálné číslo Příklad i 0 + 1.0000i Zobrazení Tab. 8 datové typy Matlab příkaz pi format short 3.1416 format long 3.14159265358979 format short e format long e 3.1416e+000 3.14159265358979e+000 format short g 3.1416 format long g 3.14159265358979 format hex 400921fb54442d18 format bank 3.14 format + + format rat 355/133
M-soubory Pro práci s MATLABem jsou možné dva přístupy, buď jednoduše zadáváme příkazy v okně příkazů (command window) a počítáme. To má nevýhodu v tom, že pokud chceme tento výpočet zopakovat, tak musíme vše napsat znovu. Proto se používá spíše druhý způsob a to je vytváření souborů s příponou.m (m-file). Je to textový soubor, který obsahuje sled příkazů v MATLABu. M-file vytvoříme jednoduše pomocí menu (File > New > M-file. Otevře se okno editoru, kde se dají psát příkazy, které spustíme stiskem klávesy F5, nebo přes menu (Debug > Run). Příkazy se provedou a výpis uvidíme v okně příkazů, pokud jsme výstup nepřesměrovali např. do souboru. M-file se dá spustit také zadáním jména souboru (bez přípony.m) v okně příkazů. Důležité je aby byl soubor v aktuálním adresáři, to si zjistíme pomocí příkazů z tab.10. Použijeme cd pro aktuální adresář a dir pro výpis souborů. Pro výpis obsahu souboru můžeme použít příkaz type. Manipulace se soubory cd (nebo) pwd p=cd delete soubor.m dir (nedo) ls d=dir exist( 'cow', 'file' ) exist( 'dname', 'dir') p=matlabroot type cow Chat which cow popis zobrazí aktuální cestu aktuální cesta v řetězci p vymaže soubor.m zobrazí soubory v aktuálním adresáři soubory v aktuální cestě ve struktuře d kontroluje existenci souboru cow.m kontroluje existenci adresáře dname aktuální cesta k programu Matlab v řetězci p vypíše soubor cow.m vypíše soubory *.m zobrazí cestu k souboru cow.m Matice, vektory MATLAB je maticová laboratoř a proto jsou tu všechna čísla reprezentovaná jako vektory a matice. Proto zde uvádíme podrobný popis ke konstrukci a práci s vektory a maticemi. Zápis v matlabu a = [1;2;3;4;5] a = [1;2;3;4;5] c = [1,2,3,4,5] b = [1,2,3,4,5]' význam sloupcový vektor sloupcový vektor řádkový vektor transpozice řádkového vektoru Příklad a = [1,2,3;2,2,2;1,2,5]
a = 1 2 3 2 2 2 1 2 5 Rozdíl je v tom zda pracujeme s nimi jako s vektory a maticemi jak to známe z algebry nebo jako s poli známé nám z programování. Obě možnosti jsou možné a je potřeba je často zkombinovat. Důležité je ale stále si uvědomovat ten rozdíl. V tab.11 jsou uvedeny příkazy pro konstrukci pole či vektoru, případně matice pokud použijeme tuto konstrukci např. v cyklu. Často budeme využívat definici hodnot x pro tvorbu grafů funkcí. Tab. 11 nástroje pro tvorbu vektoru x = [2 2*pi sqrt(1) 2-3j ] x = první:poslední x = první:přírůstek:poslední x linspace(první,poslední,n) x = logspace(první,poslední,n) vytvoří řádkový vektor x obsahující specifické hodnoty vytvoří řádkový vektor x začínající na první, přičítá jedničku, končí hodnotou poslední vytvoří řádkový vektor x začínající na první, přičítá se přírůstek, končí poslední vytvoří řádkový vektor x začínající na první,končí poslední, pole obsahuje n prvků vytvoří řádkový vektor x začínající na 10, prvni končí na 10 posledni, pole obsahuje n prvků Pokud máme matici či vektor vytvořený můžeme s ním provádět různé operace: a(2) zápis c(5)=x(2,3) význam zjištění hodnoty 2 prvku vektoru hodnotu z druhého řádku a třetího sloupce matice x dej do pátého prvku vektoru c x (2:5, 1:2) vytvoření matice s kterou budeme dále pracovat y=x(3,:) diag(y) vyjmi třetí řádek, ulož do proměnné y a vypiš prvky na diagonále Příklad a = 1 2 3 2 2 2 1 2 5 c = a.*5
c = 5 10 15 10 10 10 5 10 25 Pro lepší orientaci v maticových operacích, zde uvádíme seznam funkcí pro práci s maticemi název popis funkce eye zeros ones rand det inv '.' definuje E matici definuje nulovou matici definuje matici jednicek generuje matici náhodných hodnot determinat matice inverze matice operace transpozice (apostrof) trans. prvek po prvku (sdružená trans., rozdílná od trans. v reálných číslech) sqrtm maticová odmocnina expm maticová exponenciála logm poly size roots max logaritmus matice charakteristický polynom rozměry matice vlastní čísla charakteristického polynomu maximální prvek matice * maticové násobení.* násobení prvek po prvku ^ maticové mocnění.^ mocnění prvek po prvku \,/ dělení zleva, zprava.\ dělení zleva prvek po prvku./ dělení zprava prvek po prvku kron Kronerovo tenzorové násobení
Operace s maticemi podrobněji a = magic(4) a = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 Součet jednotlivých sloupců sum(a) 34 34 34 34 Jak to udělat po řádcích? b = a' b = 16 5 9 4 2 11 7 14 3 10 6 15 13 8 12 1 sum(b) 34 34 34 34 Tohle je součet sloupců v matici b = součet řádků v matici a. Psáno dohromady: sum(a') 34 34 34 34 Součet prvků na hlavní diagonále: funkce diag vrátí hlavní diagonálu, kterou sečtu sum(diag(a)) 34 Jak se dostat na jednotlivé prvky matice a jak alokovat paměť b = a
b = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 b(1,5) = 10 b = 16 2 3 13 10 5 11 10 8 0 9 7 6 12 0 4 14 15 1 0 Je automaticky založen nový sloupec, daný prvek je mu přiřazen a zbytek je doplněn nulami b(1,7) = 10 b = 16 2 3 13 10 0 10 5 11 10 8 0 0 0 9 7 6 12 0 0 0 4 14 15 1 0 0 0 Operátor dvojtečka : Představuje buď rozmezí nebo všechny prvky. a= 1:10 a = 1 2 3 4 5 6 7 8 9 10 a = 0:0.1:1 a = 0 0.100 0.200 0.300 0.400 0.500 0.600 0.700 0.800 0.900 1.000 a(1:3) 0 0.1000 0.2000 b = magic(4); c = b(:,2) c = 2 11 7 14 d = b(1,:)
d = 16 2 3 13 Skládání matic a = magic(3); b = [a a] b = 8 1 6 8 1 6 3 5 7 3 5 7 4 9 2 4 9 2 Výrazy Žádná velká překvapení, +,-,*,/, závorky a = sqrt(5^2 - sin(10)) a = 5.0541 1/0 Warning: Divide by zero. Inf Ukládání a načítání dat ukládání save JMENOSOUBORU uloží všechny proměnné z workspacu (binárně) save JMENOSOUBORU X uloží pouze proměnnou X (binárně) save JMENOSOUBORU X ASCII uloží pouze proměnnou X (textově) existuje i funkční varianta příkazu, použitelná pro parametry ve formě řetězců save('jmenosouboru','var1','var2') načítání - obdobně load JMENOSOUBORU
Další operace s maticemi Násobení a =[8 1 6; 3 5 7; 4 9 2] b = [1; 2; 3] b = 1 2 3 c = a * b c = 28 34 28 Determinant det(a) -360 Inverzní matice X = inv(a) X = 0.1472-0.1444 0.0639-0.0611 0.0222 0.1056-0.0194 0.1889-0.1028 Vlastní čísla eig(a) 15.0000 4.8990-4.8990 (jsou nenulová matice není singulární) Operátor tečka matice / pole
U pole jsou operace prováděny prvek po prvku. Takže pro součet a rozdíl je to stejné jako u matic, ale u násobení a dělení nikoliv. Aby se to dalo rozlišit, používá se operátor tečka. a = 8 1 6 3 5 7 4 9 2 a.*a 64 1 36 9 25 49 16 81 4 Další operace jsou specifické pro práci s poli (tab. 12), kdy se provádějí operace prvek po prvku jako u programování. Musí se dát pozor a nezaměnit s maticovými operacemi. operace prvek po prvku DATA: a = [ a 1 a 2... a n ], b= [ b 1 b 2... b n ], c - skalár skalární součet a+c = [ a 1 +c a 2 +c...a n +c ] skalární součin a*c = [ a 1 *c a 2 *c... a n *c ] pole-sčítání a+b = [ a 1 +b 1 a 2 +b 2... a n +b n ] pole-součin a.*b = [ a 1 *b 1 a 2 *b 2... a n *b n ] pole-dělení zprava a./b = [ a 1 /b 1 a 2 /b 2... a n /b n ] pole-dělení zleva a.\*b = [ a 1 \b 1 a 2 \b 2... a n \b n ] pole-mocnění n = 1:5 n = 1 2 3 4 5 n = n' n = 1 2 3 4 5 mocniny = [n n.^2 n.^3] mocniny = 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 a.^b = [ a 1^b 1 a 2^b 2... a n^b n ] a.^c = [ a 1^c a 2^c... a n^c ] c.^a = [ c^a 1 c^a 2... c^a n ]
Práce s vektory skalární a vektorové násobení vek1 = [1 2 3]; vek2 = [10 10 10]; cross(vek1,vek2) % cross produkt vektorové násobení -10 20-10 dot(vek1,vek2) % dot produkt skalarni násobení 60 možno spočítat i jako vek1 * vek2' 60 Zjištění velikosti length, size, ndim, numel length délka vektoru a = [1 2 3 4]; length(a) 4 size rozměry polí b = [1 2 3; 4 5 6; 7 8 9; 10 11 12]; size(b) 4 3 ndims počet rozměrů ndims(b) 2 numel počet elementů numel(b) 12