Z´ aklady modelov´ an´ı v MATLABU
Josef Tvrd´ık, Viktor Pavliska, Petr Bujok
ˇ ´ISLO OPERACN ˇ ´IHO PROGRAMU: CZ.1.07 C ´ ˇ ´IHO PROGRAMU: NAZEV OPERACN ˇ AV ´ AN ´ ´I PRO KONKURENCESCHOPNOST OP VZDEL PRIORITN´I OSA: 2 ˇ ´ISLO OBLASTI PODPORY: 2.3 C POS´ILEN´I KONKURENCESCHOPNOSTI ´ ´ ˇ ´ICH TECHNOLOGI´I VYZKUMU A VYVOJE INFORMACN ´ V MORAVSKOSLEZSKEM KRAJI ˇ ´I C ˇ ´ISLO PROJEKTU: CZ.1.07/2.3.00/09.0197 REGISTRACN
OSTRAVA 2010
Tento projekt je spolufinancov´an Evropsk´ ym soci´aln´ım fondem a st´atn´ım rozpoˇctem ˇ e republiky Cesk´
N´azev: Autor:
Z´aklady modelov´an´ı v MATLABU Josef Tvrd´ık, Viktor Pavliska, Petr Bujok
Vyd´an´ı: Poˇcet stran:
prvn´ı, 2010 83
Studijn´ı materi´aly pro distanˇcn´ı kurz: Z´aklady modelov´an´ı v MATLABU
Jazykov´a korektura nebyla provedena, za jazykovou str´anku odpov´ıd´a autor.
c Josef Tvrd´ık, Viktor Pavliska, Petr Bujok
c Ostravsk´a univerzita v Ostravˇe
OBSAH
i
Obsah ´ 1 Uvod
3
2 V´ ypoˇ cetn´ı prostˇ red´ı Matlab
4
2.1
Co je Matlab? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.2
Aritmetick´e v´ yrazy . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.3
Nˇekter´e pˇr´ıkazov´e zkratky . . . . . . . . . . . . . . . . . . . . . . . .
6
3 Matematick´ e funkce, 2D grafy
12
3.1
Nˇekter´e funkce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2
Nakreslen´ı 2D grafu . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3
Editace 2D grafu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4 Logick´ e v´ yrazy
26
4.1
Reprezentace logick´ ych hodnot . . . . . . . . . . . . . . . . . . . . . . 26
4.2
Relaˇcn´ı oper´atory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.3
Logick´e oper´atory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.4
Hled´an´ı prvk˚ u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.5
Mnoˇziny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5 Znakov´ eˇ retˇ ezce
37
5.1
Z´akladn´ı operace s ˇretˇezci . . . . . . . . . . . . . . . . . . . . . . . . 37
5.2
Konverze mezi ˇc´ısly a ˇretˇezci . . . . . . . . . . . . . . . . . . . . . . . 38
5.3
Pole ˇretˇezc˚ u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.4
Porovn´av´an´ı a vyhled´av´an´ı ˇretˇezc˚ u . . . . . . . . . . . . . . . . . . . 41
6 Programov´ an´ı v Matlabu
44
6.1
ˇ ıdic´ı pˇr´ıkazy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 R´
6.2
M-soubory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
6.3
Doporuˇcen´ı pro vhodn´ y v´ ybˇer pˇr´ıkaz˚ u . . . . . . . . . . . . . . . . . . 50
OBSAH
1
7 3D grafika
53
7.1
Jednoduch´e ˇca´rov´e grafy . . . . . . . . . . . . . . . . . . . . . . . . . 53
7.2
Kreslen´ı sloˇzitˇejˇs´ıch 3D graf˚ u . . . . . . . . . . . . . . . . . . . . . . . 53
7.3
Editace 3D grafu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
7.4
Dalˇs´ı typy 3D graf˚ u . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
8 Pr´ ace se soubory
67
8.1
Ukl´ad´an´ı a naˇc´ıt´an´ı promˇenn´ ych, pr´ace s workspace . . . . . . . . . . 67
8.2
N´ızko´ urovˇ nov´ y pˇr´ıstup do souboru . . . . . . . . . . . . . . . . . . . 68
8.3
Naˇcten´ı dat z Excelu . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
9 Alternativy MATLABU
74
9.1
Octave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
9.2
FreeMat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
9.3
Scilab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
ˇ sen´ 10 Reˇ eu ´ lohy
78
10.1 N´ahodn´a proch´azka . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 10.2 Objem tˇelesa metodou Monte Carlo . . . . . . . . . . . . . . . . . . . 80 Literatura
83
3
1
´ Uvod
Tento text je urˇcen student˚ um pˇredmˇetu Z´aklady modelov´an´ı v Matlabu. C´ılem pˇredmˇetu je sezn´amit se se z´akladn´ımi operacemi tak, aby je student mohl vyuˇz´ıvat pro zpracov´an´ı dat, kreslen´ı graf˚ u a nauˇcil se programovat algoritmy modeluj´ıc´ı procesy v pˇr´ırodˇe i spoleˇcnosti, viz napˇr [3]. Text je rozdˇelen do kapitol, ve kter´ ych student postupnˇe z´ısk´a praktick´e zkuˇsenosti v uˇz´ıv´an´ı Matlabu. Kaˇzd´a kapitola zaˇc´ın´a pokyny pro jej´ı studium. Tato ˇca´st je vˇzdy oznaˇcena jako Pr˚ uvodce studiem s ikonou na okraji str´anky. Pojmy a d˚ uleˇzit´e souvislosti k zapamatov´an´ı jsou vyznaˇceny na okraji str´anky textu ikonou. V z´avˇeru kaˇzd´e kapitoly je rekapitulace nejd˚ uleˇzitˇejˇs´ıch pojm˚ u. Tato rekapitulace je oznaˇcena textem Shrnut´ı a ikonou na okraji. Odd´ıl Kontroln´ı ot´ azky oznaˇcen´ y ikonou by v´am mˇel pomoci zjistit, zda jste prostudovanou kapitolu pochopili a snad vyprovokuje i vaˇse dalˇs´ı ot´azky, na kter´e budete hledat odpovˇed’. U nˇekter´ ych kapitol je pˇripomenuta Korespondeˇ cn´ı u ´ loha. Pro kombinovan´e a distanˇcn´ı studium jsou korespondenˇcn´ı u ´lohy zad´av´any v r´amci kurzu dan´eho se´ mestru. Uspˇeˇsn´e vyˇreˇsen´ı korespondenˇcn´ıch u ´loh je souˇca´st´ı podm´ınek pro z´ısk´an´ı z´apoˇctu v distanˇcn´ım a kombinovan´em studiu. Zdrojov´e texty algoritm˚ u v Matlabu jsou tiˇstˇeny strojopisn´ ym typem, kter´ y vypad´a napˇr. takto: y = x + (b-a) .* rand(1,n).
´ ˇ ´I PROSTRED ˇ ´I MATLAB 2 VYPO CETN
4
2
V´ ypoˇ cetn´ı prostˇ red´ı Matlab
Pr˚ uvodce studiem: C´ılem t´eto kapitoly je sezn´amit se s Matlabem tak, abyste v nˇem mohli pohodlnˇe pracovat. Poˇc´ıtejte asi se tˇremi aˇz ˇcyˇrmi hodinami studia, zejm´ena praktick´ ymi cviˇcen´ımi u poˇc´ıtaˇce.
2.1
Co je Matlab?
Matlab je v´ ypoˇcetn´ı prostˇred´ı pro maticov´e operace, technick´e v´ ypoˇcty a vizualizaci dat. Matlab uˇz po ˇradu let vyv´ıj´ı firma MathWorks a m´a mnoho uˇzivatel˚ u v bˇeˇzn´ ych operaˇcn´ıch syst´emech (Windows, Unix) po cel´em svˇetˇe. Je to jak interaktivn´ı v´ ypoˇcetn´ı syst´em, kter´ y interpretuje pˇr´ıkazy zadan´e v pˇr´ıkazov´em oknˇe, tak programovac´ı jazyk vysok´e u ´rovnˇe, kter´ y umoˇzn ˇuje rychlou a jednoduchou implementaci algoritm˚ u. Z´akladn´ım datov´ ym typem jazyka je pole, coˇz m˚ uˇze b´ yt skal´ar, vektor, matice nebo dokonce v´ıce neˇz dvojrozmˇern´e pole. Prvkem pole m˚ uˇze b´ yt ˇc´ıseln´a hodnota 308 v pohybliv´e ˇr´adov´e ˇca´rce, dvojit´a pˇresnost, rozsah od −10 do 10308 (realmax = 1.7977e+308, realmin = 2.2251e-308), pˇr´ıpadnˇe alfanumerick´ y znak nebo ˇretˇezec znak˚ u stejn´e d´elky. Logick´e hodnoty se vyjadˇruj´ı ˇc´ıselnˇe, false jako 0, true jako 1. Matlab kromˇe z´akladn´ıch operac´ı s takov´ ym polem a spousty vestavˇen´ ych dalˇs´ıch funkc´ı nab´ız´ı i programovac´ı pˇr´ıkazy pro vytv´aˇren´ı podprogram˚ u (funkc´ı) a pˇr´ıkazy pro ˇr´ızen´ı pr˚ ubˇehu v´ ypoˇctu (podm´ınˇen´ y pˇr´ıkaz, switch, cykly) zn´am´e z bˇeˇzn´ ych programovac´ıch jazyk˚ u. V´ yhodou Matlabu je i velmi kvalitn´ı dokumentace, kter´a je pˇr´ıstupn´a on-line prostˇrednictv´ım Helpu a dovoluje jak rychl´e vyhled´av´an´ı t´emat, zejm´ena funkc´ı Matlabu, tak rychlou a n´azornou instrukt´aˇz k z´akladn´ım operac´ım. Pro sezn´amen´ı s ovl´ad´an´ım Matlabu a jeho z´akladn´ımi moˇznostmi je velmi uˇziteˇcn´e spustit Help a proj´ıt Getting Started.
2.2
Aritmetick´ e v´ yrazy
Pro uˇz´ıv´an´ı Matlabu je d˚ uleˇzit´e zvl´adnout z´akladn´ı operace s vektory a maticemi a tak´e nauˇcit se myslet vektorovˇe“, abychom byli pˇripraveni efektivnˇe vyuˇz´ıt moˇz” nosti, kter´e m´ame v Matlabu k dispozici. Nejdˇr´ıve si uk´aˇzeme p´ar jednoduch´ ych pˇr´ıklad˚ u. Pˇr´ıkazy se zad´avaj´ı na ˇra´dc´ıch pˇr´ıkazov´eho okna (command window), vˇzdy na ˇra´dku ˇ adkov´ za promt >>. R´ y vektor a vytvoˇr´ıme pˇr´ıkazem, ve kter´em prvky vektoru od-
2.2 Aritmetick´e v´ yrazy
5
dˇelen´e mezerami nebo ˇc´arkou zad´ame v hranat´ ych z´avork´ach. Po zad´an´ı pˇr´ıkazu se v´ ysledek vyhodnocen´ı zadan´eho v´ yrazu vyp´ıˇse tak´e v pˇr´ıkazov´em oknˇe: >> a = [3 2 5] a = 3 2 5 Pokud bychom chtˇeli v´ ypis v´ ysledku na obrazovku potlaˇcit, pˇr´ıkaz ukonˇc´ıme stˇredn´ıkem: >> a = [3 2 5]; T´ım jsme vytvoˇrili v pracovn´ı oblasti (Workspace) objekt s n´azvem odpov´ıdaj´ıc´ım uˇzit´emu identifik´atoru, t.j. a, kter´ y m˚ uˇzeme d´ale uˇz´ıvat v dalˇs´ıch pˇr´ıkazech. Matlab v identifik´atorech rozliˇsuje mal´a a velk´a p´ısmena, takˇze a a A nebo TEMP_1, temp_1 a Temp_1 jsou r˚ uzn´e objekty. Existuj´ıc´ı objekt m˚ uˇzete uˇz´ıt napˇr. jako vstupn´ı parametr funkce: >> size(a) ans = 1 3 Funkce size vrac´ı rozmˇery matice, prvn´ı u ´daj je poˇcet ˇra´dk˚ u, druh´ y poˇcet sloupc˚ u. Vˇsimnˇeme si, ˇze pokud hodnotu v´ yrazu nepˇriˇrad´ıme do nˇejak´e n´ami pojmenovan´e promˇenn´e, pˇriˇrad´ı se do promˇenn´e ans (zkratka pro answer, tj odpovˇed’ nebo v´ ysledek). Hodnota ans z˚ ust´av´a nezmˇenˇena do doby, neˇz ji pˇrep´ıˇseme bud’ dalˇs´ım zad´an´ım v´ yrazu bez pˇriˇrazen´ı do n´ami pojmenovan´e promˇenn´e nebo n´ami explicitnˇe zadan´ ym pˇrepisem promˇenn´e ans, napˇr. ans(2) = 5; N´asleduj´ıc´ım pˇr´ıkazem >> b = a + 1 b = 4 3 6 jsme pˇriˇcetli zadanou skal´arn´ı hodnotu (t.j. 1) ke kaˇzd´emu prvku vektoru. Matici vytvoˇr´ıme napˇr. pˇr´ıkazem, ve kter´em jsou ˇr´adkov´e vektory oddˇeleny stˇredn´ıkem >> B = [a; b; b-5.5] B = 3.0000 2.0000 4.0000 3.0000 -1.5000 -2.5000
5.0000 6.0000 0.5000
´ ˇ ´I PROSTRED ˇ ´I MATLAB 2 VYPO CETN
6
Funkce length vrac´ı maxim´aln´ı hodnotu z vektoru spoˇc´ıtan´eho funkc´ı size: >> length(B) ans = 3 Prvky matice nebo vektoru jsou pˇr´ıstupn´e pˇres jejich indexy, takˇze napˇr. prvek na druh´em ˇra´dku a v prvn´ım sloupci m˚ uˇzeme pˇrepsat: >> B(2, 1) = 0 B = 3.0000 2.0000 0 3.0000 -1.5000 -2.5000
5.0000 6.0000 0.5000
S vektory a maticemi m˚ uˇzeme snadno prov´adˇet operace zn´am´e z line´arn´ı algebry (transpozice, inverze matice, pokud je moˇzn´a, atd.) Jejich z´apis je velmi podobn´ y z´apisu obvykl´em v line´arn´ı algebˇre: >> a = a’ a = 3 2 5 >> det(B) ans = 54
% determinant
>> C = B^-1 % inverse matice B, stejn´ y v´ ysledek uzit´ ım inv(B) C = 0.3056 -0.2500 -0.0556 -0.1667 0.1667 -0.3333 0.0833 0.0833 0.1667 >> I = B * C I = 1.0000 0.0000 0 1.0000 0.0000 -0.0000
2.3
0 0 1.0000
Nˇ ekter´ e pˇ r´ıkazov´ e zkratky
Pro vytvoˇren´ı vektor˚ u a matic jsou uˇziteˇcn´e dalˇs´ı r˚ uzn´e v Matlabu vestavˇen´e funkce, kter´e zkracuj´ı pr´aci. Pokud tvoˇr´ı prvky vektoru sekvenci, pak ji m˚ uˇzeme zadat zkr´a-
2.3 Nˇekter´e pˇr´ıkazov´e zkratky
7
cenˇe zad´an´ım doln´ı a horn´ı hranice (pak je implicitnˇe krok roven jedn´e) nebo poˇzadovan´ y krok explicitnˇe zadat: >> a a = >> b b =
= 1:5 1 2 = 10:-2:1 10 8
3
4
6
4
5 2
Matice a vektory m˚ uˇzeme vytv´aˇret pomoc´ı funkc´ı: matice (n × p), sam´e nuly matice (n × p), sam´e jedniˇcky jednotkov´a matice (n × n) matice (n × p), n´ahodn´a ˇc´ısla z rovnomˇern´eho rozdˇelen´ı na [0, 1) matice (n × p), n´ahodn´a ˇc´ısla z normovan´eho norm´aln´ıho rozdˇelen´ı
zeros(n, p) ones(n, p) eye(n) rand(n, p) randn(n, p)
Zad´ame-li tˇemto funkc´ım jen jeden parametr, pak vytvoˇren´a matice je ˇctvercov´a, je-li hodnota tohoto jednoho parametru rovna 1, pak vytvoˇr´ıme ˇctvercovou matici rozmˇeru 1 × 1, ˇcili skal´ar. Pˇr´ıklady: >> zeros(1, 3) ans = 0 >> eye(4) ans = 1 0 0 0 >> rand(3) ans = 0.4447 0.6154 0.7919
0 1 0 0
0
0 0 1 0
0.9218 0.7382 0.1763
>> 10 + 2*randn(3) ans =
0
0 0 0 1
0.4057 0.9355 0.9169
´ ˇ ´I PROSTRED ˇ ´I MATLAB 2 VYPO CETN
8
7.1181 11.1423 9.2002
11.3800 11.6312 11.4238
12.5805 11.3372 12.3817
Pro pr´aci s vektory a maticemi je d˚ uleˇzit´e pr´azdn´e pole [], kter´e m´a rozmˇer (0 × 0). Zaˇrazen´ım pr´azdn´eho prvku (matice) vypouˇst´ıme odpov´ıdaj´ıc´ı prvky pˇr´ısluˇsn´eho pole: a = 1 2 >> a(2) = [] a = 1 3
3
4
4
5
5
ˇ adek nebo sloupec matice m˚ R´ uˇzeme pˇrepsat vektorem >> X = ones(3, 4) X = 1 1 1 1 1 1 1 1 1 >> X(1, :) = a X = 1 3 4 1 1 1 1 1 1
1 1 1
5 1 1
nebo pr´azdn´ ym polem, tj. vypustit cel´ y tˇret´ı sloupec. Symbol : v tomto pˇr´ıkladu znamen´a, ˇze operace se t´ yk´a vˇsech ˇra´dk˚ u matice X. >> X(:, 3) = [] X = 1 3 1 1 1 1
5 1 1
Pole m˚ uˇzeme zvˇetˇsovat i dynamicky tj. pˇrid´avat nov´e prvky v pr´avˇe prov´adˇen´em pˇr´ıkazu. Pokud by v nov´em poli nebyla nˇejak´a hodnota dosud pˇriˇrazena, automaticky se dodaj´ı nuly, jak uvid´ıme v n´asleduj´ıc´ım pˇr´ıkladu: a = 1 >> a(5) = -1 a = 1
2
3
2
3
0
-1
2.3 Nˇekter´e pˇr´ıkazov´e zkratky
9
Zvl´aˇstn´ı v´ yznam m´a promˇenn´a end obsahuj´ıc´ı aktu´aln´ı nejvyˇsˇs´ı hodnotu indexu. Pak napˇr. pˇreps´an´ı posledn´ıho prvku vektoru a hodnotou pˇredposledn´ıho prvku zap´ıˇseme takto: >> a(end) = a(end-1) a = 1 2 3
0
0
Kromˇe dosud zm´ınˇen´ ych aritmetick´ ych oper´ator˚ u jsou uˇziteˇcn´e operace na odpov´ıdaj´ıc´ıch prvc´ıch dvou pol´ı stejn´ ych rozmˇer˚ u, tj. oper´atory zaˇc´ınaj´ıc´ı teˇckou, .*, ./, .^. Napˇr. umocnit kaˇzd´ y prvek vektoru a odpov´ıdaj´ıc´ım prvkem t´ehoˇz vektoru zap´ıˇseme takto a dostaneme v´ ysledek: >> a.^a ans =
1
4
27
1
1
Pˇ r´ıklad 2.1 Matici o rozmˇeru 2 × 5, jej´ımiˇz prvky jsou nez´avisl´e n´ahodn´e hodnoty ze spojit´eho rovnomˇern´eho rozdˇelen´ı U ∼ (1, 11) vygenerujeme n´asleduj´ıc´ım pˇr´ıkazem >> R = 1 + 10*rand(2, 5) R = 8.0605 3.7692 1.9713 1.3183 1.4617 9.2346
7.9483 4.1710
10.5022 1.3445
Matici n´ahodn´ ych hodnot z diskr´etn´ıho rovnomˇern´eho rozdˇelen´ı s parametry (1, 10) (n´ahodn´a cel´a ˇc´ısla mezi 1 a 10) z´ısk´ame tak, ˇze m´ısta za desetinnou teˇckou odˇr´ızneme pomoc´ı funkce fix: >> F = fix(R) F = 8 3 1 1
1 9
7 4
10 1
Jak uˇz bylo v jednom z pˇredchoz´ıch pˇr´ıkaz˚ u uk´az´ano, k cel´emu ˇra´dku nebo sloupci matice se dostaneme vyuˇzit´ım symbolu : na pˇr´ısluˇsn´em m´ıstˇe indexu: >> f2s = F(2, :) % f2s = 1 1 9
druhy radek matice F 4
1
´ ˇ ´I PROSTRED ˇ ´I MATLAB 2 VYPO CETN
10
>> f2r = F(:, 2) f2r = 3 1
%
druhy sloupec matice F
Pokud v´ ysledek nˇejak´e aritmetick´e operace pˇreteˇce“ rozsah datov´eho typu, je v´ y” sledkem hodnota Inf, napˇr. >> realmax * 1.2 ans = Inf >> -realmax * 1.2 ans = -Inf Pokud v´ ysledek aritmetick´e operace nelze vyhodnotit (v´ yrazy Inf*0 nebo Inf/Inf ap.), m´a hodnotu NaN (not a number), napˇr. >> -realmax * 1.2 / (realmax * 1.2) ans = NaN Pro pohodlnˇejˇs´ı zad´av´an´ı pˇr´ıkaz˚ u z kl´avesnice m˚ uˇzeme vyuˇz´ıt svisl´ ych ˇsipek na kl´avesnici, kter´e n´am umoˇzn ˇuj´ı listovat ve dˇr´ıve zadan´ ych ˇr´adc´ıch a pak je na aktu´aln´ım pˇr´ıkazov´em ˇra´dku editovat. Podobnˇe je moˇzn´e vyuˇz´ıvat i dˇr´ıve zadan´e pˇr´ıkazy, kter´e jsou zobrazeny na pracovn´ı ploˇse v oknˇe Command History. Pˇri interaktivn´ı pr´aci s Matlabem je nˇekdy uˇziteˇcn´e si uloˇzit aktu´aln´ı stav pracovn´ıho prostoru (workspace), tj. vˇsechny nebo n´ami vybran´e dosud inicializovan´e promˇenn´e (jejich seznam, typy a rozmˇery se objevuj´ı v oknˇe Workspace), abychom v pˇr´ıˇst´ım sezen´ı mohli pokraˇcovat od souˇcasn´eho stavu. To je moˇzn´e volbou save Workspace as z menu File. Soubor se pak uloˇz´ı pod zadan´ ym jm´enem s pˇr´ıponou .MAT. Tento soubor pak otevˇreme z menu File ve volbˇe Open nebo pˇr´ıkazem load.
2.3 Nˇekter´e pˇr´ıkazov´e zkratky
11
Shrnut´ı: - Datov´e typy v Matlabu - Inicializace vektor˚ u a matic - Funkce zeros, ones, rand, randn - Pr´azdn´e pole [], pˇr´ıstup k cel´ ym sloupc˚ um a ˇr´adk˚ um matice
Kontroln´ı ot´ azky: 1. Jak vygenerujete n´ahodn´e ˇc´ıslo z rovnomˇern´eho spojit´eho rozdˇelen´ı na intervalu [−1, 1] ? 2. Jak vygenerujete n´ahodn´e ˇc´ıslo z norm´aln´ıho rozdˇelen´ı s parametry µ = 100 a σ 2 = 225 ? 3. Je nˇejak´ y rozd´ıl mezi vektory z´ıskan´ ymi n´asleduj´ıc´ımi tˇremi pˇr´ıkazy: a = 1:5, b = 1 + fix(5*rand(1, 5)), c = randperm(5) ?
´ FUNKCE, 2D GRAFY 3 MATEMATICKE
12
3
Matematick´ e funkce, 2D grafy
Pr˚ uvodce studiem: C´ılem t´eto kapitoly je sezn´amit ˇcten´aˇre se z´akladn´ımi matematick´ ymi funkcemi a s 2D grafikou v Matlabu. V prvn´ı ˇc´asti kapitoly se nauˇc´ıme, jak na vektory efektivnˇe aplikovat z´akladn´ı matematick´e funkce. Druh´a ˇca´st kapitoly je vˇenov´ana z´aklad˚ um jednoduch´e vizualizace v Matlabu, vytv´aˇren´ı 2D graf˚ u. Na prostudov´an´ı t´eto kapitoly, pochopen´ı a procviˇcen´ı pˇr´ıklad˚ u si vyhrad’te zhruba 4 hodiny.
3.1
Nˇ ekter´ e funkce
V prostˇred´ı Matlab je moˇzn´e pro snazˇs´ı v´ ypoˇcty s vektory pouˇz´ıt vestavˇen´e matematick´ e funkce. Matlab nab´ız´ı vˇetˇsinu zn´am´ ych a bˇeˇznˇe pouˇz´ıvan´ ych matematick´ ych funkc´ı. V t´ehle kapitole si objasn´ıme zp˚ usob pr´ace s tˇemito funkcemi na ˇreˇsen´ ych pˇr´ıkladech a uk´aˇzeme si, kde nal´ezt celkov´ y v´ yˇcet element´arn´ıch i speci´aln´ıch matematick´ ych funkc´ı Matlab. Mezi nejpouˇz´ıvanˇejˇs´ı funkce v Matlabu patˇr´ı min, max, sum, prod, sort a sortrows. Nyn´ı si na jednoduch´em pˇr´ıkladˇe uk´aˇzeme jak tyto funkce pouˇz´ıt.
Pˇ r´ıklad 3.1 Nejprve vytvoˇr´ıme ˇradu ˇc´ısel 1 – 15, tˇemi napln´ıme matici o rozmˇeru 3 × 5 a tu pak transformujeme na potˇrebn´ y tvar funkc´ı reshape.
>> x = 1:1:15; >> A = reshape(x, 3, 5) A = 1 4 7 10 13 2 5 8 11 14 3 6 9 12 15 % Funkce reshape provede transformaci z vektoru % na matici a naopak, a zmenu rozmeru matic >> B = A’ B = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
3.1 Nˇekter´e funkce
13
Pro seˇcten´ı hodnot prvk˚ u v jednotliv´ ych sloupc´ıch matice pouˇzijeme funkci sum. Pro stejnou operaci na ˇra´dc´ıch matice zad´ame k t´eto funkci parametr, jak ukazuje n´asleduj´ıc´ı pˇr´ıkazy. >> sum(B) ans = 35 40 45 % Stejny vypocet provede prikaz sum(B, 1) % Provede soucet prvku v jednotlivych sloupcich B >> sum(B, 2) ans = 6 15 24 % Prikaz provedl soucet prvku v jednotlivych radcich A Stejnˇe jako souˇcet urˇcit´ ych prvk˚ u matice lze vypoˇc´ıst i souˇciny hodnot ˇra´dk˚ u (nebo sloupc˚ u) matice pomoc´ı funkce prod. >> prod(A) ans = 6 120 504 1320 2730 % Soucin prvku v jednotlivych sloupcich A Pro vypoˇcten´ı nejmenˇs´ı (nebo nejvˇetˇs´ı) hodnoty vektoru slouˇz´ı funkce min (max). V´ ysledkem takov´e funkce v matici dat nen´ı jedna hodnota, ale ˇra´dkov´ y vektor hodnot obsahuj´ıc´ı minim´aln´ı (maxim´aln´ı) hodnoty sloupc˚ u, pˇr´ıpadnˇe i vektor s pozicemi tˇechto hodnot, jak ukazuje pˇr´ıklad. >> [Amin, Imin] = min(A) Amin = 1 4 7 10 13 Imin = 1 1 1 1 1 >> [Amax, Imax] = max(A) Amax = 3 6 9 12 15 Imax = 3 3 3 3 3 % Funkce min a max vyhledaji v kazdem sloupci matice
´ FUNKCE, 2D GRAFY 3 MATEMATICKE
14
% nejmensi (nejvetsi) hodnotu a spolu s ni umoznuji % nalezt take index jeji pozice (Imin, Imax) >> [Amin, Imin] = min(min(A)) Amin = 1 Imin = 1 >> [Amax, Imax] = max(max(A)) Amax = 15 Imax = 5 % Opakovane pouziti funkce min (nebo max) umoznuje % nalezt minimum (maximum) v cele matici cisel Funkce sort setˇr´ıd´ı prvky vektoru, jak ukazuje pˇr´ıklad, kde je vytvoˇren ˇra´dkov´ y vektor pˇeti prvk˚ u z norm´aln´ıho rozdˇelen´ı N(0,100)a n´aslednˇe setˇr´ıdˇen. >> a = 10*randn(1, 5) a = -1.8671 7.2579 >> sort(a) ans = -5.8832 -1.8671
-5.8832
21.8319
-1.3640
-1.3640
7.2579
21.8319
Funkce sort setˇr´ıd´ı prvky matice v jednotliv´ ych ˇr´adc´ıch (sloupc´ıch) matice, jak ukazuje pˇr´ıklad, kde je setˇr´ıdˇena matice A po sloupc´ıch A = 2 6 1 8 5 2 >> sort(A, 1) ans = 2 5 1 8 6 2 % Setrideni prvku ve sloupcich matice a n´aslednˇe po ˇra´dc´ıch.
3.1 Nˇekter´e funkce
15
A = 2 6 1 8 5 2 >> sort(A, 2) ans = 1 2 6 2 5 8 % Setrideni prvku na radcich matice Pro tˇr´ıdˇen´ı matice funkc´ı sort je moˇzn´e pomoci parametru zobrazit matici p˚ uvodn´ıch index˚ u vˇsech prvk˚ u matice. >> [A, i] = sort(A, 1) A = 2 5 1 8 6 2 i = 1 2 1 2 1 2 % K matici byla vytvorena navic i matice % puvodnich indexu prvku pred setridenim % Obdobne pro radky matice. Oproti tomu funkce sortrows neproh´az´ı hodnoty ve sloupc´ıch matice nez´avisle na ostatn´ıch sloupc´ıch, ale tˇr´ıd´ı ˇr´adky matice na z´akladˇe hodnot v jednom sloupci. Tˇr´ıd´ı tedy pouze ˇra´dky, jak ukazuje pˇr´ıklad. A = 9 6 5 8 5 2 >> sortrows(A, 1) ans = 8 5 2 9 6 5 % Setridi vsechny radky matice podle hodnot % sloupce, jehoz cislo je uvedeno jako druhy % vstupni parametr funkce, v tomto pripade "1"
V´ yˇcet element´arn´ıch matematick´ ych funkc´ı v Matlabu vyvol´a pˇr´ıkaz:
16
´ FUNKCE, 2D GRAFY 3 MATEMATICKE
>> help elfun Stejn´ ym zp˚ usobem lze pak z helpu vyvolat v´ yˇcet speci´aln´ıch funkc´ı kl´ıˇcov´ ym slovem specfun ˇci funkc´ı pro v´ypoˇcty s maticemi kl´ıˇcov´ ym slovem matfun. Element´arn´ı matematick´e funkce Matlabu jsou rozdˇeleny do ˇctyˇr kategori´ı: goniometrick´ e exponenci´ aln´ ı – pro v´ ypoˇcet mocnin a logaritm˚ u komplexn´ ı – kter´ ymi se hloubˇeji zab´ yvat nebudeme zaokrouhlovac´ ı – pro pˇrevod ˇc´ısel na vyˇsˇs´ı ˇr´ady a celoˇc´ıseln´e dˇelen´ı Argumentem kaˇzd´e funkce v Matlabu m˚ uˇze b´ yt bud’to skal´ar, vektor nebo matice. Pˇ r´ıklad 3.2 Nejprve vytvoˇr´ıme pˇetisetprvkov´ y vektor x, kter´ y je n´aslednˇe argumentem funkce sinus. >> x = 0:pi/499:2*pi; >> y = sin(x);
Pokud bychom za pˇr´ıkazem pro v´ ypoˇcet funkce sinus nezadali ukonˇcovac´ı znak (;), probˇehl by v´ ypis vˇsech vypoˇcten´ ych hodnot sinu na obrazovku. Z v´ yˇctu exponenci´aln´ıch funkc´ı si v n´asleduj´ıc´ım pˇr´ıkladu uk´aˇzeme v´ ypoˇcet hodnoty exponenci´aln´ı funkce, mocninn´e funkce a logaritmu. Pˇ r´ıklad 3.3 Je vytvoˇrena matice A, jej´ıˇz prvky jsou argumentem exponenci´aln´ı a mocninn´e funkce. >> A = [1 2; 3 4] A = 1 2 3 4 >> B = exp(A) % Vypocte exponencialni funkce prvku matice A B = 2.7183 7.3891 20.0855 54.5982 >> C = sqrt(A) % Vypocte odmocninu prvku matice A C = 1.0000 1.4142 1.7321 2.0000
3.1 Nˇekter´e funkce
17
N´asleduj´ıc´ı pˇr´ıkaz v´ ypoˇcte pˇrirozen´ y logaritmus z prvk˚ u p˚ uvodn´ı matice A n´asoben´ ych ˇc´ıslem π. >> D = log(pi * A) D = 1.1447 1.8379 2.2433 2.5310
Obdobnˇe proved’te v´ ypoˇcet pro bin´arn´ı a dekadick´ y logaritmus matice A z pˇredchoz´ıho pˇr´ıkladu. Pˇ r´ıklad 3.4 Vytvoˇr´ıme matici rozmˇeru (3 × 5), jej´ıˇz prvky jsou pseudon´ahodn´a ˇc´ısla z norm´aln´ıho, respektive z rovnomˇern´eho rozdˇelen´ı. >> A = 10*randn(3, 5); % Hodnoty z normalniho rozdeleni N(0, 100) >> B = 10*rand(3, 5); % Hodnoty z rovnomerneho rozdeleni, tedy <0;10> >> C = abs(A); % Absolutn´ ı hodnoty prku matice A
Srovnejte hodnoty prvk˚ u v´ ysledn´ ych matic B a C z pˇredchoz´ıho pˇr´ıkladu. Pˇ r´ıklad 3.5 N´asleduj´ıc´ı pˇr´ıkazy vytvoˇr´ı ˇctvercovou matici 5. ˇra´du pseudon´ahodn´ ych hodnot z norm´aln´ıho rozdˇelen´ı a tyto hodnoty zaokrouhl´ı na nejbliˇzˇs´ı cel´a ˇc´ısla. >> A = 100 * randn(5); >> B = round(A);
Pomoci n´apovˇedy zjistˇete dalˇs´ı moˇznosti zaokrouhlov´an´ı re´aln´ ych ˇc´ısel. Zaokrouhlete prvky matice A v´ıce zp˚ usoby a v´ ysledky porovnejte. Matlab obsahuje tak´e mnoˇzstv´ı z´akladn´ıch statistick´ ych funkc´ı jsou napˇr.: pr˚ umˇer, medi´an, modus, rozptyl ˇci smˇerodatn´a odchylka. Pˇ r´ıklad 3.6 V n´asleduj´ıc´ım pˇr´ıkladu vytvoˇr´ıme matici A a vypoˇcteme vektory obsahuj´ıc´ı pr˚ umˇery (m) a smˇerodatn´e odchylky (s) jednotliv´ ych sloupc˚ u. >> A = 2 5
3 6
1 9
4 8
´ FUNKCE, 2D GRAFY 3 MATEMATICKE
18
-1 -6 5 >> m = mean(A) m = 2 1 5 >> s = std(A) s = 3.0000 6.2450
0
4
4.0000
4.0000
Kdybychom chtˇeli prov´est stejn´ y v´ ypoˇcet pro ˇr´adky matice, matici bychom pˇred aplikov´an´ım funkce museli transponovat pˇr´ıkazem A’. Pˇ r´ıklad 3.7 Pˇr´ıklad ukazuje, jak nal´ezt nejvˇetˇs´ı hodnotu matice A z pˇredchoz´ıho pˇr´ıkladu. >> max_A = max(max(A)) max_A = 9
3.2
Nakreslen´ı 2D grafu
Silnou str´ankou Matlabu je vizualizace dat. V t´eto ˇca´sti se budeme zab´ yvat dvourozmˇernou vizualizac´ı, neboli vytv´aˇren´ım 2D graf˚ u. K vytvoˇren´ı 2D grafu jsou nezbytn´a data (namˇeˇren´a, vypoˇcten´a), nejˇcastˇeji vektor hodnot argumentu a k nˇemu odpov´ıdaj´ıc´ı vektor funkˇcn´ıch hodnot. Podstatn´e je zvolit k dat˚ um vhodn´ y typ grafu. V Matlabu se nejˇcastˇeji pouˇz´ıv´a k vykreslen´ı 2D grafu funkce plot. Pˇ r´ıklad 3.8 Vytvoˇr´ıme vektor x ekvidistantnˇe rozdˇelen´ ych hodnot v intervalu < 0, 6π >. K tomuto vektoru vytvoˇr´ıme vektory stejn´e d´elky hodnot zad´an´ım funkce y. Z tˇechto dvou vektor˚ u je pak sestrojen graf. >> x = 0:pi/400:6*pi; >> y = exp(-0.2 * x) .* sin(x); >> plot(x, y)
Zad´an´ım tˇechto tˇr´ı pˇr´ıkaz˚ u dostaneme v oknˇe Figure(1) n´asleduj´ıc´ı graf.
3.2 Nakreslen´ı 2D grafu
19
1
0.8
0.6
0.4
0.2
0
−0.2
−0.4
0
5
10
15
20
Podrobnˇejˇs´ı popis pˇr´ıkazu plot, jeho dalˇs´ıch nepovinn´ ych parametr˚ u, moˇznost´ı interaktivn´ı pr´ace s grafem, export obr´azku do r˚ uzn´ ych form´at˚ u atd. nalezneme v helpu. Dalˇs´ı moˇznosti 2D vizualizace jsou pod kl´ıˇcov´ ym slovem graph2d. V praxi ˇcasto nast´av´a situace, kdy potˇrebujeme nˇekolik v´ ystup˚ u vizu´alnˇe srovnat (napˇr. srovnat dvˇe kˇrivky v´ yvoje produktivity dvou firem, ap.). V Matlabu jsou k dispozici dvˇe moˇznosti, jak takov´eto srovn´an´ı pov´est. V prvn´ı ˇradˇe m´ame moˇznost vykreslit oba grafy do t´ehoˇz grafick´eho okna Figure (grafy se mohou prot´ınat, prol´ınat, doporuˇcuje se pro menˇs´ı poˇcet graf˚ u). D´ale je moˇzn´e cel´e grafick´e okno Figure rozdˇelit na nˇekolik samostatn´ ych podoken, a do kaˇzd´eho pak vykresl´ıme jeden z v´ ystup˚ u. Pˇ r´ıklad 3.9 Vytvoˇr´ıme vektor ekvidistantnˇe rozloˇzen´ ych hodnot v intervalu < −π, π >. K tomuto vektoru pak vytvoˇr´ıme vektory y1 a y2 zadan´ ymi funkcemi. Pak sestroj´ıme graf kˇrivek obou funkc´ı do jednoho grafick´eho okna. >> >> >> >>
x = -pi:0.01:pi; y1 = 50 * exp(-0.08 * x) .* sin(x.^3); y2 = 25 * exp(0.08 * x) .* (-sin(x.^3)); plot(x, y1, ’r.-’, x, y2, ’k--’, ’lineWidth’, 3)
´ FUNKCE, 2D GRAFY 3 MATEMATICKE
20
Zp˚ usob zad´an´ı souˇcasn´eho vykreslen´ı dvou graf˚ u do jednoho okna je velmi jednoduch´ y a intuitivn´ı. Za kaˇzdou definic´ı dvojice veliˇcin x a y n´asleduje v apostrofech kombinace tˇr´ı vlastnost´ı, v poˇrad´ı barva kˇrivky, znaˇcka bodu funkce a styl ˇc´ary. Parametrem ’lineWidth’ jsme zvˇetˇsili tlouˇst’ku kˇrivek. V n´asleduj´ıc´ım obr´azku je v´ ysledek: 80
60
40
20
0
−20
−40
−60
−80 −4
−3
−2
−1
0
1
2
3
4
Dalˇs´ı zp˚ usob zobrazen´ı v´ıce graf˚ u v jedin´em obr´azku je pomoc´ı pˇr´ıkazu hold. Aktivace pˇr´ıkazu hold zabr´an´ı pˇrepisov´an´ı grafick´eho okna nov´ ym grafem, dalˇs´ı grafy jsou do okna pˇrikreslov´any aˇz do deaktivace tohoto pˇr´ıkazu. Oproti pˇredchoz´ımu pˇr´ıstupu, pˇr´ıkaz hold umoˇzn ˇuje souˇcasn´e vykreslen´ı r˚ uzn´ ych typ˚ u graf˚ u v jednom grafick´em oknˇe. Pˇ r´ıklad 3.10 Pˇr´ıklad ukazuje jak vytvoˇrit pro data z minul´eho pˇr´ıkladu kaˇzd´ y graf jin´eho typu a vloˇzit jej do jednoho grafick´eho okna na sebe. Pˇriˇcemˇz prvn´ı z graf˚ u bude vykreslen jako spojnicov´ y, a druh´ y graf jako ploˇsn´ y. >> hold on; % Dale zadane grafy kresli do aktualniho okna >> plot(x, y1, ’r’);
3.2 Nakreslen´ı 2D grafu
21
>> bar(x, y2); >> hold off;
80
60
40
20
0
−20
−40
−60
−80 −4
−3
−2
−1
0
1
2
3
4
Aktivace pˇr´ıkazu hold zabr´an´ı pˇrepisov´an´ı grafick´eho okna nov´ ym grafem, dalˇs´ı grafy jsou do okna pˇrikreslov´any aˇz do deaktivace tohoto pˇr´ıkazu. Nyn´ı si uk´aˇzeme i druh´ y zp˚ usob vykreslov´an´ı v´ıce graf˚ u do grafick´eho okna rozdˇelen´eho na podokna. K tomu slouˇz´ı pˇr´ıkaz subplot, kter´ y umoˇzn ˇuje rozdˇelit grafick´e okno do nˇekolika podoken. Pˇr´ıkaz subplot m´a tˇri parametry, kde prvn´ı ˇc´ıslo je poˇcet dˇelen´ı cel´eho grafick´eho okna horizont´alnˇe, druh´e ˇc´ıslo je poˇcet dˇelen´ı okna vertik´alnˇe a tˇret´ı je ˇc´ıslo podokna, do kter´eho m´a b´ yt n´asleduj´ıc´ı graf vykreslen (pozn. ˇc´ıslov´an´ı podoken zaˇc´ın´a z lev´eho horn´ıho rohu grafick´eho okna postupnˇe doprava a d´al dol˚ u). Okno lze rozdˇelit i na r˚ uznˇe velk´e ˇca´sti. Pˇ r´ıklad 3.11 Vytvoˇr´ıme vektor ekvidistantnˇe rozloˇzen´ ych hodnot x v intervalu < −π, π > a k nˇemu dva vektory stejn´e d´elky y1 a y2. D´ale je horizont´alnˇe rozdˇeleno grafick´e okno a do kaˇzd´e poloviny je nakreslen jeden z graf˚ u.
´ FUNKCE, 2D GRAFY 3 MATEMATICKE
22
>> x = -pi:0.01:pi; >> y1 = 50 * exp(-0.08 * x) .* sin(x.^3); >> y2 = 25 * exp(0.08 * x) .* (-sin(x.^3)); >> subplot(2, 1, 1); % Tento prikaz vykresli nasledujici graf do horni % poloviny grafick´ eho okna >> plot(x, y1); >> subplot(2, 1, 2); % Tento prikaz vykresli nasledujici graf do dolni % poloviny grafick´ eho okna >> plot(x, y2);
Grafick´ y v´ ystup pˇredchoz´ıch pˇr´ıkaz˚ u je zobrazen na obr´azku: 100
50
0
−50
−100 −4
−3
−2
−1
0
1
2
3
4
−3
−2
−1
0
1
2
3
4
40
20
0
−20
−40 −4
Pozor je tˇreba d´at na ˇsk´aly vyznaˇcen´e na os´ach graf˚ u. Jako v pˇredchoz´ım pˇr´ıkladu se oba grafy zdaj´ı b´ yt co do vertik´aln´ıch rozmˇer˚ u shodn´e, pˇri pohledu na vertik´aln´ı osu vˇsak zjist´ıme, ˇze prvn´ı graf m´a dva a p˚ ul kr´at vˇetˇs´ı amplitudu. Je to zp˚ usobeno t´ım, ˇze grafick´e okno Matlabu je rozdˇeleno rovnomˇernˇe bez ohledu na mˇeˇr´ıtka os jednotliv´ ych graf˚ u.
3.3 Editace 2D grafu
3.3
23
Editace 2D grafu
D˚ uleˇzitou souˇca´st´ı grafick´ ych v´ ystup˚ u jsou jejich popis a dalˇs´ı grafick´e doplˇ nky, kter´e napom´ahaj´ı k snadnˇejˇs´ı ˇcitelnosti grafu. Matlab umoˇzn ˇuje zobrazen´ı tˇechto informac´ı pˇr´ımo v oknˇe grafu jednoduch´ ymi pˇr´ıkazy. Kaˇzd´ y graf je moˇzn´e popsat nadpisem (title), popisy os (xlabel a ylabel), legendou (legend), libovolnˇe um´ıstˇen´ ym textov´ ym polem v oknˇe grafu (text) a grafickou mˇr´ıˇzkou (grid):
Pˇ r´ıklad 3.12 Vytvoˇr´ıme vektory ekvidistantnˇe rozloˇzen´ ych hodnot x v intervalu < −π, π > a k nˇemu vektor stejn´e d´elky funkce y. Pak vykresl´ıme graf t´eto funkce zelen´e barvy a k nˇemu nadpis, popisy os, legendu, ve kter´e je aritmetick´ y v´ yraz pro v´ ypoˇcet hodnot funkce a textov´e pole, um´ıstˇen´e podle zadan´ ych hodnot souˇradnice.
>> >> >> >> >> >> >> >> >>
x = -pi:0.01:pi; y = 25 * exp(0.08 * x) .* (-sin(x.^3)); plot(x, y, ’g’); title(’Vizu´ aln´ ı zobrazen´ ı funkce’); xlabel(’x’); ylabel(’y’); legend(’25 * exp(0.08 * x) .* (-sin(x.^3))’); text(-1.5, -17, ’graf funkce’); grid on;
´ FUNKCE, 2D GRAFY 3 MATEMATICKE
24
Vizuální zobrazení funkce 40 3
25*exp(0.08*x).*(−sin(x. )) 30
20
y
10
0
−10 graf funkce −20
−30
−40 −4
−3
−2
−1
0 x
1
2
3
4
Pˇr´ıkaz text, vyp´ıˇse zadan´ y textov´ y ˇretˇezec na urˇcen´e souˇradnice v grafu. Existuje i obdobn´ y pˇr´ıkaz gtext, kter´ y po spuˇstˇen´ı nab´ız´ı zvolit m´ısto pro vloˇzen´ı ˇretˇezce do grafu interaktivnˇe kliknut´ım myˇs´ı.
Dalˇs´ı z parametr˚ u zobrazen´ı grafu je vyvol´an pˇr´ıkazem axis. S jeho pomoc´ı jsme schopni nastavit pomˇer os grafu x a y (napˇr. intervaly hodnot na os´ach, stejn´e mˇeˇr´ıtko, nebo stejnˇe dlouh´e osy). Podrobn´ y popis tohoto pˇr´ıkazu i s mnoha dalˇs´ımi parametry naleznete v helpu (pro srovn´an´ı tento pˇr´ıkaz aplikujte na jeden graf nejprve s parametrem equal a n´aslednˇe s parametrem square). Shrnut´ı: - Pˇr´ıkaz subplot k rozdˇelen´ı grafick´eho okna. - Nastaven´ı pomˇeru a krajn´ıch mez´ı os grafu. - Pˇrikreslov´an´ı graf˚ u do grafick´eho okna pˇr´ıkazem hold. - Interaktivn´ı pr´ace v grafick´em oknˇe.
Kontroln´ı ot´ azky:
3.3 Editace 2D grafu
25
1. Jak budete generovat n´ahodn´e ˇc´ıslo z rovnomˇern´eho rozdˇelen´ı z intervalu [a, b)? 2. Zn´ate pˇr´ıklad, kdy je v´ ysledek funkce z´aroveˇ n vstupn´ım parametrem jin´e funkce? 3. Kdy je vhodn´e pouˇz´ıt vykreslov´an´ı v´ıce graf˚ u do jednoho obr´azku souˇcasnˇe a kdy dˇelen´ım okna pomoci subplot?
´ VYRAZY ´ 4 LOGICKE
26
4
Logick´ e v´ yrazy
Pr˚ uvodce studiem: C´ılem t´eto kapitoly je nauˇcit se pracovat s logick´ ymi v´ yrazy, kter´e je pak d´ale moˇzno pouˇz´ıvat pˇredevˇs´ım ve sloˇzitˇejˇs´ıch podm´ınˇen´ ych pˇr´ıkazech if - else. V u ´vodu se sezn´am´ıme se z´akladn´ımi relaˇcn´ımi oper´atory, pot´e se nauˇc´ıme skl´adat logick´e v´ yrazy do sloˇzitˇejˇs´ıch konstrukc´ı pomoc´ı logick´ ych oper´ator˚ u. D´ale se budeme vˇenovat hled´an´ı a zjiˇst’ov´an´ı pˇr´ıtomnosti prvk˚ u ve vektorech a na z´avˇer se dotkneme i t´ematu pr´ace s mnoˇzinami. Prob´ıran´a l´atka je pomˇernˇe jednoduch´a a cel´a kapitola by v´am nemˇela zabrat v´ıce neˇz 3 hodiny i s vypracov´an´ım u ´kol˚ u.
4.1
Reprezentace logick´ ych hodnot
Hodnoty logick´ ych v´ yraz˚ u jsou v Matlabu reprezentov´any pomoc´ı ˇc´ıseln´ ych hodnot 0 a 1. Jak se snadno m˚ uˇzeme pˇresvˇedˇcit, existuj´ı i pˇreddefinovan´e konstanty false a true:
>> false ans = 0 >> true ans = 1
4.2
Relaˇ cn´ı oper´ atory
Relaˇcn´ı oper´atory ve sv´e z´akladn´ı podobˇe slouˇz´ı pˇredevˇs´ım pro porovn´av´an´ı ˇc´ısel a jejich v´ ysledkem je logick´a hodnota:
>> 4 > 2 ans = 1 >> 10 <= 1 ans = 0
V Matlabu m˚ uˇzeme pouˇz´ıvat n´asleduj´ıc´ı relaˇcn´ı oper´atory:
4.3 Logick´e oper´atory
27
Oper´ator Alternativa V´ yznam a a a a a a
== b ∼= b < b > b <= b >= b
eq(a, b) lt(a, b) gt(a, b)
a a a a a a
je je je je je je
rovno b r˚ uzn´e od b menˇs´ı neˇz b vˇetˇs´ı neˇz b menˇs´ı rovno b vˇetˇs´ı rovno b
Pozor! Je velk´ y rozd´ıl mezi == a = • v pˇr´ıpadˇe x == 5 jde o v´ yraz, jehoˇz hodnotou je 0 nebo 1 (porovn´an´ı x s ˇc´ıslem 5) a x se nemˇen´ı, zat´ımco • v pˇr´ıpadˇe x = 5 jde o pˇriˇrazen´ı (pˇr´ıkaz), kter´e nevrac´ı logickou hodnotu, n´ ybrˇz zmˇen´ı obsah promˇenn´e x. Pozn´ amka 4.1 Srovn´avat lze tak´e cel´e matice, pokud jsou rozmˇerovˇe stejn´e. V´ ysledkem je stejnˇe velk´a matice odpovˇed´ı – srovn´an´ı prob´ıh´a prvek po prvku: >> A = [1 2; 3 4]; B = [1 1; 4 4]; >> A < B ans = 0 0 1 0 V´ ysledek lze ˇc´ıst tak, ˇze pouze ve druh´em ˇr´adku a prvn´ım sloupci je hodnota v matici A ostˇre menˇs´ı neˇz v matici B.
4.3
Logick´ e oper´ atory
S logick´ ymi hodnotami lze tak´e pracovat pˇri logick´ ych operac´ıch. V tˇechto pˇr´ıpadech je ˇc´ıslo nula vˇzdy ch´ap´ano jako nepravda a jak´ekoliv jin´e, tj. nenulov´e ˇc´ıslo jako pravda. K dispozici pak m´ame n´asleduj´ıc´ı oper´atory: Oper´ator Alternativa V´ yznam x & y x | y ∼x
and(x, y) or(x, y) not(x) xor(x, y)
Pˇr´ıklad pouˇzit´ı:
x a z´aroveˇ ny x nebo y negace x exkluzivn´ı nebo
´ VYRAZY ´ 4 LOGICKE
28
>> 0 & 1 ans = 0 >> 0 | 1 ans = 1 >> ~6 ans = 0 K dispozici jsou t´eˇz oper´atory pro ne´ upln´e vyhodnocov´an´ı logick´eho souˇcinu a souˇctu, kdy vyhodnocov´an´ı skonˇc´ı v okamˇziku, kdy je jiˇz zn´am v´ ysledek na z´akladˇe ˇc´asti v´ yrazu. Jedn´a se vlastnˇe o zdvojen´e symboly pro tyto operace: >> 0 && (4 < 5) ans = 0 >> 1 || (4 < 5) ans = 1 Ani v jednom z tˇechto pˇr´ıklad˚ u se nevyhodnocoval v´ yraz 4 < 5, nebot’ v´ ysledek cel´eho v´ yrazu je jasn´ y jiˇz z prvn´ı ˇc´asti. V´ yˇse uveden´a vlastnost ne´ upln´eho vyhodnocov´an´ı m˚ uˇze m´ıt nˇekdy neˇza´douc´ı vedlejˇs´ı u ´ˇcinky a je proto vˇzdy zapotˇreb´ı jednat obezˇretnˇe a zv´aˇzit, zda je vhodn´e tohoto zp˚ usobu vyuˇz´ıt, ˇci ne, pˇr´ıpadnˇe v jak´em poˇrad´ı ˇc´asti sloˇzen´eho v´ yrazu zapsat. Napˇr´ıklad pˇri pouˇzit´ı ˇc´asti k´odu jako je tento: if ((value > 3) && check(value)) ... end se vol´an´ı funkce check provede pouze v pˇr´ıpadˇe, ˇze hodnota promˇenn´e value je vˇetˇs´ı neˇz 3. Koneˇcnˇe stejnˇe jako u relaˇcn´ıch oper´ator˚ u lze logick´ ymi oper´atory spojovat cel´e matice, pokud maj´ı stejn´e rozmˇery: >> A = [1; 1; 0; 0]; B = [1; 0; 1; 0]; >> C = [A, B, A & B, A | B, xor(A, B)] C = 1
1
1
1
0
4.4 Hled´an´ı prvk˚ u
1 0 0
4.4
0 1 0
0 0 0
1 1 0
29
1 1 0
Hled´ an´ı prvk˚ u
Hodnoty pravda a nepravda tak´e vrac´ı funkce (kvantifik´atory) any a all. Je-li jejich parametrem vektor, vracej´ı skal´ar, tzn. logickou hodnotu, zda alespoˇ n jeden, resp. vˇsechny prvky vektoru maj´ı nenulovou hodnotu (logickou hodnotu true). Napˇr.: >> V = [0 1 2 3]; W = [1 2 3 4]; X = [0 0 0 0]; >> [any(V), any(W), any(X)] ans = 1 1 0 >> [all(V), all(W), all(X)] ans = 0 1 0 Pokud tyto funkce aplikujeme na matici, jako v´ ysledek z´ısk´ame vektor odpovˇed´ı – ke kaˇzd´emu sloupci matice jednu odpovˇed’: >> A = [0 1 0; 1 2 0] A = 0 1 0 1 2 0 >> any(A) ans = 1 1 0 >> all(A) ans = 0 1 0 Kde je v odpovˇedi jedniˇcka, tak v takov´em sloupci v poˇrad´ı dan´a podm´ınka plat´ı. Chceme-li z´ıskat jedinou odpovˇed’ pro celou matici, m˚ uˇzeme funkce aplikovat v´ıcekr´at. Dotaz
30
´ VYRAZY ´ 4 LOGICKE
>> any(any(A)) ans = 1 zjist´ı, zda v cel´e matici je alespoˇ n jedno ˇc´ıslo nenulov´e; kombinac´ı funkc´ı >> all(any(A)) ans = 0 zase zjist´ıme, zda vˇsechny sloupce matice obsahuj´ı alespoˇ n jedno nenulov´e ˇc´ıslo apod. Pozn´ amka 4.2 Podobnˇe funguj´ı i nˇekter´e numerick´e funkce, napˇr. mean, std, median, min, max, sum, prod, takˇze m˚ uˇzeme velmi snadno spoˇc´ıtat ˇr´adkov´ y vektor sloupcov´ ych pr˚ umˇer˚ u, smˇerodatn´ ych odchylek atd.
Pˇ r´ıklad 4.1 Pomoc´ı oper´ator˚ u any a all m˚ uˇzeme zjistit, zda aspoˇ n jeden ˇci vˇsechny prvky matice nebo vektoru splˇ nuj´ı nˇejakou logickou podm´ınku, napˇr. zda vˇsechny prvky matice jsou nez´aporn´e: >> B = [-1, 3, 3; -1, 0, 3] B = -1 3 3 -1 0 3 >> all(all(B >= 0)) ans = 0
Zat´ımco funkce any a all d´avaly odpovˇedi ano a ne, s pomoc´ı funkce find lze naj´ıt pozice prvk˚ u, kter´e nˇejakou podm´ınku splˇ nuj´ı. Pˇresnˇe definov´ano, funkce find vrac´ı sloupcov´ y vektor pozic nenulov´ ych prvk˚ u v matici: >> A = [0 1 0; 1 2 0] A = 0 1 0 1 2 0 >> find(A) ans = 2
4.4 Hled´an´ı prvk˚ u
31
3 4 V takov´emto jednoduch´em pˇr´ıpadˇe se pozice poˇc´ıtaj´ı od jedniˇcky po sloupc´ıch smˇerem od shora dol˚ u, aktu´aln´ı pozice tedy odpov´ıd´a pˇrepoˇctu: pozice = ˇra´dek + poˇcet ˇr´adk˚ u × (sloupec − 1) A = 0 1
1 2
0 0
% % %
Pozice v A = 1 2
3 4
5 6
Pozn´ amka 4.3 Funkci find lze donutit“, aby pozice prvk˚ u vracela jako dva vektory, kdy v jednom ” budou indexy ˇra´dk˚ u a ve druh´em indexy sloupc˚ u; spr´avn´e souˇradnice pak z´ısk´ame, vezmeme-li dvojice ˇc´ısel ze stejn´ ych pozic v tˇechto vektorech: >> [radky, sloupce] = find(A) radky = 2 1 2 sloupce = 1 2 2 Pro lepˇs´ı pˇrehlednost pak m˚ uˇzeme tyto sloupcov´e vektory vypsat vedle sebe v jedn´e matici: >> [radky, sloupce] ans = 2 1 % cteno po radcich vidime souradnice 1 2 2 2
V´ ysledek nyn´ı ˇcteme tak, ˇze nenulov´e prvky jsou v matici A ve druh´em ˇra´dku a prvn´ım sloupci, v prvn´ım ˇra´dku a druh´em sloupci a tak´e v druh´em ˇra´dku a druh´em sloupci.
´ VYRAZY ´ 4 LOGICKE
32
Funkce find se nejˇcastˇeji pouˇz´ıv´a pro nalezen´ı prvk˚ u splˇ nuj´ıc´ıch logickou podm´ınku. Napˇr. pozice z´aporn´ ych prvk˚ u vektoru b nalezneme pomoc´ı: b = [0.2621, -0.0435, -0.4815, 0.3214, -0.0553]; >> find(b < 0) ans = 2 3 5 Jejich vypuˇstˇen´ı z vektoru b m˚ uˇzeme dos´ahnout elegantnˇe napˇr. takto: >> b(find(b < 0)) = [] b = 0.2621 0.3214 V nˇekter´ ych situac´ıch se neobejdeme bez funkce logical, kter´a pˇrev´ad´ı ˇc´ıseln´e hodnoty na logick´e: >> logical(3.8) ans = 1 Jedn´a se napˇr´ıklad o pˇr´ıpad, kdy potˇrebujeme vybrat prvky z matice v z´avislosti na logick´ ych hodnot´ach v jin´e matici. Vˇse vysvˇetl´ı n´asleduj´ıc´ı pˇr´ıklad: Pˇ r´ıklad 4.2 Budeme cht´ıt z´ıskat prvky z hlavn´ı diagon´aly matice A a z demonstraˇcn´ıch d˚ uvod˚ u k tomu nepouˇzijeme vestavˇenou funkci diag(A). Pomoc´ı funkce eye(n) z´ısk´ame n-rozmˇernou jednotkovou matici: >> eye(3) ans = 1 0 0 0 1 0 0 0 1 Tuto matici bychom chtˇeli pouˇz´ıt jako masku“ pro v´ ybˇer prvk˚ u z matice A. Kdyˇz ” vˇsak pouˇzijeme pˇr´ımo n´asleduj´ıc´ı konstrukci, obdrˇz´ıme: >> A A = 1 4 7
= [1 2 3; 4 5 6; 7 8 9] 2 5 8
3 6 9
>> A(eye(3)) ??? Subscript indices must either be real positive integers or logicals.
4.5 Mnoˇziny
33
V tomto pˇr´ıpadˇe n´am pom˚ uˇze v´ yˇse zm´ınˇen´a funkce logical: >> A(logical(eye(3))) ans = 1 5 9
4.5
Mnoˇ ziny
Vektor lze ch´apat jako mnoˇzinu, pokud neobsahuje ˇza´dn´e duplicitn´ı prvky – tento poˇzadavek spln´ı funkce unique: >> v = [7 7 2 3 3 3 7 7 2]; >> mnozina = unique(v) mnozina = 2 3 7
Pozn´ amka 4.4 M˚ uˇzeme si povˇsimnout, ˇze funkce vrac´ı v´ ysledek setˇr´ıdˇen´ y od nejmenˇs´ıho ˇc´ısla po nejvˇetˇs´ı.
Funkce unique (podobnˇe jako i dalˇs´ı d´ale uveden´e funkce) m´a nˇekolik variant pouˇzit´ı. Pokud potˇrebujeme zn´at indexy prvk˚ u v´ ysledn´e mnoˇziny v p˚ uvodn´ı mnoˇzinˇe, m˚ uˇzeme pouˇz´ıt n´asleduj´ıc´ı konstrukci: >> [B, I, J] = unique([7 7 2 3 3 3 7 7 2]) B = 2
3
7
I = 9
6
8
J = 3
3
1
2
2
2
3
3
1
V promˇenn´e B je uloˇzena v´ ysledn´a mnoˇzina a I a J jsou indexov´e vektory tak, ˇze plat´ı: B = A(I) a A = B(J). Z vektoru I tedy pozn´ame, ˇze napˇr. prvn´ı prvek
´ VYRAZY ´ 4 LOGICKE
34
v´ ysledn´e mnoˇziny B byl v p˚ uvodn´ım vektoru na dev´at´em (posledn´ım) m´ıstˇe. Toto m˚ uˇzeme ovlivnit pˇrid´an´ım dalˇs´ıho parametru ’first’, kter´ ym zajist´ıme, ˇze budou vyb´ır´any prvn´ı v´ yskyty ze vstupn´ıho vektoru: >> [B, I, J] = unique([7 7 2 3 3 3 7 7 2], ’first’) B = 2
3
7
I = 3
4
1
J = 3
3
1
2
2
2
3
3
1
Mnoˇzinov´e operace lze prov´adˇet i s maticemi. V tomto pˇr´ıpadˇe mus´ıme ale specifikovat, zda chceme pracovat s prvky matice, anebo s jej´ımi ˇr´adky. Toto provedeme jednoduˇse pˇrid´an´ım parametru ’rows’ v pˇr´ıpadˇe, kdy poˇzadujeme aby prvky mnoˇzin byly jednotliv´e ˇra´dky matice. >> M M = 1 2 1 2
= [1 2 3 3; 2 5 1 7; 1 2 1 1; 2 5 1 7] 2 5 2 5
3 1 1 1
3 7 1 7
>> unique(M) ans = 1 2 3 5 7 >> unique(M, ’rows’) ans = 1 2 1 1 1 2 3 3 2 5 1 7
4.5 Mnoˇziny
35
Dalˇs´ı funkce pro pr´aci s mnoˇzinami jsou union, intersect, setdiff a setxor, pˇriˇcemˇz jejich v´ yznam a varianty pouˇzit´ı jsou shrnuty v n´asleduj´ıc´ı tabulce: Funkce
union
Varianta
V = V = [V, V =
setxor
sjednocen´ı mnoˇzin: V = M ∪ N ˇra´dkov´e sjednocen´ı matic M, N V =M ∪N V = M (I) ∪ N (J) intersect(M, N) pr˚ unik mnoˇzin: V = M ∩ N intersect(M, N, ’rows’) ˇra´dkov´ y pr˚ unik matic M, N I, J] = intersect(M, N) V = M ∩ N V = M (I), V = N (J) setdiff(M, N) rozd´ıl mnoˇzin: V = M \ N setdiff(M, N, ’rows’) ˇra´dkov´ y rozd´ıl matic M, N I] = setdiff(M, N) V =M \N V = M (I) setxor(M, N) symetrick´ y rozd´ıl mnoˇzin: V =M 4N setxor(M, N, ’rows’) sym. rozd´ıl ˇr´adk˚ u matic M, N I, J] = setxor(M, N) V =M 4N V = M (I) ∪ V = N (J)
V = union(M, N) V = union(M, N, ’rows’) [V, I, J] = union(M, N)
V = V = intersect [V,
setdiff
Popis
V = [V,
Zaj´ımav´a je tak´e funkce ismember, kter´a slouˇz´ı pro zjiˇst’ov´an´ı, zda nˇejak´ y prvek v mnoˇzinˇe leˇz´ı nebo neleˇz´ı. Jej´ı pouˇzit´ı m´a opˇet nˇekolik variant: • ismember(x, S) – vrac´ı true, pokud prvek x ∈ S, jinak vrac´ı false. >> ismember(5, [2 5 8 10]) ans = 1 • ismember(M, S) – vrac´ı pole nul a jedniˇcek o stejn´e velikosti jako mnoˇzina M, pˇriˇcemˇz jedniˇcky jsou na m´ıstech prvk˚ u z mnoˇziny A, kter´e leˇz´ı v mnoˇzinˇe S. >> ismember([1, 2, 3, 5, 10], [2 5 8 10]) ans = 0 1 0 1 1 • ismember(M, S, ’rows’) – maticov´a varianta • [TF, I] = ismember(M, S) – nav´ıc jeˇstˇe do promˇenn´e I vloˇz´ı indexy odpov´ıdaj´ıc´ı pozic´ım, na kter´ ych se prvky z mnoˇziny M v mnoˇzinˇe S nach´azej´ı
´ VYRAZY ´ 4 LOGICKE
36
>> [TF, I] = ismember([1, 2, 3, 5, 10], [2 5 8 10]) TF = 0 1 0 1 1 I = 0
1
0
2
4
Je tedy zˇrejm´e, ˇze plat´ı: >> all(TF == logical(I)) ans = 1 V souvislosti s mnoˇzinami nesm´ıme opomenout ani funkci isempty(M), kter´a vrac´ı true v pˇr´ıpadˇe, ˇze mnoˇzina M je pr´azdn´a. Shrnut´ı: - Logick´e hodnoty true, false - Oper´atory ==, ∼=, <, > - Oper´atory any, all - Mnoˇzinov´e operace: sjednocen´ı, pr˚ unik, rozd´ıl, pˇr´ısluˇsnost prvku do mnoˇziny.
Kontroln´ı ot´ azky: 1. Vysvˇetlete rozd´ıl mezi: • x = (z == y) a • x == (z == y) 2. Vysvˇetlete rozd´ıl mezi pouˇzit´ım (x & y) a (x && y) 3. Sestavte pˇr´ıkaz, kter´ y pro zadanou matici zjist´ı, zda jsou vˇsechny jej´ı prvky vˇetˇs´ı neˇz 3. 4. Je d´ana matice A = [1 2 3; 4 5 6; 1 2 3]. Jak zjist´ıte, zda jsou hodnoty prvk˚ u v prvn´ım ˇr´adku matice A menˇs´ı neˇz hodnoty prvk˚ u ve tˇret´ım sloupci matice A. Zapiˇste v´ ysledek operace.
37
5
Znakov´ eˇ retˇ ezce
Pr˚ uvodce studiem: V t´eto kapitole se nauˇc´ıme pracovat s ˇretˇezcov´ ymi promˇenn´ ymi (angl. string), kter´e v Matlabu slouˇz´ı pro reprezentaci textov´ ych dat. Po z´akladn´ıch operac´ıch a konstrukc´ıch se budeme zab´ yvat porovn´av´an´ım a vyhled´av´an´ım v ˇretˇezc´ıch a v z´avˇeru si uvedeme pˇrehled nejˇcastˇeji pouˇz´ıvan´ ych funkc´ı, kter´e se pˇri pr´aci s ˇretˇezci znak˚ u pouˇz´ıvaj´ı. Na kapitolu si vyhrad’te zhruba 2 aˇz 3 hodiny.
5.1
Z´ akladn´ı operace s ˇ retˇ ezci
Znakov´ y ˇretˇezec v Matlabu je ˇra´dkov´ y vektor, jehoˇz prvky jsou jednotliv´e znaky. Pro vytvoˇren´ı ˇretˇezce slouˇz´ı apostrofy, do kter´ ych se vep´ıˇse obsah ˇretˇezce, pˇriˇcemˇz takto vytvoˇren´ y ˇretˇezec m˚ uˇzeme uloˇzit do promˇenn´e: >> nazev = ’Uvod do Matlabu’ nazev = Uvod do Matlabu Pokud je potˇreba m´ıt v ˇretˇezci znak apostrof, je potˇreba d´at toto najevo zpˇetn´ ym lom´ıtkem zapsan´ ym pˇred poˇzadovan´ ym znakem. Jedno zpˇetn´e lom´ıtko se tak´e zap´ıˇse jako dvˇe zpˇetn´a lom´ıtka: >> ’\’\\’ ans = ’\
Pozn´ amka 5.1 Jelikoˇz je ˇretˇezec vektor sloˇzen´ y ze znak˚ u, m˚ uˇzeme s n´ım pracovat znak po znaku jako s bˇeˇzn´ ym polem – k jednotliv´ ym znak˚ um tedy lze pˇristupovat pomoc´ı index˚ u stejnˇe jako u ˇc´ıseln´ ych vektor˚ u a matic: >> nazev = ’Uvod do Matlabu’; >> nazev(1) ans = U >> nazev(9:14) ans =
´ RET ˇ EZCE ˇ 5 ZNAKOVE
38
Matlab >> length(nazev) ans = 15
Pozn´ amka 5.2 Pokud chceme vypsat obsah ˇretˇezce bez onoho ans =“ na zaˇca´tku, je na m´ıstˇe ” pouˇzit´ı funkce disp: >> disp(nazev(9:14)) Matlab
Zaps´an´ı v´ıce ˇretˇezc˚ u jako prvk˚ u ve vektoru m´a za n´asledek jejich spojen´ı – zˇretˇezen´ı: >> J = ’Josef’; P = ’Petr’; >> oba = [J, ’ a ’, P] oba = Josef a Petr
5.2
Konverze mezi ˇ c´ısly a ˇ retˇ ezci
Je-li ˇca´st´ı nˇejak´eho vektoru ˇretˇezec, ch´ape se jako ˇretˇezec cel´ y vektor. Proto se n´asleduj´ıc´ı pˇr´ıklad nechov´a tak jak by se na prvn´ı pohled mohlo zd´at. x = 35; >> disp([’Vysledkem je cislo: ’, x]) Vysledkem je cislo: # Pˇredchoz´ı pˇr´ıklad proto nam´ısto ˇc´ısla 35 vypsal znak #“, kter´ y se nach´az´ı na 35. ” pozici v tabulce znak˚ u. Pro n´apravu t´eto situace existuje funkce num2str, kter´a pˇrev´ad´ı ˇc´ısla na jejich textovou podobu: >> disp([’Vysledkem je cislo: ’, num2str(x)]) Vysledkem je cislo: 35 Opaˇcn´a funkce str2num pˇrev´ad´ı platnou textovou podobu ˇc´ısla na ˇc´ıslo, se kter´ ym je moˇzn´e d´ale poˇc´ıtat – prov´adˇet matematick´e operace.
5.2 Konverze mezi ˇc´ısly a ˇretˇezci
39
>> c = str2num(’1’) + str2num(’1’) c = 2 Jeˇstˇe vˇetˇs´ı moˇznosti pˇri form´atov´an´ı v´ ystupu d´av´a funkce sprintf, kter´a se chov´a obdobnˇe jako stejnojmenn´a funkce z jazyka C. Prvn´ım argumentem funkce je tzv. form´atovac´ı ˇretˇezec“ a za n´ım n´asleduje pˇredem neurˇcen´ y poˇcet vlastn´ıch dat, kter´a ” maj´ı b´ yt do v´ ystupu zahrnuta. Jejich poˇcet je urˇcen aˇz za bˇehu programu a mus´ı odpov´ıdat poˇctu form´atovac´ıch sekvenc´ı z form´atovac´ıho ˇretˇezce. Form´atovac´ı moˇznosti, jeˇz tato funkce nab´ız´ı jsou opravdu ˇsirok´e, takˇze pro podrobnosti odkazujeme sp´ıˇse na help. Nejˇcastˇejˇs´ı form´atovac´ı sekvence jsou n´asleduj´ıc´ı: • %d: cel´e ˇc´ıslo • %e: exponenci´aln´ı notace z´apisu desetinn´eho ˇc´ısla • %f: fixn´ı z´apis desetinn´eho ˇc´ısla • %g: obdobnˇe jako %e nebo %f, ale netisknou se zbyteˇcn´e nuly • %s: ˇretˇezec U desetinn´ ych ˇc´ısel m˚ uˇzeme ovlivnit na kolik m´ıst nebo platn´ ych ˇc´ıslic chceme v´ ystup naform´atovat. Vˇse nejl´epe vysvˇetl´ı pˇr´ıklad pˇrevzat´ y pˇr´ımo z helpu Matlabu: Pˇr´ıkaz
V´ ystup
sprintf(’%0.5g’, (1 + sqrt(5))/2) sprintf(’%0.5g’, 1/eps) sprintf(’%15.5f’, 1/eps) sprintf(’%d’, round(pi)) sprintf(’%s’, ’hello’) sprintf(’The array is %dx%d.’, 2, 3)
1.618 4.5036e+15 4503599627370496.00000 3 hello The array is 2x3
Pozn´ amka 5.3 Uˇziteˇcn´e ˇcasto b´ yv´a pouˇzit´ı \n, kter´e zp˚ usob´ı zalomen´ı v´ ystupu na nov´ y ˇra´dek: >> sprintf(’%1d\n%2d\n%3d\n%4d\n%5d’, 1, 2, 3, 4, 5) ans = 1 2 3 4 5
´ RET ˇ EZCE ˇ 5 ZNAKOVE
40
5.3
Pole ˇ retˇ ezc˚ u
ˇ ezce lze ukl´adat tak´e do matic. Podm´ınkou vˇsak je, ˇze vˇsechny ˇretˇezce musej´ı Retˇ m´ıt stejnou d´elku. Kdyˇz se pokus´ıme o n´asleduj´ıc´ı konstrukci, obdrˇz´ıme chybov´e hl´aˇsen´ı: >> jmena = [’Josef’; ’Petr’; ’Viktor’] ??? Error using ==> vertcat CAT arguments dimensions are not consistent. N´apravu sjedn´ame bud’ tak, ˇze ruˇcnˇe dopln´ıme mezery tak, aby mˇely vˇsechny ˇretˇezce stejnou d´elku, anebo, coˇz je vhodnˇejˇs´ı, pouˇzijeme k tomu urˇcenou funkci char, kter´a pˇrid´a mezery na konce kratˇs´ıch ˇretˇezc˚ u, aby vznikl´a matice mˇela ve vˇsech ˇra´dc´ıch stejn´ y poˇcet sloupc˚ u: >> jmena = char(’Josef’, ’Petr’, ’Viktor’) jmena = Josef Petr Viktor
Pozn´ amka 5.4 D´ıky funkci strjust nemus´ı b´ yt texty v matici nutnˇe zarovn´any doleva. Pˇr´ıpustn´ ymi parametry jsou left, center a right: >> strjust(jmena, ’right’) ans = Josef Petr Viktor
Pokud n´am z nˇejak´eho d˚ uvodu poˇzadavek na stejnou d´elku ˇretˇezc˚ u nevyhovuje, m˚ uˇzeme m´ısto matice pouˇz´ıt tzv. pole bunˇek (angl. cell array). Rozd´ıl oproti matic´ım je vesmˇes jen v typu z´avorek – u pole bunˇek se pouˇz´ıvaj´ı sloˇzen´e: >> M = {’Josef’, ’Tvrdik’; ’Petr’, ’Bujok’; ’Viktor’, ’Pavliska’} M = ’Josef’ ’Tvrdik’ ’Petr’ ’Bujok’ ’Viktor’ ’Pavliska’
5.4 Porovn´av´an´ı a vyhled´av´an´ı ˇretˇezc˚ u
5.4
41
Porovn´ av´ an´ı a vyhled´ av´ an´ı ˇ retˇ ezc˚ u
Chceme-li porovnat dva ˇretˇezce, zda jsou shodn´e, nen´ı relaˇcn´ı oper´ator ==“ na m´ıstˇe, ” pokud n´as nezaj´ım´a shodnost jednotliv´ ych znak˚ u, kter´a nav´ıc funguje jen pro stejnˇe dlouh´e ˇretˇezce jako u ˇc´ıseln´ ych vektor˚ u: >> ’Jana’ == ’Dana’ ans = 0 1 1 1 >> ’Ano’ == ’Ne’ ??? Error using ==> eq Matrix dimensions must agree. Pro srovn´av´an´ı podle obvykl´ ych pˇredstav je k dispozici funkce strcmp: >> strcmp(’Jana’, ’Dana’) ans = 0 Pomoc´ı funkce strfind(text, vzor) slouˇz´ı k vyhled´av´an´ı podˇretˇezce v jin´em ˇretˇezci. V´ ysledkem je vektor vˇsech vyhovuj´ıc´ıch pozic´ı. >> strfind(’krabice hranice slepice’, ’ice’) ans = 5 13 21 Pozn´ amka 5.5 Je moˇzno tak´e pouˇz´ıt funkci findstr(s1, s2), kter´a se liˇs´ı od pˇredchoz´ı pouze v tom, ˇze u n´ı nez´aleˇz´ı na poˇrad´ı parametr˚ u s1 a s2 a vˇzdy prov´ad´ı vyhled´av´an´ı kratˇs´ıho ˇretˇezce v delˇs´ım (v pˇr´ıpadˇe, ˇze maj´ı ˇretˇezce stejnou d´elku, tak se v podstatˇe jedn´a o porovn´an´ı dvou ˇretˇezc˚ u).
Pˇ r´ıklad 5.1 Nˇekdy je vˇsak pouˇzit´ı oper´atoru ==, resp. ∼= ve spojitosti s ˇretˇezci elegantn´ı. Napˇr´ıklad pro odstranˇen´ı mezer z ˇretˇezce m˚ uˇzeme pouˇz´ıt n´asleduj´ıc´ı konstrukci: >> s = ’retezec s mezerami’; >> neprazdne_znaky = (s ~= ’ ’); >> s(neprazdne_znaky)
´ RET ˇ EZCE ˇ 5 ZNAKOVE
42
ans = retezecsmezerami Promˇenn´a neprazdne_znaky je v tomto pˇr´ıkladˇe logick´ y vektor obsahuj´ıc´ı jedniˇcky v m´ıstech, kde se v ˇretˇezci s vyskytuj´ı znaky r˚ uzn´e od mezery.
Nahrazov´ an´ı podˇ retˇ ezc˚ u: Funkce strrep odpov´ıdaj´ıc´ı vzorky v zadan´em ˇretˇezci nahrad´ı jin´ ym zadan´ ym ˇretˇezcem: >> strrep(’zena Bozena neni zenata’, ’zena’, ’spor’) ans = spor Bospor neni sporta Funkc´ı pracuj´ıc´ıch s ˇretˇezci je jeˇstˇe v´ıce, ale nebudeme je vˇsechny dopodrobna rozeb´ırat, takˇze alespoˇ n v rychlosti zm´ın´ıme: • lower, upper – mˇen´ı velikost p´ısmen • dec2base, base2dec – pˇrevod mezi mezi des´ıtkovou a zvolenou soustavou • ischar – d´av´a odpovˇed, zda zadan´ y parametr je skuteˇcnˇe ˇretˇezec • isletter, isstrprop, isspace apod. – vrac´ı matici odpovˇed´ı, zda dan´e znaky v ˇretˇezci jsou p´ısmena, ˇc´ısla, pr´azdn´e znaky, . . ., podobn´ ych funkc´ı je cel´a ˇrada. V´ıce se m˚ uˇzete dozvˇedˇet z n´apovˇedy k jednotliv´ ym funkc´ım – jejich pˇrehled z´ısk´ate pˇr´ıkazem: >> help strfun
5.4 Porovn´av´an´ı a vyhled´av´an´ı ˇretˇezc˚ u
43
Shrnut´ı: - Vytv´aˇren´ı ˇretˇezc˚ u a vnitˇrn´ı reprezentace v Matlabu - Pˇr´ıstup k jednotliv´ ym znak˚ um ˇretˇezce - Konverze ˇc´ıseln´ ych hodnot na ˇretˇezce a naopak ˇ ezce v matici a v poli bunˇek - Retˇ - Porovn´av´an´ı ˇretˇezc˚ u - Vyhled´av´an´ı v ˇretˇezc´ıch - N´ahrada v ˇretˇezc´ıch
Kontroln´ı ot´ azky: 1. Vytvoˇrte pˇr´ıkaz, kter´ ym zjist´ıte index posledn´ıho v´ yskytu ˇretˇezce v promˇenn´e sub v textov´e promˇenn´e txt. 2. Vytvoˇrte pˇr´ıkaz, kter´ y z pln´eho jm´ena souboru (vˇcetnˇe absolutn´ı cesty a pˇr´ıpony) vyp´ıˇse pouze vlastn´ı jm´eno souboru. Napˇr. pro vstup C:\temp\readme.txt vyp´ıˇse pouze readme. 3. Pˇredpokl´adejte, ˇze v poli bunˇek M m´ate uloˇzeny ˇretˇezce. Vytvoˇrte pˇr´ıkaz, jehoˇz v´ ysledkem bude matice jedniˇcek a nul koresponduj´ıc´ı s porovn´an´ım jednotliv´ ych ˇretˇezc˚ u s ˇretˇezcem ’yes’.
´ ´I V MATLABU 6 PROGRAMOVAN
44
6
Programov´ an´ı v Matlabu
Pr˚ uvodce studiem: C´ılem t´eto kapitoly je sezn´amit se se z´akladn´ımi moˇznostmi z´apisu algoritm˚ u v Matlabu. Poˇc´ıtejte asi se tˇremi aˇz ˇsesti hodinami studia, v z´avislosti na tom, jak jste zdatn´ı v algoritmizaci a jak zkuˇsen´ı v programov´an´ı v jin´ ych programovac´ıch jazyc´ıch.
6.1
ˇ ıdic´ı pˇ R´ r´ıkazy
V Matlabu m´ame k dispozici bˇeˇzn´e pˇr´ıkazy pro z´apis algoritmu vˇcetnˇe tzv. ˇr´ıdic´ıch struktur jako je vˇetven´ı a cyklus, zn´am´e z jin´ ych programovac´ıch jazyk˚ u. Sekvence pˇr´ıkaz˚ u se zap´ıˇse bud’ jako posloupnost ˇra´dk˚ u, kdy na kaˇzd´em ˇr´adku je jeden pˇr´ıkaz nebo v´ıce pˇr´ıkaz˚ u na jednom ˇra´dku staˇc´ı oddˇelit stˇredn´ıkem. Je-li pˇr´ıkaz ukonˇcen stˇredn´ıkem, vyhodnocen´ y v´ yraz vyhodnocen´ y v tomto pˇr´ıkazu se nevypisuje na obrazovku. Pokud m´a z´apis pˇr´ıkazu pokraˇcovat na dalˇs´ım ˇra´dku, je pˇredch´azen tˇremi teˇckami na konci pˇredchoz´ıho ˇr´adku. Identifik´ator muˇze m´ıt aˇz 31 alfanumerick´ ych znak˚ u nebo podtrˇz´ıtek, zaˇc´ın´a p´ısmenem, velk´a a mal´a p´ısmena se rozliˇsuj´ı. Jako identifik´atory neuˇz´ıvejte Matlabem uˇz´ıvan´e n´azvy konstant, promˇenn´ ych a funkc´ı jako napˇr. pi, eps, ans, Inf, NaN, realmax, realmin (a tak´e i, j, pokud budete poˇc´ıtat s komplexn´ımi ˇc´ısly), nebot’ t´ım byste si pˇrepsali jejich nastaven´e hodnoty. Vˇse za znakem procento (%) do konce ˇr´adku je koment´aˇr. Podm´ınˇen´ y pˇr´ıkazy m´a tvar if podminka1 prikaz1 elseif podminka2 prikaz2 else prikaz3 end ˇ asti elseif a else jsou nepovinn´e, podm´ınˇen´ C´ y pˇr´ıkaz m˚ uˇze b´ yt zaps´an i na jednom ˇra´dku. Pˇrep´ınaˇc m´a tvar switch(v´ yraz) case value1 prikaz1 case value2 prikaz2
ˇ ıdic´ı pˇr´ıkazy 6.1 R´
45
... ... ... case valuen prikazn otherwise nejaky prikaz ˇ ast otherwise je nepovinn´a. C´ Cykly lze zapsat bud’ jako while podminka prikaz end nebo for
identifik´ ator = vektor prikaz
end Vˇsude, kde je moˇzno zapsat pˇr´ıkaz, m˚ uˇze to b´ yt i sekvence v´ıce pˇr´ıkaz˚ u. Pˇ r´ıklad 6.1 V cyklu typu for probˇehne desetkr´at pˇriˇrazen´ı vektoru n´ahodn´ ych ˇc´ısel do i−t´eho ˇr´adku matice: for i = 1:10 P(i, :) = 2 + 3*rand(1, 5); end
Pˇ r´ıklad 6.2 V cyklu typu while probˇehne rozeb´ır´an´ı hromady, dokud hromada nen´ı menˇs´ı nebo rovna 1. Na obrazovku se vyp´ıˇse poˇcet proveden´ ych odbˇer˚ u. hromada = 10; poc = 0; while hromada > 1 hromada = hromada - rand(1); poc = poc + 1; end display(poc)
´ ´I V MATLABU 6 PROGRAMOVAN
46
6.2
M-soubory
Sekvence pˇr´ıkaz˚ u je moˇzn´e zapsat do textov´ ych soubor˚ u, jejichˇz jm´eno m´a pˇr´ıponu .m“. Celou sekvenci pˇr´ıkaz˚ u pak vyvol´ame jm´enem souboru bez pˇr´ıpony. Pokud tato ” sekvence nem´a ˇza´dn´e vstupn´ı parametry, ˇr´ık´ame takov´emu souboru skript (d´avka). Pˇri jej´ım vyvol´an´ı je pak sekvence pˇr´ıkaz˚ u postupnˇe interpretov´ana stejnˇe jako bychom ji znovu po jednotliv´ ych pˇr´ıkazech znovu zad´avali v pˇr´ıkazov´em oknˇe. T´ım si m˚ uˇzeme uˇsetˇrit ˇcas i naˇsi zbyteˇcnou pr´aci. Velmi uˇziteˇcn´ ym prostˇredkem je zapsat sekvenci pˇr´ıkaz˚ u jako funkci, tj. vytvoˇrit podprogram. Tak m´ame k dispozici postup pro modul´arn´ı strukturu program˚ u v Matlabu. Vytvoˇrenou funkci m˚ uˇzeme pak volat (spouˇstˇet) s r˚ uzn´ ymi hodnotami vstupn´ıch parametr˚ u. Syntaxi z´apisu funkce m˚ uˇzeme ve struˇcnosti vyj´adˇrit sch´ematem function[seznam vystupnich parametru]... = jmeno_funkce(seznam vstupnich parametru) ---- prikazy provedene pri volani funkce ---Pokud funkce vrac´ı jen jednu hodnotu (jednu promˇennou, m˚ uˇze to b´ yt ale i vektor nebo matice), v´ ystupn´ı parametr nemus´ı b´ yt v hranat´ ych z´avork´ach. Promˇenn´e zaveden´e uvnitˇr funkce jsou lok´aln´ı, takˇze nepˇrepisuj´ı hodnoty stejnˇe nazvan´ ych promˇenn´ ych ve volaj´ıc´ım modulu a po skonˇcen´ı bˇehu funkce lok´aln´ı promˇenn´e zmiz´ı z pamˇeti poˇc´ıtaˇce a m´ısto, kter´e v pamˇeti zab´ırali, uvoln´ı. Zvolen´e jm´eno funkce mus´ı b´ yt shodn´e se jm´enem souboru, ve kter´em je zdrojov´ y text funkce uloˇzen (bez pˇr´ıpony .m“). Uˇz´ıv´an´ı funkc´ı je i v´ yhodn´e s ohledem na d´elku v´ ypoˇctu, nebot’ pˇri ” prvn´ım vol´an´ı probˇehne kompilace funkce a dalˇs´ı vol´an´ı je rychlejˇs´ı neˇz opakovan´a interpretace jednotliv´ ych pˇr´ıkaz˚ u. Pˇ r´ıklad 6.3 Jako pˇr´ıklad funkce si uk´aˇzeme n´ahodn´ y v´ ybˇer k hodnot (bez opakov´an´ı) z mnoˇziny {1, 2, . . . , N }, k ≤ N . Pokud by bylo N = 49 a k = 7, je to procedura losov´an´ı Sportky. Pˇr´ıklad peˇclivˇe prostudujte, nebot’ ilustruje nˇekolik uˇziteˇcn´ ych operac´ı s vektory v Matlabu. % random sample, k of N without repetition % function result = nahvyb(N, k) opora = 1:N; % N micku je v osudi nahv = []; % zadny micek neni zatim vytazen for i = 1:k index = 1 + fix(rand(1) * length(opora)); % vybran micek nahv(end+1) = opora(index); % uz je vytazen
6.2 M-soubory
opora(index) = []; end result = nahv;
47
% v osudi vytazeny micek zrusit
Uveden´ y zp˚ usob implementace n´ahodn´eho v´ ybˇeru je jen jedn´ım z mnoha moˇzn´ ych. Je to vlastnˇe velmi pˇr´ımoˇcar´ y model fyzick´eho losov´an´ı z osud´ı. Pˇ r´ıklad 6.4 Jin´ y zp˚ usob implementace m˚ uˇze vyuˇz´ıt funkci randperm. Pak je z´apis algoritmu jeˇstˇe kratˇs´ı: % random sample, k of N without repetition % function result = nahvybperm(N, k) pom = randperm(N); % utvor nahodnou permutaci cisel 1:N result = pom(1:k); % vyber k prvnich
Nyn´ı m˚ uˇzeme porovnat, kter´ y z tˇechto dvou algoritm˚ u je rychlejˇs´ı. Pro testov´an´ı si nap´ıˇseme jednoduch´ y skript. N = % sem budeme pri spousteni zadavat hodnoty, napr. 49 nebo 200 k = % sem budeme pri spousteni zadavat hodnoty, napr. 7 nebo 3 opak = 10000; tic for ii = 1:opak pom = nahvyb(N, k); end toc tic for ii = 1:opak pom = nahvybperm(N, k); end toc Na obrazovce se pak objev´ı tyto v´ ysledky: N = 49 k = 7
48
´ ´I V MATLABU 6 PROGRAMOVAN
Elapsed time is 0.756440 seconds. Elapsed time is 0.455496 seconds. N = 200 k = 3 Elapsed time is 0.458998 seconds. Elapsed time is 0.797050 seconds. Vid´ıme, ˇze pro vˇetˇs´ı k a menˇs´ı N je rychlejˇs´ı algoritmus nahvybperm, zat´ımco pro menˇs´ı k a vˇetˇs´ı N je tomu naopak. Pˇ r´ıklad 6.5 Nˇekdy potˇrebujeme n´ahodn´ y v´ ybˇer s vylouˇcen´ım nˇekter´ ych prvk˚ u, tzn. ˇze tyto prvky se v nˇem nesm´ı objevit. Toho m˚ uˇzeme snadno dos´ahnout malou modifikac´ı funkce nahvyb: % random sample, k of N without repetition, % numbers given in vector expt are not included % function vyb = nahvyb_expt(N, k, expt); opora = 1:N; if nargin == 3 % pokud zadame jen N a k, funguje jako nahvyb opora(expt) = []; % pred losovanim vyjmeme zakazane micky end vyb = zeros(1, k); % zabereme misto pro vsech k micku for i=1:k index = 1 + fix(rand(1) * length(opora)); vyb(i) = opora(index); opora(index) = []; end
Pokud bychom chtˇeli naprogramovat takov´ y v´ ybˇer s vylouˇcen´ım nˇekter´ ych prvk˚ u modifikac´ı funkce nahvybperm, takov´a modifikace by mohla vypadat tˇreba takto: Pˇ r´ıklad 6.6 % random sample, k of N without repetition, % numbers given in vector expt are not included %
6.2 M-soubory
49
function vyb = nahvybperm_expt(N, k, expt) vyb = randperm(N); if nargin == 3 zrus = zeros(1, length(expt)); for ii = 1:length(expt) zrus(ii) = find(vyb == expt(ii)); end vyb(zrus) = []; end vyb = vyb(1:k);
Pˇri vol´an´ı funkce nemus´ı b´ yt vˇzdy zad´an pln´ y poˇcet vstupn´ıch i v´ ystupn´ıch parametr˚ u. Pro oˇsetˇren´ı takov´eho vol´an´ı jsou urˇceny funkce nargin a nargout (bez parametr˚ u), kter´e vracej´ı aktu´aln´ı poˇcet pˇr´ısluˇsn´ ych parametr˚ u, viz pˇredchoz´ı uk´azka. Pokud programujete nˇejakou funkci, vˇzdy si dobˇre rozvaˇzte, zda dovol´ıte ne´ upln´e zad´an´ı vstupn´ıch parametr˚ u. Pokud to nen´ı pro uˇzivatele nutn´e nebo extr´emnˇe v´ yhodn´e, tak si nekomplikujte ˇreˇsen´ı a vyˇzadujte pˇri vol´an´ı funkce vˇsechny vstupn´ı parametry. Nˇekdy potˇrebujeme, abychom mohli jako vstupn´ı parametr pro nˇejak´ y algoritmus zadat funkci, kter´a m´a b´ yt v tomto algoritmu pouˇzita. Napˇr. m´ame naprogramovan´ y algoritmus (v Matlabu jako podprogram function) hledaj´ıc´ı minimum funkce, v tomto algoritmu potˇrebujeme minimalizovanou funkci vyhodnocovat, a pˇritom chceme, abychom takov´ y podprogram mohli vyuˇz´ıvat nejen pro jednu pevnˇe danou funkci, ale abychom poˇzadovanou funkci mohli zadat. K tomu n´am v Matlabu slouˇz´ı funkce feval, jej´ımiˇz vstupn´ımi parametry jsou jm´eno funkce a hodnota argumentu funkce, v´ ystupem je pak funkˇcn´ı hodnota zadan´e funkce v zadan´em bodu. Pˇr´ıkazem y = feval(fnname, x);
vyhodnot´ıme v bodˇe x tu funkci, jej´ıˇz jm´eno je zad´ano. Jm´eno funkce fnname m˚ uˇze b´ yt zad´ano jako ˇretˇezec se jm´enem funkce nebo nebo jako tzv. handle, coˇz je jm´eno funkce uveden´e znakem @. Samozˇrejmˇe funkce tohoto jm´ena mus´ı b´ yt dostupn´a, napˇr. jako m-soubor nebo jako vestavˇen´a funkce Matlabu. Pˇ r´ıklad 6.7 Vol´an´ı funkce feval uk´aˇzeme v jednoduch´em pˇr´ıkladu. M´ame naprogramovanou funkci (uloˇzenou v m-souboru, kter´a m˚ uˇze b´ yt poˇzadovanou alternativou ke standardn´ımu vyhodnoceni druh´e odmocniny:
´ ´I V MATLABU 6 PROGRAMOVAN
50
function y = mojeodmocnina(x) % % druhou odmocninu pocita funkce sqrt, % pokud je argument zaporny, % tak vysledek je komplexni cislo % % mojeodmocnina bude pro x > 0 vracet hodnotu NaN % if x >= 0 y = sqrt(x); else y = NaN; end Pak v pˇr´ıkazu m˚ uˇzeme specifikac´ı funkce zadat, jakou verzi v´ ypoˇctu odmocniny si pˇrejeme: >> y = feval(’sqrt’, -25) y = 0 + 5.0000i >> y = feval(@mojeodmocnina,-25) y = NaN
6.3
Doporuˇ cen´ı pro vhodn´ y v´ ybˇ er pˇ r´ıkaz˚ u
Pˇri z´apisu algoritm˚ u v Matlabu se vyplat´ı uvaˇzovat vektorovˇe“, nebot’ ˇradu ope” rac´ı je moˇzno v Matlabu zapsat efektivnˇeji neˇz uˇzit´ım postup˚ u zn´am´ ych z jazyk˚ u nepodporuj´ıc´ıch vektorov´e a maticov´e operace (napˇr. Pascal nebo C). Pˇredevˇs´ım je nutno velmi uv´aˇzlivˇe uˇz´ıvat cykl˚ u, zejm´ena vnoˇren´ ych. R˚ uznou ˇcasovou n´aroˇcnost ukazuj´ı n´asleduj´ıc´ı pˇr´ıklady v´ ypoˇctu souˇctu druh´ ych mocnin prvk˚ u vektoru a. ˇ Pˇ r´ıklad 6.8 Casovˇ e nejn´aroˇcnˇejˇs´ı je klasick´ y postup“ naˇc´ıt´an´ı druh´ ych mocnin ” jednotliv´ ych prvk˚ u v cyklu: N = 10000 a = rand(50, 1) tic for i = 1:N
6.3 Doporuˇcen´ı pro vhodn´ y v´ ybˇer pˇr´ıkaz˚ u
51
s = 0; for j = 1:length(a) s = s + a(j)^2; end end toc Elapsed time is 1.2700 Vyuˇzit´ım aritmetick´e operace pro vˇsechny prvky vektoru (zde a .* a nebo a.^2) dos´ahneme t´emˇeˇr osmin´asobn´eho zkr´acen´ı potˇrebn´eho ˇcasu: tic for i = 1:N s = sum(a .* a); end toc Elapsed time is 0.1600 A vyuˇzijeme-li skal´arn´ı souˇcin, potˇrebn´ y ˇcas jeˇstˇe o trochu zkr´at´ıme: tic for i = 1:N s = a’ * a; end toc Elapsed time is 0.1100
Pˇ r´ıklad 6.9 V tomto pˇr´ıkladu porovn´ame ˇcasovou n´aroˇcnost dynamick´e a statick´e alokace pamˇeti. Prohl´ednˇeme si zdrojov´e texty funkc´ı nahvyb a nahvyb_expt. V prvn´ım pˇr´ıpadˇe se pamˇet’ pro vylosovan´e m´ıˇcky obsazuje dynamicky vˇzdy po vylosovan´ı kaˇzd´eho m´ıˇcku, ve druh´em pˇr´ıpadˇe staticky obsad´ıme pamˇet’ pro vˇsechny vylosovan´e m´ıˇcky na zaˇca´tku, dopˇredu v´ıme, pro vylosovan´e m´ıˇcky budeme potˇrebovat vektor d´elky k. Pro ˇcasov´e porovn´an´ı si nap´ıˇseme n´asleduj´ıc´ı skript: opak = 1000; N = 500; k = 100; tic for ii = 1:opak
´ ´I V MATLABU 6 PROGRAMOVAN
52
v1 = nahvyb(N, k); end toc tic for ii = 1:opak v1 = nahvyb_expt(N, k); end toc Po spuˇstˇen´ı skriptu dostaneme n´asleduj´ıc´ı v´ ysledky. Elapsed time is 1.343568 seconds. Elapsed time is 1.007942 seconds. Vid´ıme, ˇze statick´e alokace v tomto pˇr´ıpadˇe vede k zhruba o tˇretinu menˇs´ım ˇcasov´ ym n´arok˚ um.
Shrnut´ı: ˇ ıdic´ı struktury v Matlabu (vˇetven´ı, cykly, pˇrep´ınaˇc) - R´ - Skripty a funkce v Matlabu, vstupn´ı a v´ ystupn´ı parametry funkc´ı - Lok´aln´ı promˇenn´e - Vyuˇzit´ı vektorov´ ych a maticov´ ych operac´ı - Statick´a a dynamick´a alokace pamˇeti poˇc´ıtaˇce
Kontroln´ı ot´ azky: 1. Kdy pouˇz´ıt skript, kdy funkci? 2. Jak budete generovat n´ahodn´e ˇc´ıslo z diskr´etn´ıho rovnomˇern´eho rozdˇelen´ı z intervalu [1, 100]? 3. Kdy m˚ uˇze b´ yt jm´eno funkce vstupn´ım parametrem jin´e funkce? 4. M˚ uˇzete generovat n´ahodn´ y v´ ybˇer k hodnot z [1, 2, . . . , N ] pomoc´ı funkce randperm jin´ ym zp˚ usobem, neˇz je uvedeno v textu? Zkuste navrhnout moˇzn´e ˇreˇsen´ı.
53
7
3D grafika
Pr˚ uvodce studiem: C´ılem t´eto kapitoly je pochopit princip pr´ace s 3D grafikou v Matlabu, zejm´ena pak r˚ uzn´e moˇznosti v´ ypoˇctu hodnot Z-souˇradnic a interaktivn´ı editace 3D graf˚ u. Pro pochopen´ı l´atky a zvl´adnut´ı cviˇcen´ı si vyhrad’te alespoˇ n ˇctyˇri hodiny.
7.1
Jednoduch´ eˇ c´ arov´ e grafy
Nejjednoduˇsˇs´ı pˇr´ıpad vykreslov´an´ı 3D graf˚ u v Matlabu je v pˇr´ıpadˇe, kdy m´ame tˇri vektory promˇenn´ ych stejn´ ych rozmˇer˚ u. V takov´em pˇr´ıpadˇe se jedn´a o tzv. ˇc´arov´e grafy a vytv´aˇr´ı se pomoci pˇr´ıkazu plot3. Pˇ r´ıklad 7.1 Vytvoˇr´ıme vektor ekvidistantnˇe rozloˇzen´ ych hodnot x a nakresl´ıme ˇc´arov´ y graf, kde souˇradnice y a z jsou dopoˇcteny podle zadan´ ych funkc´ı. >> x = -pi:pi/60:pi; >> plot3(x, sin(x), 2 .* cos(x)); Grafem je pak n´asleduj´ıc´ı kˇrivka v 3D prostoru:
2 1 0 −1 4
−2 1
2 0.5
0 0 −2
−0.5 −1
7.2
−4
Kreslen´ı sloˇ zitˇ ejˇ s´ıch 3D graf˚ u
Kreslen´ı graf˚ u sloˇzitˇejˇs´ıch funkc´ı v 3D si uk´aˇzeme na jednoduch´ ych pˇr´ıkladech.
54
7 3D GRAFIKA
Pˇ r´ıklad 7.2 Chceme nakreslit graf funkce f (x, y) = exp(−(x2 + y 2 )) pro hodnoty x ∈ [−1, 2; 1.2] a y ∈ [−2; 2]. Nejdˇr´ıve vytvoˇr´ıme vektory hodnot x-ov´e i y-ov´e souˇradnice pro s´ıt’ vhodn´e hustoty: x = -1.2:0.05:1.2; y = -2:0.1:2; Pak pˇr´ıkazem meshgrid vytvoˇr´ıme matice X a Y typu (length(y) × length(x)), v tomto pˇr´ıpadˇe tedy typu (41 × 49), ve kter´ ych odpov´ıdaj´ıc´ı prvky pˇredstavuj´ı vˇsechny dvojice hodnot prvk˚ u vektor˚ u x a y. Pak uˇz jen vyhodnot´ıme z-tovou souˇradnici (matice Z typu (41 × 49)) a pˇr´ıkazem mesh nakresl´ıme tzv. dr´atov´y graf do okna Figure. [X Y] = meshgrid(x, y); Z = exp(-X.^2 - Y.^2); mesh(X, Y, Z); % Vykresleni stejneho grafu dosahneme % zadanim prikazu: ’mesh(x, y, Z)’
1 0.8 0.6 0.4 0.2 0 2 1
2 1
0
0
−1
−1 −2
−2
O trochu sloˇzitˇejˇs´ı je nakreslen´ı trojrozmˇern´eho grafu funkce tehdy, kdyˇz matici z-tov´ ych souˇradnic nem˚ uˇzeme spoˇc´ıtat pˇr´ımo, ale m´ame jen funkci vyhodnocuj´ıc´ı z-tovou souˇradnici v dan´em bodˇe zadan´em souˇradnicemi x a y. Pˇ r´ıklad 7.3 Chceme nakreslit graf funkce, jej´ıˇz hodnotu um´ıme spoˇc´ıtat jen v jed-
7.2 Kreslen´ı sloˇzitˇejˇs´ıch 3D graf˚ u
55
nom zadan´em bodu. Vytvoˇr´ıme vektory x a y ekvidistantnˇe rozloˇzen´ ych hodnot a k nim s´ıt’ souˇradnic. Dopoˇcteme souˇradnice vektoru z a vykresl´ıme dr´atov´ y graf s isoliniemi dan´e funkce. function z = ackley(x) % Vyhodnocujeme funkci v bodA, zadan´ em vektorem x d = length(x); a = -20 * exp(-0.02 * sqrt(sum(x .* x))); b = -exp(sum(cos(2 * pi * ones(1, d) .* x))/d); z = a + b + 20 + exp(1); S´ıt’ souˇradnic v rovinˇe xy pak vytvoˇr´ıme podobnˇe jako v pˇredchoz´ım pˇr´ıkladu. >> x = -3:0.05:3; >> y = -3:0.05:3; >> [X Y] = meshgrid(x, y); Vypoˇc´ıst hodnoty funkce um´ıme pouze v bodech zadan´ ych jako dvouprvkov´ y vektor. Pak nezb´ yv´a neˇz spoˇc´ıtat matici Z po jednotliv´ ych prvc´ıch for i = 1:length(y) for j = 1:length(x) Z(i, j) = ackley([X(i, j) Y(i, j)]); end end V´ ypoˇcet je moˇzno trochu zrychlit, kdyˇz z matic X a Y vytvoˇr´ıme vektory, v´ ysledn´ y vektor zz pˇredem inicializujeme na poˇzadovanou d´elku, aby uvnitˇr cyklu nebylo jeho prvky alokovat dynamicky aˇz v pr˚ ubˇehu v´ ypoˇctu a pak z nˇeho pˇr´ıkazem reshape vytvoˇr´ıme matici poˇzadovanou pro kreslen´ı 3D grafu: xx = X(:); yy = Y(:); zz = zeros(length(xx), 1); for i = 1:length(xx) zz(i) = ackley([xx(i) yy(i)]); end Z = reshape(zz, length(y), length(x)); Pak teprve m˚ uˇzeme nakreslit graf n´asleduj´ıc´ımi pˇr´ıkazy:
56
7 3D GRAFIKA
meshc(X, Y, Z); axis([-3 3 -3 3 -1 4]); xlabel(’x’); ylabel(’y’); zlabel(’z’); Graf Ackleyho funkce po pˇredchoz´ıch pˇr´ıkazech vypad´a, jak ukazuje n´asleduj´ıc´ı obr´azek:
4 3
f(x)
2 1 0 −1 2 0 −2 x2
7.3
−3
−2
0
−1
1
2
3
x1
Editace 3D grafu
Stejnˇe jako u 2D grafiky, i zde je moˇzn´e vytvoˇren´e grafy editovat. V grafick´em oknˇe Figure m´ame mnoho dostupn´ ych n´astroj˚ u pro interaktivn´ı u ´pravy v´ ysledn´eho obr´azku (napˇr. popis a editaci os grafu, vkl´ad´an´ı text˚ u a grafick´ ych symbol˚ u, rotace obr´azku, uloˇzen´ı do souboru, export do jin´eho form´atu atd). Pˇ r´ıklad 7.4 Nakresl´ıme dr´atov´ y graf funkce f (x, y) = exp(−x2 − y 2 ). >> x = -1.2:0.05:1.2; >> y = -2:0.1:2; >> [X Y] = meshgrid(x, y);
7.3 Editace 3D grafu
57
>> Z = exp(-X.^2 - Y.^2); >> mesh(X, Y, Z); % popisky jednolivych os grafu >> xlabel(’X’); >> ylabel(’Y’); >> zlabel(’Z’); % nastaven´ ı meznich hodnot jednotlivzch os v porad´ ı: % ([xmin xmax ymin ymax zmin zmax]) >> axis([-2 2 -2 2 0 1]); % vlozeni legendy do grafu >> legend(’Z = exp(-X.^2 - Y.^2)’); % vlozeni nazvu grafu funkce >> title(’Graf funkce Z = exp(-X.^2 - Y.^2)’);
Graf funkce Z=exp(−X.2−Y.2)
1
0.8
Z
0.6
0.4
0.2
0 2 2
1 1
0 0 −1 Y
−1 −2
−2
X
Okno pro interaktivn´ı editaci grafu je na n´asleduj´ıc´ım obr´azku v jehoˇz prav´e ˇca´sti jsou vysvˇetleny popisy nejpouˇz´ıvanˇejˇs´ıch funkc´ı editace grafu nab´ıdky Insert.
58
7 3D GRAFIKA
Po aplikaci nˇekter´ ych funkc´ı interaktivn´ı editace m˚ uˇze graf vypadat napˇr. takto:
1
Graf funkce
0.9 1
0.8
X: 0 Y: 0 Z: 1
0.8
0.7 0.6
Z
0.6 0.4
0.5
Z=exp(−X.2−Y.2)
0.4 0.2
0.3
0 2
2 0
0 −2 Y
−2
0.2 0.1
X
Editace grafu v Matlabu lze prov´adˇet jak pomoc´ı pˇr´ıkaz˚ u, tak interaktivnˇe v grafick´em oknˇe Figure. Uˇziteˇcnou interaktivn´ı editac´ı grafu je rotace grafu. Rotaci grafu si uk´aˇzeme v n´asleduj´ıc´ım pˇr´ıkladu. Pˇ r´ıklad 7.5 Vytvoˇr´ıme vektory x a y ekvidistantnˇe rozloˇzen´ ych hodnot. Vykres-
7.3 Editace 3D grafu
59
l´ıme dr´atov´ y graf Schwefelovy funkce spolu s popisy a pak nakreslen´ y graf v oknˇe Figure interaktivnˇe rotujeme. Schwefelova funkce je definovan´a jako:
function y=schwefel(x) % Schwefel’s function, <-500, 500>, % glob. min f(x_star)~0, (for d < 80 0 <= f(x_star) < 1e-10), % x_star = [s, s, ..., s], s = 420.968746 d = length(x); sz = size(x); if sz(1) == 1 x = x’; end y = 418.9828872724338 * d - sum(x .* sin(sqrt(abs(x))));
Dopoˇcteme prvky s´ıtˇe souˇradnic t´eto funkce:
>> >> >> >>
x = -10:0.1:10; y = -10:0.1:10; [X Y] = meshgrid(x, y); for i = 1:length(y) for j = 1:length(x) Z(i, j) = schwefel([X(i, j) Y(i, j)]); end end
a n´asleduj´ıc´ımi pˇr´ıkazy pak vykresl´ıme jej´ı graf:
>> >> >> >> >>
mesh(X, Y, Z); title(’Graf Schwefelovy funkce’); xlabel(’x’); ylabel(’y’); zlabel(’z’);
60
7 3D GRAFIKA
Tento graf m˚ uˇzeme z v´ ychoz´ı polohy n´aslednˇe pomoci tlaˇc´ıtka Rotace 3D rotovat tak, abychom doc´ılili lepˇs´ı pohled na graf, jak ukazuj´ı n´asleduj´ıc´ı obr´azky:
Podrobnosti ponech´av´ame na ˇcten´aˇri, kter´ y m˚ uˇze potˇrebn´e informace z´ıskat v helpu, kde tak´e se dozv´ı i o dalˇs´ıch moˇznostech 3D grafiky v Matlabu.
7.4 Dalˇs´ı typy 3D graf˚ u
7.4
61
Dalˇ s´ı typy 3D graf˚ u
V n´asleduj´ıc´ıch pˇr´ıkladech jsou nakresleny r˚ uzn´e typy 3D graf˚ u Rastriginovy funkce, kter´a je definovan´a n´asledovnˇe.
function y = rastrig(x) % Rastrigin’s function, <-5.12, 5.12>, glob. min f(0) = 0 d = length(x); sz = size(x); if sz(1) == 1 x = x’; end y = 10*d + sum(x .* x - 10 * cos(2 * pi * x));
Nejprve vypoˇcteme s´ıt’ souˇradnic spoleˇcnou pro vˇsechny typy graf˚ u.
>> x = -3:0.05:3; >> y = -3:0.05:3; >> [X Y] = meshgrid(x, y); for i = 1:length(y) for j = 1:length(x) Z(i, j) = rastrig([X(i,j) Y(i,j)]); end end
Pˇ r´ıklad 7.6 Nakresl´ıme graf isolini´ı pˇr´ıkazem contour.
contour(X, Y, Z); xlabel(’x1’); ylabel(’x2’); zlabel(’f(x)’); title(’Graf isolinii rastriginovy funkce’);
62
7 3D GRAFIKA
Graf isolinií rastriginovy funkce
1
f(x)
0.5 0 −0.5 −1 3
3
2
2
1
1
0
0 −1
−1 −2
x2
−2 −3
x1
−3
Pˇ r´ıklad 7.7 Nakresl´ıme graf isoploch pˇr´ıkazem contourf. contourf(X, Y, Z); xlabel(’x1’); ylabel(’x2’); zlabel(’f(x)’); title(’Graf isoploch Rastriginovy funkce’);
Graf isoploch rastriginovy funkce
1
f(x)
0.5 0 −0.5 −1 3
3
2
2
1
1
0
0
−1
−1 −2
x2
−2 −3
−3
x1
7.4 Dalˇs´ı typy 3D graf˚ u
63
Pˇ r´ıklad 7.8 Nakresl´ıme dr´atov´y graf pˇr´ıkazem mesh.
mesh(X, Y, Z); xlabel(’x1’); ylabel(’x2’); zlabel(’f(x)’); title(’Dratovy graf Rastriginovy funkce’);
Drátový graf rastriginovy funkce
60 50
f(x)
40 30 20 10 0 4 2
4 2
0
0
−2 x2
−2 −4
−4
x1
Pˇ r´ıklad 7.9 Nakresl´ıme dr´atov´y graf s isoliniemi pˇr´ıkazem meshc.
meshc(X, Y, Z); xlabel(’x1’); ylabel(’x2’); zlabel(’f(x)’); title(’Dratovy graf Rastriginovy funkce s isoliniemi’);
64
7 3D GRAFIKA
Drátový graf rastriginovy funkce s isoliniemi
60 50
f(x)
40 30 20 10 0 4 2
4 2
0
0
−2
−2 −4
x2
−4
x1
Pˇ r´ıklad 7.10 Nakresl´ıme plastick´y graf pˇr´ıkazem surf. surf(X, Y, Z); xlabel(’x1’); ylabel(’x2’); zlabel(’f(x)’); title(’Plasticky graf Rastriginovy funkce’);
Plastický graf rastriginovy funkce
60 50
f(x)
40 30 20 10 0 4 2
4 2
0
0
−2 x2
−2 −4
−4
x1
7.4 Dalˇs´ı typy 3D graf˚ u
65
Pˇ r´ıklad 7.11 Nakresl´ıme plastick´y graf s isoliniemi pˇr´ıkazem surfc. surfc(X, Y, Z); xlabel(’x1’); ylabel(’x2’); zlabel(’f(x)’); title(’Plasticky graf Rastriginovy funkce s isoliniemi’); Plastický graf rastriginovy funkce s isoliniemi
60 50
f(x)
40 30 20 10 0 4 2
4 2
0
0
−2 x2
−2 −4
−4
x1
66
7 3D GRAFIKA
Shrnut´ı: - 3D ˇca´rov´ y graf. - Dopoˇcten´ı Z-ov´e sloˇzky souˇradnic grafu. - Interaktivn´ı editace a u ´prava 3D grafu. - Pr´ace s help pro ˇsirˇs´ı moˇznosti vytv´aˇren´ı 3D graf˚ u.
Kontroln´ı ot´ azky: 1. Kdy je moˇzn´e pouˇz´ıt vykreslov´an´ı 3D grafu pˇr´ıkazem plot3? Jak´e m´a tento pˇr´ıkaz omezen´ı? 2. Co prov´ad´ı pˇr´ıkaz meshgrid a kdy jej pouˇzijeme? 3. Kdy pro vykreslen´ı funkce pouˇzijeme pˇr´ıkaz plot3 a kdy pˇr´ıkaz mesh? 4. Jak´e jsou v´ yhody interaktivn´ı editace grafu a oproti pˇr´ıkazov´e a naopak? 5. Co umoˇzn ˇuje rotace 3D grafu?
67
8
Pr´ ace se soubory
Pr˚ uvodce studiem: C´ılem t´eto kapitoly je objasnit ˇcten´aˇri, jak v Matlabu efektivnˇe ukl´adat a zpˇetnˇe naˇc´ıtat data. D´ale je zde pops´an n´ızko´ urovˇ nov´ y pˇr´ıstup do souboru. Pro pochopen´ı a procviˇcen´ı t´ematu poˇc´ıtejte alespoˇ n se tˇremi hodinami studia.
Matlab umoˇzn ˇuje pr´aci s mnoha typy dat jako jsou ˇc´ıseln´e vektory a matice, textov´e soubory, tabulkov´e soubory, ale i r˚ uzn´e grafick´e objekty, objekty zvuku ˇci dokonce videa. V Matlabu m´ame ˇradu moˇznost´ı, jak importovat data ze soubor˚ u a exportovat data do soubor˚ u r˚ uzn´ ych form´at˚ u. Podrobnosti nalezneme v helpu pod hesly fileformats, iofun a odkazech na dalˇs´ı poloˇzky. Zde uvedeme jen nˇekter´e pˇr´ıklady pr´ace se soubory, kter´e n´am budou uˇziteˇcn´e pˇri pr´aci s Matlabem, pˇri naˇc´ıt´an´ı vstupn´ıch dat z textov´ ych soubor˚ u a pˇri ukl´ad´an´ı v´ ysledk˚ u do textov´e tabulky se sloupci s konstantn´ı ˇs´ıˇrkou.
8.1
Ukl´ ad´ an´ı a naˇ c´ıt´ an´ı promˇ enn´ ych, pr´ ace s workspace
Nejprve si uk´aˇzeme nejjednoduˇsˇs´ı zp˚ usob, jak v Matlabu ukl´adat promˇenn´e do bin´arn´ıho souboru a zpˇetnˇe je naˇc´ıst. Pˇ r´ıklad 8.1 Vytvoˇr´ıme skal´ar, vektor ekvidistantnˇe rozloˇzen´ ych hodnot a matici 5 × 5, kter´a m´a na hlavn´ı diagon´ale hodnoty z rovnomˇern´eho rozdˇelen´ı a na ostatn´ıch pozic´ıch nuly. Skal´ar a matici uloˇz´ıme do souboru s n´azvem ’Ulozeni.mat’. >> a = 1; b = -0.5:0.01:0.5; C = rand(5) .* eye(5); % Nasledujici prikaz ulozi promenne a a C % do souboru s nazvem Ulozeni.mat >> save(’Ulozeni.mat’, ’a’, ’C’); % Promenne ulozime stejne prikazem >> save Ulozeni.mat a C;
Uloˇzen´e promˇenn´e a a C do bin´arn´ıho souboru lze pak kdykoliv moˇzn´e do Matlabu naˇc´ıst.
´ 8 PRACE SE SOUBORY
68
Pˇ r´ıklad 8.2 Naˇcteme promˇenn´e ze souboru s n´azvem ’Ulozeni.mat’ do pracovn´ıho prostˇred´ı Matlab. Promˇenn´e s jejich podrobnostmi vyp´ıˇseme pˇr´ıkazem whos na obrazovku. >> load ’Ulozeni.mat’; >> whos -file ’Ulozeni.mat’ Name
Size
C a
5x5 1x1
Bytes 200 8
Class double array double array
Pˇr´ıkaz whos s parametrem -file a nazev_souboru vyp´ıˇse promˇenn´e uloˇzen´e v souboru nazev souboru. Pˇ r´ıklad 8.3 Matici (6 × 2) uloˇzenou v souboru, jehoˇz jm´eno je v ˇretˇezci (promˇenn´a) fdatname a soubor m´a n´asleduj´ıc´ı obsah 2.138E0 3.421E0 3.597E0 4.340E0 4.882E0 5.660E0
1.309E0 1.471E0 1.490E0 1.565E0 1.611E0 1.680E0
naˇcteme snadno do promˇenn´e (matice) X pˇr´ıkazem dlmread X = dlmread(fdatname, ’ ’);
Druh´ y parametr znamen´a specifikaci oddˇelovaˇce (delimiter) datov´ ych poloˇzek, v tomto pˇr´ıpadˇe je to mezera (alespoˇ n jedna mezera znamen´a konec ˇc´ıseln´e poloˇzky, u jin´ ych oddˇelovaˇc˚ u jako je tabul´ator nebo stˇredn´ık to je jinak, tam kaˇzd´ y v´ yskyt oddˇelovaˇce znamen´a novou poloˇzku). Podobnˇe snadno lze naˇc´ıtat data i z jin´ ych form´at˚ u, napˇr. tabulky z Excelu pˇr´ıkazem xlsread ap.
8.2
N´ızko´ urovˇ nov´ y pˇ r´ıstup do souboru
N´ızko´ urovˇ nov´ y pˇr´ıstup do souboru slouˇz´ı k nastaven´ı n´ami urˇcen´eho vzhledu a form´atov´an´ı souboru. Tento pˇr´ıstup umoˇzn ˇuje kombinovat r˚ uzn´e datov´e typy v jednom
8.2 N´ızko´ urovˇ nov´ y pˇr´ıstup do souboru
69
souboru. Pˇr´ıkaz n´ızko´ urovˇ nov´eho zapisov´an´ı do souboru m´a tvar fprintf(fid, ’form´ at_promˇ enn´ e’, n´ azev_promˇ enn´ e), nejprve je ovˇsem nutn´e zajistit otevˇren´ı existuj´ıc´ıho ˇci vytvoˇren´ı nov´eho souboru pˇr´ıkazem fopen, v obecn´em tvaru fid = fopen(’nazev_souboru’, ’parametr’); kde hodnota parametru specifikuje, jak´ ym zp˚ usobem m´a b´ yt soubor otevˇren: ’r’: otevˇre soubor pro ˇcten´ı (read) ’w’: otevˇre soubor pro z´apis (write) – neexistuj´ıc´ı se zaloˇz´ı, existuj´ıc´ı se pˇrep´ıˇse ’a’: otevˇre soubor pro pˇrips´an´ı (append) – neexistuj´ıc´ı se zaloˇz´ı, existuj´ıc´ı se rozˇs´ıˇr´ı K z´apisu jednotliv´ ych poloˇzek promˇenn´e v Matlabu do ˇr´adku souboru slouˇz´ı pˇr´ıkaz fprintf. Seznam poloˇzek, kter´e maj´ı b´ yt zaps´any, je pˇredch´azen specifikac´ı form´atu, posledn´ı pˇr´ıkaz ukonˇcuje ˇra´dek ve v´ ystupn´ım souboru. N´asleduj´ıc´ı pˇr´ıklady ukazuj´ı, jak form´atovat jednotliv´e typy dat. Jeden specifik´ator form´atu odpov´ıd´a jednomu typu dat, tedy jednomu sloupci dat ve v´ ysledn´em souboru. Pˇ r´ıklad 8.4 Z´apis dat do souboru. Seznam jednotliv´ ych promˇenn´ ych je pˇrech´azen stejn´ ym poˇctem specifik´ator˚ u form´atu. Do souboru s identifik´atorem fid zap´ıˇseme ˇra´dky s hodnotami promˇenn´ ymi mod_name, d, prvn´ı prvky z vektor˚ u a a b. Do t´ehoˇz ˇra´dku zap´ıˇseme promˇenn´e alfa a RSS a d´ale prvn´ıch d prvk˚ u z vektoru beta. fopen(’soub1’, ’w’); fprintf(fid, ’ %-10s %4.0f %11.3e %11.3e’, mod_name, d, a(1), b(1)); fprintf(fid, ’ %7.2f’ , alfa ); fprintf(fid, ’ %8.0f’ , evals); fprintf(fid, ’ %15.7e’, RSS); for i = 1:d fprintf(fid, ’ %14.5e’ , beta(i)); end fprintf(fid, ’%1s\n’, ’ ’);
Dalˇs´ı z´aznam (ˇra´dek) do souboru pak zap´ıˇseme vol´an´ım stejn´e sekvence pˇr´ıkaz˚ u, obvykle je tedy tato sekvence um´ıstˇena uvnitˇr nˇejak´eho cyklu. Na z´avˇer soubor zavˇreme pˇr´ıkazem fclose(fid). Pˇ r´ıklad 8.5 Vytvoˇr´ıme a zap´ıˇseme matici ˇc´ısel 1–15 rozmˇeru 3 × 5 do textov´eho souboru.
70
´ 8 PRACE SE SOUBORY
% Vytvoreni rady cisel >> x = 1:15; % Zmena rozmeru vektoru s cisly na matici >> A = reshape(x, 3, 5); A = 1 4 7 10 13 2 5 8 11 14 3 6 9 12 15 Matici pot´e zap´ıˇseme do souboru: >> fid = fopen(’matA.txt’, ’a’); >> fprintf(fid, ’%2d %2d %2d\n’, A); % Prvky matice At jsou cteny po sloupcich a zapisovany % do jednotlivych radku souboru, viz. nasledujici obrazek >> fclose(fid);
V´ yznam parametru form´atov´an´ı souboru je jednoduch´ y (%w.df ): w – definuje celkov´ y poˇcet znak˚ u, d – definuje poˇcet desetinn´ ych m´ıst, f – definuje formu v´ ystupu (f -float, d-decimal, e-exponential, s-string, c-character, aj.). Specifikaci form´atu z´apisu do souboru doplˇ nuj´ı nˇekter´e speci´aln´ı znaky: \n – pro pˇrechod na nov´ y ˇra´dek, \t – pro vloˇzen´ı tabul´atoru, \’ – pro vloˇzen´ı apostrofu, aj.
8.3 Naˇcten´ı dat z Excelu
71
Z dalˇs´ıch uˇziteˇcn´ ych funkc´ı pro efektivn´ı pr´aci se soubory uvedeme: fpos, kter´a vrac´ı aktu´aln´ı pozici indik´atoru v dan´em souboru, a fseek, kter´a pˇresouv´a indik´ator pozice v dan´em souboru s ohledem na parametr orientace (’bof’, ’cof’, ’eof’). Indik´ator je ukazatel (”kurzor”) aktu´aln´ı pozice (pro z´apis nebo ˇcten´ı) v souboru.
8.3
Naˇ cten´ı dat z Excelu
Matlab umoˇzn ˇuje pr´aci i se soubory nˇekter´ ych tabulkov´ ych procesor˚ u, jako je napˇr´ıklad Excel. K tomuto v Matlabu slouˇz´ı pˇr´ıkaz xlsread. Naˇcten´ı dat ze souboru Excelu demonstruje n´asleduj´ıc´ı pˇr´ıklad.
Pˇ r´ıklad 8.6 Naˇcteme ˇc´ıseln´a a textov´a data z Excelu do Matlabu tak, aby nedoˇslo ke ztr´atˇe ˇci znehodnocen´ı dat. Data ze souboru ’Data.xls’ naˇcteme do promˇenn´ ych ’cisla’ a ’texty’.
N´asleduj´ıc´ı pˇr´ıkaz v Matlabu naˇcte ˇc´ıseln´e hodnoty do promˇenn´e cisla a textov´e ˇretˇezce do promˇenn´e texty.
>> [cisla,texty] = xlsread(’data.xls’,-1)
´ 8 PRACE SE SOUBORY
72
Pomoc´ı parametru -1 pˇr´ıkazu xlsread v datech vybereme interaktivnˇe ˇc´ısla, kter´e chceme naˇc´ıst do Matlabu a potvrd´ıme tlaˇc´ıtkem OK. Data jsou naˇctena do promˇenn´ ych a vyps´ana na obrazovku: cisla = 8500 17000 26000 texty = ’Petr’ ’Viktor’ ’Josef’
9800 18000 16000
10500 19000 27000
’Bujok’ ’Pavliska’ ’Tvrdik’
Dalˇs´ı moˇznosti pr´ace s datov´ ymi soubory Excelu nalezne ˇcten´aˇr opˇet v Helpu. Uveden´e pˇr´ıklady jen ilustruj´ı z´akladn´ı moˇznosti pr´ace se soubory, o dalˇs´ıch operac´ıch se soubory vˇcetnˇe pr´ace s grafick´ ymi form´aty se potˇrebn´e informace naleznou v helpu. Shrnut´ı: - Matlab umoˇzn ˇuje snadn´ y import a export dat. Mimo to lze pˇr´ımo za bˇehu Matlabu ukl´adat a naˇc´ıtat promˇenn´e, pˇr´ıpadnˇe cel´e pracovn´ı prostˇred´ı. - Matlab umoˇzn ˇuje n´ızko´ urovˇ nov´ y pˇr´ıstup do souboru, kter´ y dovoluje podrobnˇejˇs´ı volby form´atov´an´ı dat.
8.3 Naˇcten´ı dat z Excelu
73
- N´ızko´ urovˇ nov´ y pˇr´ıstup do souboru umoˇzn ˇuje ukl´ad´an´ı dat z r˚ uzn´ ych typ˚ u do jednoho souboru.
Kontroln´ı ot´ azky: 1. Jak´a je hlavn´ı v´ yhoda n´ızko´ urovˇ nov´eho pˇr´ıstupu do souboru? 2. Co se stane, jestliˇze neuzavˇreme soubor po uloˇzen´ı pˇr´ıkazem fclose? 3. Co je zapotˇreb´ı udˇelat, abychom byli schopni naˇc´ıst z Excelu ˇc´ıseln´e i textov´e hodnoty?
74
9 ALTERNATIVY MATLABU
9
Alternativy MATLABU
Pr˚ uvodce studiem: C´ılem t´eto kapitoly je sezn´amit ˇcten´aˇre s jin´ ymi softwarov´ ymi alternativami syst´emu Matlab, kter´e jsou s n´ım v´ıce-m´enˇe kompatibiln´ı, jednak co se t´ yˇce syntaxe z´apisu a do znaˇcn´e m´ıry tak´e souborem vestavˇen´ ych funkc´ı. Tato kapitola je sp´ıˇse pˇrehledov´a a jej´ım hlavn´ım u ´ˇcelem je poskytnout odkazy na nejˇcastˇeji pouˇz´ıvan´e programy, kter´e jsou poskytov´any pod r˚ uzn´ ymi, ale vesmˇes svobodn´ ymi licencemi. ˇ vˇenovan´ Cas y t´eto kapitole z´aleˇz´ı pˇredevˇs´ım na z´ajmu ˇcten´aˇre, nakolik se bude cht´ıt vˇenovat uveden´ ym odkaz˚ um a m˚ uˇze se pohybovat v rozmez´ı od p˚ ul hodiny aˇz po nˇekolik veˇcer˚ u str´aven´ ych brouzd´an´ım po internetu.
9.1
Octave
Octave je matematick´ y program, kter´ y je v r´amci open source alternativ s programem Matlab asi nejv´ıce kompatibiln´ı. Octave nebyl v˚ ubec p˚ uvodnˇe zam´ yˇslen jako program, kter´ y by mohl nahrazovat komerˇcn´ı program Matlab, ale byl navrˇzen jako uˇzivatelsky pˇr´ıjemn´ y program pro psan´ı vysokoˇskolsk´e uˇcebnice t´ ykaj´ıc´ı se n´avrhu chemick´ ych reaktor˚ u. Aˇckoli byl takto pl´anov´an, byl pouˇz´ıv´an v mnoha dalˇs´ıch vysokoˇskolsk´ ych a absolventsk´ ych kurzech chemick´eho inˇzen´ yrstv´ı na univerzitˇe v Texasu. Matematick´e oddˇelen´ı t´eto univerzity jej pouˇz´ıvalo tak´e k v´ yuce diferenci´aln´ıch rovnic a line´arn´ı algebry. Rozˇ s´ıˇ ren´ı Octave Matlabu znal´ y uˇzivatel velice z´ahy u Octave zjist´ı, ˇze ˇrada funkc´ı jemu d˚ uvˇernˇe zn´am´ ych zde prostˇe chyb´ı. Nejvˇetˇs´ı absenˇcn´ı zn´amky z´akladn´ı instalace Octave se snaˇz´ı napravit repozit´aˇr funkc´ı Octave-forge s´ıdl´ıc´ı na adrese http://octave. sourceforge.net, kter´e lze doinstalovat k jiˇz instalovan´emu z´akladn´ımu Octave. V praxi to funguje tak, ˇze si uˇzivatel st´ahne cel´ y bal´ık funkc´ı vˇcetnˇe instalaˇcn´ıch skript˚ u, v pr˚ ubˇehu instalace si volitelnˇe zvol´ı, o kter´e funkce m´a z´ajem, n´aslednˇe kompiluje, a pokud se vˇse zdaˇr´ı, m˚ uˇze si uˇz´ıvat vˇetˇs´ı kompatibility s Matlabem. Konkr´etnˇe si tak uˇzivatel m˚ uˇze dopomoci napˇr´ıklad k sad´am funkc´ı z oblasti: • ekonometrie, • paraleln´ı zpracov´an´ı dat, • tˇr´ırozmˇern´a vizualizace (VRML), • spousta nov´ ych typ˚ u graf˚ u, • symbolick´e v´ ypoˇcty.
9.2 FreeMat
75
QtOctave QtOctave je grafick´ y frontend pro konzolovou aplikaci GNU/Octave, napsan´ y v Qt4. Sv´ ym rozvrˇzen´ım a funkcemi se snaˇz´ı vyrovnat propriet´arn´ımu programu Matlab. Kromˇe grafick´eho frontendu pro GNU/Octave nab´ız´ı t´eˇz integrovan´ y editor skript˚ u. V souˇcasn´e dobˇe jsou dostupn´e verze pro GNU/Linux a MS Windows.
Odkazy • Ofici´aln´ı str´anky Octave: http://www.octave.org • Doplnujˇ nuj´ıc´ı bal´ıˇcky pro Octave: http://octave.sourceforge.net/index. html ˇ y pr˚ • Cesk´ uvodce programem: http://www.octave.cz • 3D vizualizace do Octave: http://octaviz.sourceforge.net • Grafick´ y syst´em do Octave: http://octplot.sourceforge.net • Uˇzivatelsk´ y frontend (QtOctave): http://qtoctave.wordpress.com • Souhrn rozd´ıl˚ u mezi Octave a Matlabem: http://en.wikibooks.org/wiki/ MATLAB_Programming/Differences_between_Octave_and_MATLAB a http: //wiki.octave.org/wiki.pl?MatlabOctaveCompatibility • Seri´al o Octave na serveru AbcLinuxu: http://www.abclinuxu.cz/serialy/ octave
9.2
FreeMat
Jedn´a se o projekt, za kter´ ym stoj´ı Samit Basu, ale dnes jiˇz velkou ˇc´ast v´ yvoje prov´ad´ı komunita. Pokud jde o kompatibilitu s Matlabem, pak str´anky produktu uv´adˇej´ı pˇribliˇznˇe 95% kompatibilitu a na dalˇs´ıch vylepˇsen´ıch se pracuje. Naopak oproti Matlabu nen´ı moˇzno vytv´aˇret grafick´a uˇzivatelsk´a rozhran´ı k aplikac´ım, ale nˇekter´e partikul´arn´ı ˇca´sti jsou postupnˇe zapracov´av´any. Silnou str´ankou aplikace je moˇznost prov´adˇet paraleln´ı v´ ypoˇcty skrze MPI, coˇz v´ yraznˇe rozˇsiˇruje ˇsk´alu funkc´ı a moˇznost´ı tohoto n´astroje. Nechyb´ı ani schopnosti 3D vizualizac´ı, coˇz je pr´avˇe jedna z dom´en Matlabu. Pozitivem je tak´e to, ˇze k dispozici jak pro Linux, tak tak´e pro Mac OS i Windows. Cel´a skupina funkc´ı je vˇenov´ana napˇr´ıklad grafick´ ym prostˇredk˚ um anal´ yzy dat. Na z´akladˇe zadan´ ych dat zvl´adne vygenerovat pˇr´ım´e proloˇzen´ı nejr˚ uznˇejˇs´ımi funkcemi. Nechyb´ı ani n´astroje pro interpolaci ˇci extrapolaci dat, proloˇzen´ı Gaussovou kˇrivkou
76
9 ALTERNATIVY MATLABU
ˇci libovoln´ ym polynomem. Pokud jde o ˇreˇsen´ı diferenci´aln´ıch rovnic je moˇzn´e uˇz´ıt i numerick´e metody, coˇz je pr´avˇe pro oblast inˇzen´ yrstv´ı z´asadn´ım zp˚ usobem d˚ uleˇzit´e. Program si bez pot´ıˇz´ı porad´ı i s ˇr´ıdk´ ymi maticemi, coˇz je dalˇs´ı, ne zcela trivi´aln´ı dovednost. Podobnˇe m˚ uˇze b´ yt uˇziteˇcn´a i podpora pr´ace s v´ıce neˇz 2GB poli (pro 64bitov´e operaˇcn´ı syst´emy).
Odkazy • Domovsk´a str´anka: http://freemat.sourceforge.net/
9.3
Scilab SciLab = Scientific Laboratory (vˇedeck´a laboratoˇr). Scilab je vˇedeck´ y softwarov´ y bal´ık pro numerick´e v´ ypoˇcty. Poskytuje otevˇren´e programovac´ı prostˇred´ı pro inˇzen´ yrsk´e a vˇedeck´e aplikace.
Scilab byl vyv´ıjen od roku 1990 v´ yzkumn´ ymi institucemi INRIA (Institut National ´ de Recherche en Informatique et en Automatique) a ENPC (Ecole Nationale des Ponts et Chauss´ees). Od roku 1994 byl distribuov´an jako freeware i se zdrojov´ ym k´odem. V souˇcasn´e dobˇe je pouˇz´ıv´an pro v´ yukov´e a pr˚ umyslov´e prostˇred´ı po cel´em svˇetˇe. Scilab nyn´ı spravuje Scilab Consorcium, zaloˇzen´e v kvˇetnu 2003. Scilab obsahuje stovky matematick´ ych funkc´ı s moˇznost´ı pˇridat dalˇs´ı programy z r˚ uzn´ ych programovac´ıch jazyk˚ u (FORTRAN, C, C++, JAVA...). M´a propracovanou strukturu dat, pˇrekladaˇc, a dovoluje pouˇz´ıvat vyˇsˇs´ı programovac´ı jazyky. D´ale obsahuje Scicos, coˇz je nˇeco jako Simulink pro Matlab, a nakonec jeˇstˇe pˇrekladaˇc Matlab to Scilab.
Toolboxy Toolboxy (v r´amci SciLabu se jim ˇr´ık´a atomy) jsou souborem funkc´ı, kter´e rozˇsiˇruj´ı z´akladn´ı sadu funkc´ı Scilabu. Mohou b´ yt bud’ komerˇcn´ı a nebo, coˇz je mnohem ˇcastˇejˇs´ı pˇr´ıpad, open source ˇci volnˇe ˇsiˇriteln´e. Autory tˇechto toolbox˚ u jsou bud’ samotn´ı autoˇri Scilabu nebo jin´ı program´atoˇri, ˇcasto z univerzitn´ıho prostˇred´ı. Urˇcit´e mnoˇzstv´ı toolbox˚ u je dod´av´ano se Scilabem a lze si pˇri instalaci zvolit, zda budou nainstalov´any. Z´akladn´ı sadu m˚ uˇzeme rozˇs´ıˇrit doinstalov´an´ım nov´ ych toolbox˚ u. Nejvˇetˇs´ı datab´az´ı volnˇe ˇsiˇriteln´ ych toolbox˚ u je na str´ank´ach autoru Scilabu v tzv. toolboxes center. Zde jsou toolboxy ˇrazeny do kategori´ı, takˇze v nich je moˇzno pˇrehlednˇe vyhled´avat. Alespoˇ n nam´atkou m˚ uˇzeme vyjmenovat: • neuronov´e s´ıtˇe,
9.3 Scilab
77
• data mining, • metody koneˇcn´ ych prvk˚ u. • genetick´e algoritmy • statistika • 2-D a 3-D grafika, • animace • simulace • klasick´e a robustn´ı ˇr´ızen´ı, • ˇr´ızen´ı sign´al˚ u • grafy • paraleln´ı Scilab vyuˇz´ıvaj´ıc´ı PVM • prostˇred´ı poˇc´ıtaˇcov´e algebry (Maple, MuPAD) Scilab dok´aˇze pracovat pod operaˇcn´ımi syst´emy Windows 9X/2000/XP, GNU/Linux a UNIX. Zdrojov´e k´ody jsou volnˇe ke staˇzen´ı na domovsk´e str´ance http://www. scilab.org. Odkazy • Domovsk´a str´anka: http://www.scilab.org • Adresa ke staˇzen´ı: http://www.scilab.org/products/scilab/download • Rozˇs´ıˇren´ı SciLabu: http://atoms.scilab.org/ • Elektronick´a kniha Basics on digital controller with scilab/scicos volnˇe ke staˇzen´ı: http://www.ebookaktiv.com/ebookcontroller/eBook_SCILAB.htm • Struˇcn´ y manu´al a u ´vod do Scilabu v ˇceˇstinˇe: http://scilab.ic.cz
ˇ SEN ˇ E ´ ULOHY ´ 10 RE
78
10
ˇ sen´ Reˇ eu ´ lohy
Pr˚ uvodce studiem: Posledn´ı kapitola tohoto textu je vˇenov´ana pˇr´ıklad˚ um ˇreˇsen´ı u ´loh v Matlabu. Vˇenujte dostateˇcn´ y ˇcas d˚ ukladn´emu pochopen´ı formulace u ´lohy i zp˚ usobu implementace v Matlabu. Moˇzn´a naleznete i jin´ y zp˚ usob implementace, tˇreba i jednoduˇsˇs´ı a vhodnˇejˇs´ı. Odhadovan´ y ˇcas potˇrebn´ y ke studiu je 3 aˇz 6 hodin.
10.1
N´ ahodn´ a proch´ azka
Pˇredstavte si, ˇze opil´ y n´amoˇrn´ık v pˇr´ıstavu m´a nastoupit na lod’. K tomu potˇrebuje pˇrej´ıt n´astupn´ı molo k lodi. K jeho pˇrejit´ı potˇrebuje udˇelat urˇcit´ y poˇcet krok˚ u dopˇredu. Jelikoˇz je opil´ y, ne kaˇzd´ y krok, kter´ y se mu podaˇr´ı, je dopˇredu, nˇekdy se ´ vyd´a doleva nebo doprava. Uskal´ ı je v tom, ˇze pokud vykon´a pˇr´ıliˇs mnoho krok˚ u do strany, spadne pˇres okraj mola do vody. Do odplut´ı lodi stihne n´amoˇrn´ık udˇelat nejv´ yˇse zadan´ y maxim´aln´ı poˇcet krok˚ u. Nyn´ı si naprogramujeme model n´amoˇrn´ıkovy cesty po molu. Mus´ıme nejdˇr´ıve pˇresnˇeji zformulovat pravidla pohybu n´amoˇrn´ıka: • krok vpˇred s pravdˇepodobnost´ı 0.6 • krok vpravo s pravdˇepodobnost´ı 0.2 • krok vlevo s pravdˇepodobnost´ı 0.2 Uveden´ ymi hodnotami pravdˇepodobnosti modelujeme u ´roveˇ n n´amoˇrn´ıkovy opilosti. D´ale mus´ıme zn´at dalˇs´ı vstupn´ı parametry n´amoˇrn´ıkova pohybu: • D´elka mola je 50 krok˚ u. • N´amoˇrn´ık vych´az´ı z pozice na poˇc´atku mola, z n´ıˇz k lev´emu i prav´emu okraji m´a 10 krok˚ u. • Do odplut´ı lodi stihne nejv´ yˇse 100 krok˚ u. Pak uˇz m˚ uˇzeme napsat program modeluj´ıc´ı n´amoˇrn´ıkovu cestu: N = input(’Pocet pokusu: ’); dosel = 0; nestih = 0; voda = 0; for i = 1:N kroky = 0; % Vynulovani kroku pro novou prochazku x = 0; % Souradnice pocatku prochazky
10.1 N´ahodn´a proch´azka
y = 0; while x < 50 && abs(y) <= 10 && kroky < 100 kroky = kroky + 1; % Dalsi krok r = rand; if r < 0.6 % rozhodovani kam x = x + 1; % krok dopredu elseif r <0.8 y = y + 1; % krok vpravo else y = y - 1; % krok vlevo end; end; if x >= 50 dosel = dosel + 1; end; if abs(y) > 10 voda = voda + 1; end if kroky >= 100 nestih = nestih + 1; end end; dosel = 100 * dosel / N; disp(’Celkova uspesnost (%): ’) disp(dosel) voda = 100 * voda / N; nestih = 100 * nestih / N; disp(’Voda (%): ’) disp(voda) disp(’Nestihnul (%): ’) disp(nestih)
79
ˇ SEN ˇ E ´ ULOHY ´ 10 RE
80
10.2
Objem tˇ elesa metodou Monte Carlo
M´ame urˇcit objem tˇelesa (tvarem pˇripom´ınaj´ıc´ım b´abovku) na n´asleduj´ıc´ım obr´azku:
Toto tˇeleso je pr˚ unikem tˇelesa pod plochou grafu funkce z = exp(−x2 − y 2 )
(1)
a v´alce o polomˇeru 1, v´ yˇsce 1 a stˇredem podstavy v bodˇe (0, 0, 0). Povˇsimnˇeme si, ˇze funkce (1) m´a nejvˇetˇs´ı hodnotu rovnou jedn´e v bodˇe (0, 0) a jej´ı vodorovn´e ˇrezy jsou kruˇznice. Zdrojov´ y k´od t´eto funkce upraven´ y pro nakreslen´ı grafu tˇelesa na obr´azku n´asleduje: function z = babovka(x, y, r) if (x^2 + y^2) <= r^2 z = exp(-x^2 - y^2); else z = 0; end
Objem tohoto tˇelesa v tomto pˇr´ıkladu m˚ uˇzeme urˇcovat r˚ uzn´ ym zp˚ usobem, napˇr. jako souˇcet objemu jeho v´alcov´e ˇc´asti a objemu zakulacen´eho vrˇsku, kter´ y bychom snadno urˇcili jednoduchou numerickou metodou:
10.2 Objem tˇelesa metodou Monte Carlo
h = x = d = z = for
81
0.001 0: h: 1; length(x); exp(-x.^2); ii = 1:d-1 prumer(ii) = (x(ii) + x(ii + 1)) /2; V(ii) = pi * prumer(ii)^2 * (z(ii) - z(ii + 1));
end V = sum(V); V = V + pi * exp(-1) Takto spoˇc´ıt´ame, ˇze objem tˇelesa je 1.9859. Jsou u ´lohy, kdy vhodn´a numerick´a metoda nen´ı k dispozici. Proto si zde uk´aˇzeme ˇreˇsen´ı naˇs´ı u ´lohy stochastickou metodu Monte Carlo. Jej´ı princip spoˇc´ıv´a v tom, ˇze n´ahodnˇe vygenerujeme velk´e mnoˇzstv´ı bod˚ u rozdˇelen´ ych rovnomˇernˇe ve vˇetˇs´ım tˇelese, jehoˇz objem um´ıme snadno urˇcit. Zjist´ıme relativn´ı ˇcetnost bod˚ u, kter´e jsou souˇcasnˇe i uvnitˇr tˇelesa, jehoˇz objem zjiˇst’ujeme, a pak hledan´ y objem spoˇc´ıt´ame jako souˇcin relativn´ı ˇcetnosti bod˚ u uvnitˇr a objemu vˇetˇs´ıho tˇelesa. Hledan´ y objem tˇelesa lze tedy vypoˇc´ıtat takto: nt , Vt = Vv nv kde Vv je objem vˇetˇs´ıho tˇelesa, nv je poˇcet bod˚ u vygenerovan´ ych ve vˇetˇs´ım tˇelese a nt poˇcet bod˚ u v tˇelese, jehoˇz objem zjiˇst’ujeme. V naˇs´ı u ´loze je vˇetˇs´ım tˇelesem v´alec o objemu Vv = l π r2 , po dosazen´ı l = 1, r = 1 dostaneme Vv = π. Skript ˇreˇs´ıc´ı u ´lohu pro tˇeleso definovan´e na zaˇc´atku t´eto ˇc´asti textu n´asleduje. Vˇsimnˇeme si, ˇze vzhledem k symetrii tˇelesa staˇc´ı zjiˇst’ovat ˇcetnost bod˚ u jen pro jeden kvadrant (x ≥ 0, y ≥ 0). r = 1; % polomer valce nvalec = 0; nbabovka = 0; for ii = 1:100000 x = r * rand(1); y = r * rand(1); if (x^2 + y^2) <= r^2 % je v kruhu o polomeru r nvalec = nvalec + 1; % pocet bodu uvnitr valce v = rand(1); % svisla souradnice bodu z = babovka(x, y, r); if v <= z % vygenerovany bod je v babovce nbabovka = nbabovka + 1; end
ˇ SEN ˇ E ´ ULOHY ´ 10 RE
82
end end nvalec objem_valec = pi * r^2; objem_babovka = objem_valec * nbabovka / nvalec V´ ysledky z 5 opakovan´ ych spuˇstˇen´ı skriptu jsou v n´asleduj´ıc´ı tabulce. Zjiˇstˇen´ y objem tˇelesa je pˇribliˇznˇe 1.99.
Pr˚ umˇer
Poˇcet bod˚ u
Objem
78496 78610 78477 78694 78409
1.9900 1.9887 1.9894 1.9823 1.9919
78537
1.9885
Pr˚ umˇern´ y poˇcet bod˚ u uvnitˇr v´alce o pr˚ umˇeru 1 je 78537 ze 100000 bod˚ u n´ahodnˇe vygenerovan´ ych ve ˇctverci o stranˇe 1. Tedy pomˇer tˇechto hodnot by mˇel b´ yt pˇribliˇznˇe ˇ roven π/4. Ctyˇrn´asobek tohoto pomˇeru je 3.141488 a je opravdu dosti pˇresnˇe roven π. Shrnut´ı: - Peˇcliv´a a jasn´a formulace ˇreˇsen´eho probl´emu, vstupn´ı a v´ ystupn´ı data. - Volba co nejjednoduˇsˇs´ıho ˇreˇsen´ı a vhodn´e implementace.
Kontroln´ı ot´ azky: 1. Jak byste modelovali menˇs´ı a vˇetˇs´ı opilost n´amoˇrn´ıka v prvn´ı u ´loze? Upravte skript a vyzkouˇsejte 2. Jak byste spoˇc´ıtali objem tˇelesa, kter´e vznikne pr˚ unikem tˇelesa pod plochou grafu funkce (1) a kv´adru o rozmˇerech a × b × 1 s podstavou a × b v rovinˇe z = 0, s hranami rovnobˇeˇzn´ ymi s osami a zadanou polohou vrcholu nejbliˇzˇs´ımu poˇca´tku (0, 0)? Upravte skript k ˇreˇsen´ı t´eto u ´lohy a ovˇeˇrte na poˇc´ıtaˇci pro a = 1, b = 0.5 a polohu vrcholu nejbliˇzˇs´ımu poˇca´tku (0.3, 0.3).
LITERATURA
83
Literatura [1] Manu´al Matlab, souˇca´st instalovan´eho softwarov´eho prostˇred´ı. [2] B¨ ullow J.: Sb´ırka jednoduch´ ych pˇr´ıklad˚ u pro ˇreˇsen´ı elektrotechnick´ ych a fyzik´aln´ıch u ´loh, Z´apadoˇcesk´a univerzita v Plzni, 2007. [3] Engelbrecht A. P.: Computatinal Intelligence: An Introduction. Chichester: John Wiley & Sons, 2007. [4] Hahn B., Valentine D.: Essential MATLAB for Engineers and Scientists, Elsevier, 2007. [5] Hanselman D., Littlefield B.: Mastering MATLAB 7, Pearson Prentice Hall, 2005. [6] Heringov´a B., Hora P.: MATLAB D´ıl I. – Pr´ace s programem, 1995, http: //www.cdm.cas.cz/czech/hora/vyuka/mvs/tutorial.pdf. [7] Heringov´a B., Hora P.: MATLAB D´ıl II. – Popis funkc´ı, 1995, http://www. cdm.cas.cz/czech/hora/vyuka/mvs/reference.pdf. [8] Karban P.: V´ ypoˇcty a simulace v programech Matlab a Simulink, Computer Press, 2006. [9] Knight A.: Basics of Matlab and Beyond, Chapman and Hall, 2000. [10] Majerov´a D.: Lekce Matlabu v ˇceˇstinˇe: http://uprt.vscht.cz/majerova/ matlab/index.html. [11] Pol´aˇcek J.: Seri´al o Octave na serveru AbcLinuxu: http://www.abclinuxu. cz/serialy/octave.