Seminář z MATLABU Jiří Krejsa A2/710
[email protected]
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)
% Získání prvku matice
who whos
% vypis promennych v pameti % vypis promennych v pameti – detailne
b=ones(1,10); d=zeros(1,50);
% jednotkovy vector delky 10 % 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
Popis nápověda, výpis příkazů a funkcí nápověda konkrétního příkazu
helpwin
nápověda v okně
lookfor
Hledá klíčové slovo v helpu
info
informace o Matlabu a fy. Mathworks
Speciální proměnné Spec. prom. ans pi eps flops inf Nan, nan i,j
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
nargin
počet vstupních parametrů funkce
nargout
počet výstupních parametrů funkce
realmin
nejmenší použitelné kladné reálné číslo
realmax
největší použitelné kladné reálné číslo
Příklad i ans = 0 + 1.0000i Zobrazení Tab. 8 datové typy Matlab příkaz
pi
format short
3.1416
format long
3.14159265358979
format short e
3.1416e+000
format long e
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
popis
cd (nebo) pwd
zobrazí aktuální cestu
p=cd
aktuální cesta v řetězci p
delete soubor.m
vymaže soubor.m
dir (nedo) ls
zobrazí soubory v aktuálním adresáři
d=dir
soubory v aktuální cestě ve struktuře d
exist( 'cow', 'file' )
kontroluje existenci souboru cow.m
exist( 'dname', 'dir')
kontroluje existenci adresáře dname
p=matlabroot
aktuální cesta k programu Matlab v řetězci p
type cow
vypíše soubor cow.m
Chat
vypíše soubory *.m
which cow
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
význam
a = [1;2;3;4;5]
sloupcový vektor
a = [1;2;3;4;5]
sloupcový vektor
c = [1,2,3,4,5]
řádkový vektor
b = [1,2,3,4,5]'
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 ]
vytvoří řádkový vektor x obsahující specifické hodnoty
x = první:poslední
vytvoří řádkový vektor x začínající na první, přičítá jedničku, končí hodnotou poslední
x = první:přírůstek:poslední
vytvoří řádkový vektor x začínající na první, přičítá se přírůstek, končí poslední
x linspace(první,poslední,n)
vytvoří řádkový vektor x začínající na první,končí poslední, pole obsahuje n prvků
vytvoří řádkový vektor x začínající na x = logspace(první,poslední,n) 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: zápis
význam
a(2)
zjištění hodnoty 2 prvku vektoru
c(5)=x(2,3)
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,:)
vyjmi třetí řádek, ulož do proměnné y a vypiš
diag(y)
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
definuje E matici
zeros
definuje nulovou matici
ones
definuje matici jednicek
rand
generuje matici náhodných hodnot
det
determinat matice
inv
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
logaritmus matice
poly
charakteristický polynom
size
rozměry matice
roots
vlastní čísla charakteristického polynomu
max
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 5 11 9 7 4 14
3 13 10 8 6 12 15 1
Součet jednotlivých sloupců sum(a) ans = 34 34
34
34
Jak to udělat po řádcích ? b = a' b= 16 5 2 11 3 10 13 8
9 4 7 14 6 15 12 1
sum(b) ans = 34 34
34
34
Tohle je součet sloupců v matici b = součet řádků v matici a. Psáno dohromady: sum(a') ans = 34 34
34
34
Součet prvků na hlavní diagonále: funkce diag vrátí hlavní diagonálu, kterou sečtu sum(diag(a)) ans = 34 Jak se dostat na jednotlivé prvky matice a jak alokovat paměť b=a
b= 16 2 5 11 9 7 4 14
3 13 10 8 6 12 15 1
b(1,5) = 10 b= 16 2 5 11 9 7 4 14
3 13 10 8 6 12 15 1
10 0 0 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 5 11 9 7 4 14
3 13 10 8 6 12 15 1
10 0 10 0 0 0 0 0 0 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 a(1:3) ans = 0
0.1000
b = magic(4); c = b(:,2) c= 2 11 7 14 d = b(1,:)
0.200
0.2000
0.300
0.400
0.500
0.600
0.700
0.800
0.900
1.000
d= 16
2
3
13
Skládání matic a = magic(3); b = [a a] b= 8 3 4
1 5 9
6 7 2
8 3 4
1 5 9
6 7 2
Výrazy Žádná velká překvapení, +,-,*,/, závorky a = sqrt(5^2 - sin(10)) a= 5.0541 1/0 Warning: Divide by zero. ans = 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) ans = -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) ans = 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 3 4
1 5 9
6 7 2
a.*a ans = 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 = [ a1 a2 ... an ], b= [ b1 b2 ... bn ], c - skalár
skalární součet
a+c = [ a1+c a2+c ...an+c ]
skalární součin
a*c = [ a1*c a2*c ... an*c ]
pole-sčítání
a+b = [ a1+b1 a2+b2 ... an+bn ]
pole-součin
a.*b = [ a1*b1 a2*b2 ... an*bn ]
pole-dělení zprava
a./b = [ a1/b1 a2/b2 ... an/bn ]
pole-dělení zleva a.\*b = [ a1\b1 a2\b2 ... an\bn ] 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 = [ a1^b1 a2^b2 ... an^bn ] a.^c = [ a1^c a2^c ... an^c ] c.^a = [ c^a1 c^a2 ... c^an ]
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í ans = -10 20 -10 dot(vek1,vek2) % dot produkt – skalarni násobení ans =
60
možno spočítat i jako vek1 * vek2' ans =
60
Zjištění velikosti – length, size, ndim, numel length – délka vektoru a = [1 2 3 4]; length(a) ans = 4 size – rozměry polí b = [1 2 3; 4 5 6; 7 8 9; 10 11 12]; size(b) ans = 4 3 ndims – počet rozměrů ndims(b) ans = 2 numel – počet elementů numel(b) ans = 12