38
15 2. MATLAB - ZÁKLADY V tejto kapitole sú uvedené základné funkcie a črty programového prostriedku MatLab, od práce s premennými cez vektorové a maticové operácie až po grafické znázornenie výpočtov tak, aby to čitateľovi umožnilo rýchle využitie tohto programovacieho prostredia. 2.1. Základné črty programového prostriedku MatLab Táto časť sa zameriava na definície premenných a prácu s nimi, vytváranie vlastných súborov v prostredí Matlab a príkazmi na vytvorenie cyklov. 2.1.1. Práca s premennými Výrazy, ktoré sú vpísané do pracovného poľa bez mena premennej, MatLab vyhodnotí a uloží pod vlastnou premennou definovanou ako odpoveď ans (answer-odpoveď). Vypočítaný výsledok sa môže použiť aj pre ďalšie výpočty, ak sa priradí k dodatočne definovanej premennej, napr. premenna1=ans. Názvy premenných môžu dosahovať dĺžku až 19 znakov (písmen a čísiel za predpokladu, že názov začína písmenom). MatLab rozlišuje veľké a malé písmená, takže to isté malé a a veľké písmeno A môže označovať dve rozličné premenné. Naopak príkaz casesen odstraňuje túto citlivosť MatLabu (citlivosť na veľké a malé písmená). Vyhodnocované výrazy v MatLabe sa skladajú z operátorov a dostupných funkcií (tieto sú súhrnne uvedené na záver publikácie ako Dodatok). Tak napr. ak je do pracovného poľa zapísaný výraz: » x=(1-exp(-3))*sin(pi/6) % v pracovnom poli sa objaví vypočítané x x = 0.4751 , čím je definovaná premenná x. Ak zapísaný výraz neobsahuje názov premennej, táto sa opäť objaví ako ans. Napr. hodnota stúpajúcej exponenciály, ktorá je daná

2. MATLAB - ZÁKLADY - kves.uniza.sk · KC ampl im re uhol % a po vpísaní premennej KC dostaneme: » KC KC = 3.0000 + 4.0000I . Po napísaní príkazu help mojprvy, MatLab vypíše

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

15

2. MATLAB - ZÁKLADY

V tejto kapitole sú uvedené základné funkcie a črty programového prostriedkuMatLab, od práce s premennými cez vektorové a maticové operácie až po grafickéznázornenie výpočtov tak, aby to čitateľovi umožnilo rýchle využitie tohtoprogramovacieho prostredia.

2.1. Základné črty programového prostriedku MatLab

Táto časť sa zameriava na definície premenných a prácu s nimi, vytváranievlastných súborov v prostredí Matlab a príkazmi na vytvorenie cyklov.

2.1.1. Práca s premennými

Výrazy, ktoré sú vpísané do pracovného poľa bez mena premennej, MatLabvyhodnotí a uloží pod vlastnou premennou definovanou ako odpoveď ans(answer-odpoveď). Vypočítaný výsledok sa môže použiť aj pre ďalšie výpočty, aksa priradí k dodatočne definovanej premennej, napr. premenna1=ans. Názvypremenných môžu dosahovať dĺžku až 19 znakov (písmen a čísiel za predpokladu,že názov začína písmenom). MatLab rozlišuje veľké a malé písmená, takže to istémalé a a veľké písmeno A môže označovať dve rozličné premenné. Naopak príkazcasesen odstraňuje túto citlivosť MatLabu (citlivosť na veľké a malé písmená).

Vyhodnocované výrazy v MatLabe sa skladajú z operátorov a dostupnýchfunkcií (tieto sú súhrnne uvedené na záver publikácie ako Dodatok). Tak napr. akje do pracovného poľa zapísaný výraz:

» x=(1-exp(-3))*sin(pi/6) % v pracovnom poli sa objaví vypočítané xx = 0.4751 ,

čím je definovaná premenná x. Ak zapísaný výraz neobsahuje názov premennej,táto sa opäť objaví ako ans. Napr. hodnota stúpajúcej exponenciály, ktorá je daná

16

výrazom

−Tt

e1 , pre čas, ktorý sa rovná trom časovým konštantám ( t=3T ) ,

dosiahne pomernú časť z ustálenej hodnoty:

» 1-exp(-3)ans =

0.9502 % pričom nepomenovaná premenná je uložená ako ans. Ak je posledným znakom vyhodnocovaného výrazu bodkočiarka ; výraz savyhodnotí, ale na obrazovke sa neobjaví. Jeho hodnotu možno vyvolať napísanímpríslušnej premennej do pracovného okna.

Čo sa týka poradia vykonávania základných algebraických operácií v MatLabe,má mocnina ^ prednosť pred násobením * a delením sprava / alebo zľava \ a tiezase majú prednosť pred sčítaním + a odčítaním -. Poradie vykonávaniaalgebraických operácií demonštruje nasledujúca ukážka:» 1+2^3/4*5 % alebo (8/4)*5 + 1ans = 11

» 1+2^3/(4*5) % alebo 8/20 + 1ans = 1.4000

» (1+2)^3/(4*5) % alebo 27/20ans = 1.3500

Automaticky nastavený formát zobrazenia výsledku (format short) zobrazujevypočítaný výsledok ako 5-číselný znak. Príkazy format short e, format longa format long e zobrazia výsledok v pohyblivej čiarke (floating point) ako 15 číslicv pevnej čiarke (fixed point) a ako 15 číslic v pohyblivej čiarke. Napr. hodnotaLudolphovho čísla π je zobrazená v niektorých z možných formátov:» format short 3.1416» format long 3.14159265358979» format short e 3.1416e+000» format long e 3.141592653589793e+000» format hex 400921fb54442d18

Príkaz format vráti späť príkazové okno do režimu format short.

17

Pre väčšiu pružnosť v zobrazovaní výsledku príkaz fprintf zobrazuje výsledokna obrazovku alebo do príslušného súboru v žiadanom formáte. Napr. príkaz%5.2f zabezpečuje zobrazenie výsledku v šírke najmenej 5 číslic s dvomi číslicamipo desatinnej čiarke.» R=20;» fprintf('Plocha = %5.2f metrov stvorc.', pi*R^2);Plocha = 1256.64 metrov stvorc

Príkazy do pracovného priestoru MatLabu je možné zadávať aj z klávesnice.Príkaz input spôsobí, že počítač čaká na údaj z klávesnice. Napríklad zadanieurčitej hodnoty príkazom input možno vykonať nasledovne:» R = input('Zadaj polomer v metroch') %počítač zobrazí textový reťazecZadaj polomer v metroch %čaká na zadanie» 20 %ktoré potom uloží ako premennú RR = 20.

Z ďalších príkazov napr. príkaz pause spôsobí zastavenie výpočtu, ale len dostlačenia ľubovoľnej klávesy. V tomto smere je výhodnejší príkaz keyboard,ktorý pozastaví výpočet a umožní vykonanie novo vložených príkazov. Po príkazekeyboard sa v príkazovom riadku objaví aj písmeno K» ako upozornenie na tentopracovný režim. Vrátenie sa do pôvodného výpočtu resp. programu zabezpečíúplné vpísanie príkazu return písmenami do príkazového okna (príkaz keyboardmôže byť použitý aj v skript-súboroch, o ktorých bude pojednané neskôr).

MatLab má niekoľko vopred definovaných premenných. Medzi tieto patriahlavne premenné i a j, ktoré obe predstavujú imaginárnu jednotku. Táto jedefinovaná ako −1 . Obe premenné sa veľmi dobre využijú pri definovaníkomplexných čísiel.

Jednoduché výpočty s komplexnými číslami názorne ukazuje tab. 2.1.1, v ktorej jevypočítaná komplexná impedancia sériového R-L obvodu a komplexná admitanciasériového R-C obvodu spolu s amplitúdami a fázovým posunom prúdov v ustálenomstave, keď sa pripoja na zdroj sínusového napätia s amplitúdou Um=10 Va frekvenciou f = 50 Hz (fázový posun napätia v okamžiku pripnutia je rovný nule).

Priebehy prúdov a napätí pre obidva obvody sú simulované ďalej v kap. 4,ktorá je venovaná simuláciám v prostredí Simulink a zodpovedajúce časovépriebehy vrátane prechodových dejov ako aj časovej lupy v ustálenom stave súuvedené na obr. 4.2.5b, s. 83 a obr. 4.2.9b, s. 85.

18

a)» Um=10; w=314; % napáj. napätie» R=2; L=0.1; % param. RLobvodu»z=(R+ (j*w*L)) % kompl. impedanciaz = 2.0000 +31.4000i

» Z=abs(z) %abs. hodn. (z)Z = 31.4636

» Ampl_I=Um/Z %amplitúda prúduAmpl_I = 0.3178

» Re_z=real(z) % reálna zložka (z)Re_z = 2

» Im_z=imag(z) % imag. zložka (z)Im_z = 31.4000

» fi=atan(Im_z/Re_z) % fáz. posun, [rad]fi = 1.5072

» t_onesk=fi/w % doba oneskoreniat_onesk = 0.0048 % prúdu za nap. [ms]

b)» Um=10; w=314; % napáj. napätie» R=10; C=1e-4; % param. RCobvodu»y=(R+1/(j*w*C)) % kompl. admitanciay = 10.0000 -31.8471i

» Y=abs(y) % abs. hodn. (y)Y = 33.3802

» Ampl_I=Um/Y % amplitúda prúduAmpl_I = 0.2996

» Re_y=real(y) % reálna zložka (y)Re_y = 10

» Im_y=imag(y) % imag. zložka (y)Im_y = -31.8471

» fi=atan(Im_y/Re_y) % fáz. posun v [rad]fi = -1.2665

» t_onesk=fi/w % doba oneskoreniat_onesk = -0.0040 % prúdu za nap. [ms]

Tab. 2.1.1 Výpočty: a) komplexnej impedancie a prúdu v RL obvode,b) komplexnej admitancie a prúdu v RC obvode pri harmonickom napájaní

Pri definovaní premenných si je však potrebné dať pozor na možnosťpredefinovania týchto vopred definovaných premenných, napr. ako indexov preprvky matice, pretože novým nadefinovaním, napr. i=1 sa zmení hodnota iz hodnoty −1 na 1. Ak chceme znovu obnoviť vopred nadefinovanú hodnotupremennej i, stačí do príkazového riadku napísať clear i. Keďže Matlab mádostatok priestoru na definovanie premenných, nedoporučuje sa predefinovať uždefinované premenné, medzi ktoré ďalej patria:

piepsrealminrealmaxInfNaN

% zastupuje hodnotu π,% zastupuje číslo s veľmi malou hodnotou eps = 2.2204e-016,% zastupuje najmenšie číslo v plávajúcej čiarke, dané ako 2-1022,% zastupuje najväčšie číslo v plávajúcej čiarke, dané ako (2-eps)1023,% znak pre ∞,% znak pre neurčitý výraz napr. 0/0 (not a number).

19

MatLab napr. vráti premennú Inf, vtedy, keď vo výpočte objaví delenie nulou.Ak aj k tomuto dôjde, v MatLabe to neznamená ukončenie behu programu, ale ibavarovanie. Napr. po definovaní premennej n ako:» n=4/0 % po stlačení enter sa objavíWarning: Divide by zero % varovanie, že došlo k deleniu nulou

n = Inf .

Podobne po nadefinovaní premennej, ktorá obsahuje výraz s neurčitým výsledkom,sa objaví varovanie typu:» m=Inf/Infm = NaN .

MatLab ponúka široké spektrum funkcií, ktoré sa dajú veľmi ľahko zlučovaťdo výrazov. Najjednoduchšie funkcie majú jeden vstupný a jeden výstupnýargument. Vstupný argument sa k funkcii priraďuje v zátvorkách. Napríkladfunkcia odmocnina definovaná v MatLabe ako sqrt vráti:» x=sqrt(1 + 3i)x = 1.4426 + 1.0398I .

Postupnosť písmen v apostrofoch ( ‘…’ ) sa nazýva písmenový reťazec alebotextová premenná. Napr. výraz d1» d1='dnes' % má za výsledokd1 =dnes,

to znamená, že text je uložený ako vektor, t.j. každé písmeno ako jeden prvokvektora, takže ak chceme zistiť jeho veľkosť príkazom size, dostávame:

» size(d1)ans = 1 4 ,

čo naznačuje, že vektor o jednom riadku má štyri prvky. Jednotlivé písmená súuložené v ich ASCII formáte, takže funkcia abs ukáže ich uložené hodnoty:» abs(d1)ans = 100 110 101 115 .

20

Nový výraz, ktorý vznikne zlúčením výrazu d1 a novo definovaným výrazom akod2 , má za výsledok:» d2=[d1 ' koniec']d2 =dnes koniec .

2.1.2. Vkladanie vlastných súborov

Veľkou výhodou programovania v MatLabe je aj to, že ho možno interaktívnerozširovať o vlastné podprogramy, ktoré často používame. Takto vytvorené novésúbory, v MatLabe nazývané ako skript-súbory, napísané v ASCII kóde (textovýsúbor), musia vždy za svojím názvom obsahovať príponu *.m a po odladení samusia uložiť do prostredia MatLabu. Príkazy obsiahnuté v takomto súbore savyhodnocujú automaticky po napísaní mena súboru do príkazového riadku. Taknapr. m-súbor “mojprvy.m” počíta absolútnu hodnotu a uhol ľubovoľnéhokomplexného čísla. Výsledky programu mojprvy.m sú vložené do tab. 2.1.2% súbor "mojprvy.m"% výpočet abs. hodnoty a uhlu komplexného čísladisp('realna cast'); % požiadavka na zadanie reálnej zložkyre = input('re = '); re % v pracovnom poli sa objaví zadaná reálna zložkadisp('imag. cast'); % požiadavka na zadanie imaginárnej zložkyim = input('im = '); im % v pracovnom poli sa objaví zadaná imag. zložkaKC = re + j*im; % definícia komplexného čísla ako KCampl=abs(KC) % výpočet abs. hodnoty pomocou m-funkcie abs.muhol=atan(imag(KC)/real(KC)) % výpočet uhlu v rad pomocou m-funkcie atan.m

» mojprvyrealna castre = 3re = 3imag. castim = 4;

ampl = 5uhol = 0.9273

» mojprvyrealna castre = sqrt(3)re = 1.7321imag. castim = 1;

ampl = 2uhol = 0.5236

Tab. 2.1.2 Výsledky programu mojprvy.m pre dve komplexné čísla

21

MatLab pracuje aj s novými skript-súbormi ako s vlastnými m-súbormi a v pra-covnom poli má uložené novo definované premenné, ktoré možno vyvolaťpríkazom who, prípadne po zapísaní premennej do pracovného okna zistiť aj jejkonkrétnu hodnotu. Tak napr. po zadaní prvého príkladu sa po príkaze who objaví:» whoYour variables are:KC ampl im re uhol % a po vpísaní premennej KC dostaneme:» KCKC = 3.0000 + 4.0000I .

Po napísaní príkazu help mojprvy, MatLab vypíše do pracovného okna riadkyprogramu začínajúce znakom %:

% subor "mojprvy.m"% vypocet abs. hodnoty a uhlu kompl. cisla

V prípade, že sa používa väčší počet vlastných skript-súborov, pre rýchluorientáciu v prostredí MatLab je výhodné si vytvoriť vlastný adresár, ku ktorémuje však nutné definovať cestu v súbore matlabrc.m. Pre MatLab verzia 6 a vyššiesa cesta nastavuje v hlavnom menu príkazmi File (súbor), Set Path (nastav cestu)Add Folder (pridaj zložku).

2.1.3. M-funkcia

Veľmi dôležitý typ m-súboru je m-funkcia, ktorá umožňuje naprogramovaťkonkrétne výpočty a po odladení ich potom používať ako súčasť iných programov.Na rozdiel od bežného skript-súboru, m-funkcia musí obsahovať slovo functionv prvom príkazovom riadku a definíciu vstupnej a výstupnej premennej. Menosúboru musí byť totožné s menom funkcie a syntax zápisu funkcie je:

function[výstupné argumenty] = meno funkcie(vstupné argumenty)

Výstupné argumenty sú premenné, ktoré funkcia vracia a ktoré nemusia byťvždy len hodnotou. Vstupné argumenty sú premenné, ktoré vstupujú do funkciea preto musia byť pri volaní funkcie vždy definované (priradené v zátvorkách) a súfunkciou ďalej spracovávané.

22

Zásadný rozdiel medzi funkciou a skript-súborom je v tom, že po vpísanínázvu skript-súboru do pracovného okna je tento vykonávaný automaticky, zatiaľčo funkcia sa môže volať kedykoľvek, keď je to potrebné. Ďalší rozdiel je ajv tom, že pokiaľ premenné skript-súboru sú globálne, premenné funkcie sú lokálne,čo znamená, že po použití funkcie viac nie sú dostupné (premenné XS, SUCET a sv ďalej uvedených príkladoch) a preto sa znova vyvolať nedajú.

Nasledujúce príklady funkcií, ktoré sú v tab. 2.1.3 umožňujú určiť strednúa efektívnu hodnotu prvkov vektora X. Ako vidieť z príkladu, je dobré si prenovovytvorenú funkciu spracovať aj komentár, ktorý uľahčí jej použitie aj podlhšom odstupe (v príkladoch sú použité príkazy size a sum, ktoré určujú veľkosťvektora, ako aj súčet jeho prvkov).

function y=str_hodn(X)

% funkcia str_hodn vracia% strednu hodnotu prvkov vektora

SUCET=sum(X);s=size(X);Str_Hodn=SUCET/s(2)

function y=efekt_h(X)

% funkcia efekt_h vracia% efektivnu hodnotu prvkov vektora

XS = X.*X;SUCET=sum(XS);s=size(X);Efekt_Hodn=sqrt(SUCET/s(2))

Tab. 2.1.3 Príklady zápisu m-funkcií MatLabu

Použitie oboch funkcií si ukážeme na výpočte strednej a efektívnej hodnotysínusového priebehu pri uvážení 100 údajov o priebehu počas polperiódy, ktoréukazuje tab. 2.1.4. Ako posledný riadok je uvedený správny údaj o tejto hodnote,aby si bolo možné utvoriť obraz o vplyve počtu vzoriek na výpočet.

» Y=0:0.01*pi:pi;» X=sin(Y);» str_hodn(X)

Str_Hodn = 0.6303

» 2/pi = 0.6366

» Y=0:0.01*pi:pi;» X=sin(Y);» Efekt_h(X)

Efekt_Hodn = 0.7036

» 1/sqrt(2) = 0.7071

Tab. 2.1.4 Výsledky výpočtu m-funkcií pre strednú a efektívnu hodnotu

Pozn.: Na výpočet strednej hodnoty má MatLab vlastnú funkciu mean, ktorá prevektor počíta strednú hodnotu z jeho prvkov a pre maticu počíta riadkový vektor,ktorý obsahuje strednú hodnotu prvkov v jednotlivých stĺpcoch matice.

23

2.1.4. Polynómy a práca s nimi

Polynómy sa v MatLabe zapisujú ako riadkový vektor s prvkami, ktoré zodpo-vedajú koeficientom pri jednotlivých mocninách v klesajúcej postupnosti, pričommusíme zapísať aj nulové. Napr. polynóm p s s s= + + +4 32 5 6 zapíšeme ako:

p=[1 2 0 5 6] .

Hodnoty polynómu sa dajú vypočítať pomocou funkcie polyval:» polyval(p,1)ans = 14 ,

čím je daná hodnota polynómu pre s=1. Príkaz roots vypočíta korene polynómu:

kor=roots(p)kor = -2.4288 0.7144 + 1.4000i 0.7144 - 1.4000i -1.0000 .

Podobne však môžeme polynóm vypočítať aj opačným spôsobom zo známychkoreňov pomocou funkcie poly:» p1=poly([-1 -2])p1 = 1 3 2 .

Keď je vstupom do funkcie poly matica, potom táto funkcia vracia koeficientyjej charakteristického polynómu. Napr. pre maticu B=[1 2; 4 3] dostaneme:

» B=[1 2; 4 3];» poly(B)ans = 1 -4 -5 .

Konečne MatLab môže pomocou funkcií conv a deconv násobiť a deliť poly-nómy tak ako to ukazuje tab. 2.1.5. Keď si nadefinujeme polynómy p s1 1= + ,

2sp2 += a 2s3sp 23 ++= potom:

24

» p1=[1 1];» p2=[1 2];» p3=[1 3 2];» g3=conv(p1,p2)g3 = 1 3 2

» g2=deconv(p3,p1)g2 = 1 2

»p1=[1 1];» p2=[1 2];» p3=[1 3 3];» [q,r]=deconv(p3,p1)

q = 1 2

r = 0 0 1

Tab. 2.1.5 Výsledky funkcií conv a deconv pre násobenie a delenie polynómov

V predchádzajúcom príklade uvedenom v ľavej časti, boli polynómynadefinované tak, že delenie vyšlo bezo zvyšku. Ak je príkaz deconv zadanýtak ako predtým, potom zvyšok nevracia, aj keď je tento nenulový. Akzmeníme polynóm 3s3sp 2

3 ++= , ktorý už pri tom istom delení má zvyšok,

potom príkaz [q,r]=deconv(p3,p1) vráti aj polynóm pre zvyšok, ako to vidieťv pravej časti tab. 2.1.5.

2.1.5. Príkazy na vytvorenie slučiek

Základnou filozofiou tvorcov MatLabu bolo vyhýbať sa slučkám, pokiaľ je tolen možné. Napriek tomu sa však pri zložitejších úlohách tomuto problémunevyhneme. Preto MatLab tak, ako iné programovacie jazyky, pozná prevytvorenie slučiek príkazy for, testovaciu podmienku while a pre podmienku príkazif a break.

MatLab má svoju vlastnú verziu príkazu na vytvorenie slučky for (v inýchjazykoch do). Tento príkaz umožňuje presne definované opakovanie výrazu aleboskupiny výrazov a musí byť ukončený s end. Tak napr. príkaz:

n=3; for i=1:n, x(i)=5, end ,

priradí hodnotu „5“ prvým trom prvkom premennej x.

25

Na zlepšenie orientácie v programe je dobré slučku rozpísať do jednotlivýchriadkov, pretože ak výpočet obsahuje viac slučiek (dokonca vzájomne saprekrývajúcich), mohol by sa zápis stať neprehľadný. Napr. zápis:

» m=2; n=3;» for k = 1 : m for l = 1 : n A(k,l) = 1/(k+l); end end

priradí jednotlivým prvkom matice A hodnotu rovnú recipročnej hodnote súčtu ichpríslušných indexov ( riadkov a stĺpcov matice ) ako to ukazuje tab. 2.1.6.

» n=3;» for k = 1 : n, x( k ) = 5, end;x = 5

x = 5 5

x = 5 5 5

» m=2; n=3;» for k = 1 : m for l = 1 : n A(k,l) = 1/(k+l); end end» AA = 0.5000 0.3333 0.2500 0.3333 0.2500 0.2000

Tab. 2.1.6 Ukážka použitia príkazu for

Ako vidieť z ukážok, bodkočiarka za vykonávaným výrazom x(k)=5; resp.A(k,l)=1/(k+l) zabráni jeho postupné zobrazovanie pri vytváraní (porovnajte ľavúčasť a pravú časť tab. 2.1.6 ukážky cyklu for). Každý výraz for musí byť ukončenýpríkazom end. Ak by tomu tak nebolo, MatLab bude čakať dovtedy, kým sa tentovýrok v príkazovom riadku neobjaví.

Vlastnú verziu má MatLab aj pre slučku pomocou testovacej podmienky while.Na rozdiel od slučky vytvorenej pomocou for, slučka while umožňuje svojeopakovanie, ktoré nie je vopred definované a závisí od vykonávanej podmienky.Všeobecný tvar tohto príkazu je: while relácia

príkaz end.

26

Demonštruje to aj nasledujúca ukážka v tab. 2.1.7, ktorá výpočítava n+1prirodzených čísiel začínajúcich jednotkou, ktorých súčin je menší ako 10 (resp.súčet menší ako 100):

» n = 1;» while prod(1:n) < 10, n=n+1; end» nn = 4

» n = 1;» while sum(1:n) < 100, n=n+1; end» nn = 14

Tab. 2.1.7 Ukážka použitia príkazu while

Ešte názornejšie ilustruje použitie podmienky while tab. 2.1.8, ktorá ukazujevýpočet Ae , t.j. exponentu matice A príkazom expm(A) :

expm(A) = 1 + A + A^2/2! + A^3/3! + …

s požadovanou presnosťou. Nasledujúca sekvencia príkazov vypočíta maticu Eako expm(A). Cyklus sa bude opakovať dovtedy, pokiaľ F nedosiahne tak malúhodnotu, že keď sa pripočíta k E, nezmení túto preddefinovanú hodnotu o 0,001.Vpravo je potom vypočítaná hodnota B=expm(A) takým spôsobom, ako ju mánadefinovanú MatLab.

» A=[1 2; 4 3];» s=size(A);» E=zeros(s);» F=eye(s);» k=1;» while norm(E+F - E,1) > 0.001 E = E + F; F = A*F/k; k = k + 1; end» EE =

49.7160 49.3482 98.6963 99.0642

» A=[1 2; 4 3];»B = expm(A)

B =

49.7163 49.3484

98.6969 99.0647

Tab. 2.1.8 Výpočet exponentu matice s definovanou presnosťou

27

Podmienka if má všeobecný tvar:

if relácia 1príkaz

elseif relácia 2príkaz 2

else ak neplatia predchádzajúce podmienkynový príkaz

end

Použitie týchto príkazov demonštruje tab. 2.1.9, ktorá uvádza ukážku určeniaznamienka daného čísla vľavo a vpravo ako aj určenia, či je dané číslo kladnéa párne alebo nepárne.

» x=5;» if x < 0 z = -1; elseif (x==0) z = 0;else z = 1;end» zz = 1

» n=10;» if n < 0 A = ['zaporne'];elseif rem(n,2) == 0 A = ['parne'];else A = ['neparne'];end» AA =parne

Tab. 2.1.9 Ukážky použitia príkazu if

Ak chceme z určitých dôvodov predčasne ukončiť slučky, ktoré MatLab robína základe príkazov for, while a if, môžeme to vykonať príkazom break alebosúčasným stlačením kláves CONTROL C.

28

2.2. Vektorové a maticové operácie

Základné operácie s vektormi a maticami ako aj operácie s nimi akos definovanými n-ticami sú predmetom nasledujúcej časti.

2.2.1. Vektorové operácie

N rozmerný vektor je v MatLabe definovaný ako riadkovo alebo stĺpcovousporiadaná n-tica čísiel v hranatých zátvorkách oddelených bodkočiarkami navytvorenie stĺpcového vektora.» X=[2; -4; 8] X = 2 -4 8 .

Ak jednotlivé prvky, ktoré môžu byť zapísané aj ako výrazy, sú oddelené ibamedzerami alebo čiarkami, potom je výsledkom riadkový vektor obsahujúcivypočítané zadané výrazy.» R = [sin(pi/6) sqrt(16) -3] R =

0.5000 4.0000 -3.0000 .

Transpozícia riadkového vektora (taktiež aj matice) na stĺpcový vektora opačne, sa dá uskutočniť pomocou apostrofu ( ‘ ).» Y = R' Y = 0.5000 4.0000 -3.0000 .

Vektory rovnakej veľkosti možno sčítať a odčítať, pričom tieto operácie sauskutočňujú s jednotlivými prvkami. To isté platí o násobení vektora skalárom.Napr.:» Q=3*Y Q = 1.5000 12.0000 -9.0000 .

29

Operátor ( .* ) vykonáva násobenie jednotlivých prvkov vektora. Napr. preuž definované vektory X a Y platí:» V = X .* Y V = 1.0000 -16.0000 -24.0000 .

Skalárny (vnútorný) súčin vektorov X a Y je skalárnou hodnotou definovanou

ako x yii

n

i′=∑

1 , takže:

» S=X' * Y S = -39 .

Dĺžka vektora v Euklidovskej norme ako druhá odmocnina vnútorného súčinuvektora a vektora samotného je v MatLabe definovaná príkazom norm. N=norm(X) N = 9.1652 .

Uhol medzi vektormi X a Y vypočítame na základe definície ( )YXYXcos

T=ϕ .

» fi = acos(X' * Y/(norm(X)*norm(Y))) fi = 2.5808 .

Príkazy zeros a ones umožňujú generovať nulový a jednotkový vektor, pričomdruhé číslo v zátvorke určuje počet prvkov ( dĺžku ) vektora.» N = zeros(1,3) N = 0 0 0

» U = ones(1,4) U = 1 1 1 1 .

Dvojbodka ( : ) sa používa na generovanie riadkového vektora s prírastkom 1,pokiaľ to nie je definované ináč:» x=1:6 x = 1 2 3 4 5 6 .

30

Definovanie prírastku vrátane záporného sa robí nasledujúcim príkazom:» u=0:pi/6:pi u = 0 0.5236 1.0472 1.5708 2.0944 2.6180 3.1416 .

» y = 10:-2:0 y = 10 8 6 4 2 0 . Veľkosť vektora určíme príkazom size. Ak aplikujeme tento príkaz napredchádzajúci vektor y, potom dostaneme dve hodnoty, kde prvá hodnota je privektore automaticky rovná jednej a udáva počet riadkov, resp. stĺpcov a druháhodnota udáva počet jeho prvkov:» y = 10:-2:0» size(y)ans = 1 6.

2.2.2. Maticové operácie

Matica sa v MatLabe vytvorí pomocou pravouhlého reťazca číslic uzavretýchv hranatých zátvorkách. Prvky v jednotlivých riadkoch sú oddelené čiarkami alebojednoducho medzerami. Jednotlivé riadky musia byť vzájomne oddelenébodkočiarkou (riadky matice sa môžu vložiť aj oddelene ako jednotlivé riadky, t.j.Enter na konci každého riadku). Tak, ako aj pri vektoroch, môže byť prvkommatice aj výraz. Napr.:» A = [1 2 3; 4 5 6; 9 8 7] A = 1 2 3 4 5 6 9 8 7 . Príkaz size umožňuje zistiť rozmer matice:» size(A)ans = 3 3 . Jednotlivé prvky matice sa dajú vyvolať do pracovného okna jednoduchýmzadaním matice a v zátvorkách udaný riadok a stĺpec žiadaného prvku:» A(3,2)ans = 8 .

31

Týmto spôsobom sa dá vymeniť aj hociktorý prvok matice.» A(3,2)=5;» AA = 1 2 3 4 5 6 9 5 7 .

Riadok matice sa dá vypísať príkazom s dvojbodkou ( : ) (pomôcka - znak “:”možno interpretovať ako všetky prvky):» r3 = A (3, :) r3 = 9 5 7 .

Podobne príkaz s2 = ( :, 2) vypíše všetky prvky druhého stĺpca matice A.

Ak sa do matice pridá prvok, ktorý presahuje rozmer matice, potom MatLabautomaticky doplní do novej matice nuly, ako chýbajúce prvky v príslušnomrozmere, pretože MatLab pracuje vždy s pravouhlými maticami.

» A(4,2)=7;» AA = 1 2 3 4 5 6 9 5 7 0 7 0 .

Príkaz logspace(x,y.n) vytvára vektor s n prvkami, ktoré sú rozmiestnené medzi10 10x ya . Tento príkaz je užitočný najmä pri vytváraní logaritmických závislostí.Podobne príkaz linspace je obdobný príkazu logspace až na to, že prvky vektora súmedzi sebou vzdialené lineárne.

Aby sme z novej matice A extrahovali len submaticu obsahujúcu druhý až tretíriadok a prvý až tretí stĺpec tejto matice (2x3), zadáme nasledujúci príkaz:» B=A(2:3,1:3)B = 4 5 6 9 5 7 . Pri manipulácii s maticou pomocou vektora, ktorý obsahuje len nuly a jednotky(k tomu dochádza veľmi často pri logických operáciách), nová matica obsahuje lenriadky a stĺpce matice, v ktorých má vektor jednotky, zatiaľ čo tie riadky a stĺpce,v ktorých má vektor nuly, nová matica neobsahuje.

32

C=B(:,[0 1 1])C = 5 6 5 7 .

MatLab obsahuje aj príkazy na generovanie špeciálnych typov matíc. Napr.príkaz diag nasledovaný vektorom s prvkami, ktoré majú byť prvkami hlavnejdiagonály matice, vytvára maticu:» D=diag([5 4 3])D = 5 0 0 0 4 0 0 0 3 .

Príkaz eye(4) vytvára jednotkovú maticu s rozmerom 4*4 a príkaz eye(B) opäťjednotkovú maticu, ale s tými istými rozmermi ako definovaná matica B. Príkazyzeros, ones a rand pracujú na podobnom princípe, ale generujú matice pozos-távajúce z núl, jednotiek a náhodných čísiel z intervalu (0 1). Tak napr. príkaz:» E=rand(2)E = 0.2190 0.6789 0.0470 0.6793 . Doteraz uvedené príkazy už možno použiť na vytvorenie formy riaditelnostimatice CF, zodpovedajúcej charakteristickému polynómu s s s s4 3 25 4 3 1+ + + + ,ktorý zapíšeme:CF=[zeros(3,1) eye(3); -1 -3 -4 -5]CF = 0 1 0 0 0 0 1 0 0 0 0 1 -1 -3 -4 -5 .

Pozn.: Ak je systém opísaný v stavovom priestore, potom jeho kanonickú formudostaneme pomocou príkazu canon [Ab,Bb,Cb,Db]=CANON(A,B,C,D,'type').

Operácie s maticami MatLab robí rovnako ľahko ako jednoduché aritmetickéoperácie. Sčítanie matíc G a H urobíme príkazom:» G=[5 0; 0 6]G = 5 0 0 6

» H=diag([1 2])H = 1 0 0 2

33

» G+Hans = 6 0 0 8 .

Rovnakým spôsobom ich aj vynásobíme, pričom pri násobení matíc musí súhla-siť ich vnútorný rozmer a výsledná matica má vonkajší rozmer násobených matíc.» G*Hans = 5 0 0 12 .

Ak teda násobíme maticu K s rozmerom 2*3 a maticu L s rozmerom 3*2, potom novámatica M má rozmer 2*2 (vonkajšie hodnoty súčinu K a L t.j. 2*3 x 3*2 = 2*2 ).

» K=[1 2 3; 9 8 7]K = 1 2 3 9 8 7

» L=[4 5; 6 7; 8 0]L = 4 5 6 7 8 0

» K*Lans = 40 19 140 101 .

Delenie matíc je podobné, až na to, že MatLab rozlišuje delenie sprava /a delenie zľava \ . V prípade, že máme riešiť rovnicu P x = Q, ktorej riešením jex P Q1= −

, použijeme delenie zľava a x vypočítame ako x=P\Q. Naopak, akmáme zadanú rovnicu, t.j. y P = Q, ktorej riešením je y QP 1= − , potom v MatLabepoužijeme delenie sprava, ktoré zapíšeme ako y=Q/P.

Pre operácie s maticami MatLab obsahuje aj ďalšie príkazy, z ktorých príkaz

det(X) vypočíta determinant štvorcovej matice Xinv(X) vypočíta inverznú maticu k matici Xrank(X) určí hodnosť matice Xeig(X) vypočíta vlastné čísla matice Xexpm(X) vypočíta eX

cond(X) určí podmienenosť maticepoly(X) vypočíta charakteristický polynóm matice X.

34

Pretože dosť často sa vyskytujú nedostatočne podmienené matice, je užitočnématicu, s ktorou pracujeme, vyšetriť príkazom cond. Logaritmus (pri základe 10)približne určuje koľko desatinných miest môžeme stratiť zaokrúhľovaním pri počí-taní nedostatočne podmienenej matice. Napr. nedostatočne podmienená matica,ďalej definovaná ako NPM, má hodnotu cond = 1e8 t.j. stratu 8 desatinných miest:

» NPM=[1 10000; 0 1]NPM = 1 10000 0 1

» cond(NPM)ans = 1.0000e+008 ,

pričom ale dostatočne podmienená matica má mať stratu len dve až tri desatinnémiesta.

Ak matica A má rozmer n*n, potom hodnoty λ, ktoré vyhovujú rovnicixλxA = , sú vlastné hodnoty matice A. Tieto v MatLabe nájdeme pomocou

funkcie eig(A) (eigenvalues). Vlastné hodnoty matice tvoria prvky diagonálymatice D, ktorá spĺňa rovnicu AX XD= . Vlastný vektor a vlastné hodnotymatice A môžeme vypočítať naraz pomocou príkazu [X, D] = eig( A ):» A=[1, 2, 3; 4, 5, 6; 9, 8, 7];» [X, D]=eig(A); X = 0.2437 -0.4781 -0.4082 0.5553 -0.3846 0.8165 0.7951 0.7896 -0.4082

D = 15.3459 0 0 0 -2.3459 0 0 0 0.0000 .

Ako už bolo spomenuté, MatLab umožňuje prácu aj s komplexnými číslamia imaginárna jednotka je definovaná až dvakrát ako premenné i a j , takže obe súrovné −1 . Vlastné hodnoty matice A z ďalej uvedeného pr. 2.2.2 sú:

» A = [2 1 0; 0 3 -2; 3 0 -1];» X = eig( A ) X = 2.7004 + 1.1286i 2.7004 - 1.1286i -1.4009 .

35

Na ukážku operácií s maticami nasleduje niekoľko príkladov.

Príklad 2.2.1: Vypočítajte determinant štvorcovej matice

=

3111131111311113

A

» A=[3 1 1 1; 1 3 1 1; 1 1 3 1; 1 1 1 3];

» d=det(A)d = 48 .

Príklad 2.2.2: Určite vektor X tak, aby vyhovoval podmienkam rovnice

2 1 00 3 23 0 1

4126

1

2

3

−−

=

xxx

» A = [2 1 0; 0 3 -2; 3 0 -1];» B = [4 12 6] ' ;» X = A \ B X = 1 2 -3 .

Príklad 2.2.3: Funkciou inv vypočítajte inverznú maticu k matici A a pomocou nejriešte predošlú sústavu rovníc.

» A = [2 1 0; 0 3 -2; 3 0 -1];» B = [4 12 6] ' ;» C = inv(A);» X = C*B X = 1 2 -3 .

36

Príklad 2.2.4: Nájdite riešenie systému lineárnych rovníc:x x xx x xx x x

1 2 3

1 2 3

1 2 3

2 3 53 4 5 102 5 7 9

+ − = −− + =+ − = −

.

Daný systém má tvar P x = Q, ktorého riešením je x P Q1= − , takže na výpočetpoužijeme delenie zľava x=P\Q, ale predtým vyšetríme aj podmienenosť matice P:» P=[1 2 -3; 3 -4 5; 2 5 -7]P = 1 2 -3 3 -4 5 2 5 -7

» Q=[-5 10 -9]';» Q= -5 10 -9

Podmienenosť matice P vyšetríme funkciou cond(P):

» cond(P)ans = 119.9840 ,

keďže matica je správne podmienená 1,19e2, riešenie systému nájdeme ako:

» P\Qans = 1.7500 9.7500 8.7500a riešením je x x a x1 2 3175 9 75 8 75= = =. ; . . .

Magický štvorec je maticou, ktorú dostaneme ako maticu N*N pozostávajúcuz celistvých (integer) hodnôt od 1 po N2 a ktorá má rovnakú sumu prvkovv riadkoch ako aj v stĺpcoch.

Takže po zadaní príkazu M=magic(3) nám MatLab vygeneruje magický štvorec:

M=magic(3)» M= 8 1 6 3 5 7 4 9 2 .

37

O vlastnostiach magického štvorca sa môžeme presvedčiť príkazom sum(M),ktorý vypočíta riadkový vektor obsahujúci sumu prvkov v jednotlivých stĺpcochmatice M.

» bv=sum(M)bv = 15 15 15 .

Keď chceme vypočítať sumu prvkov v jednotlivých riadkoch matice M,urobíme to najjednoduchšie ak maticu M najskôr transponujeme na maticu Npríkazom N=M' , čo vlastne znamená pootočenie matice M okolo jej hlavnejdiagonály. Potom urobíme sumu novej matice N, čo bude vlastne suma riadkovpredchádzajúcej matice M:

» N=M'N = 8 3 4 1 5 9 6 7 2

» cv=sum(N)cv = 15 15 15.

Výsledkom je opäť riadkový vektor cv, ktorý ukazuje, že aj súčet všetkých prvkovv riadkoch magického štvorca M je opäť 15.

Sumu prvkov hlavnej diagonály môžeme dostať výhodnou kombinácioufunkcií diag a sum. Funkcia diag(M) vytvorí stĺpcový vektor hdg pozostávajúciz prvkov hlavnej diagonály. Sčítaním jeho prvkov funkciou sum dostaneme súčetprvkov hlavnej diagonály.

» hdg=diag(M)hdg = 8 5 2

» shd=sum(diag(M))

shd =

15 .

Prvky antidiagonály, ktorá z matematického hľadiska už nie je taká dôležitá,môžeme vypočítať pomocou funkcie fliplr (otoč zľava do prava), ktorá bola v Mat-Labe pôvodne určená pre potreby grafiky. Sumu týchto prvkov určíme znova akopri hlavnej diagonále.

38

» LR=fliplr(M)LR = 6 1 8 7 5 3 2 9 4

» sum(diag(lr))

ans =

15 .

Tým sme sa presvedčili, že aj súčet prvkov antidiagonály je v magickom štvorcis rozmerom 3x3 rovný 15.

2.2.3. Operácie s maticami ako s n-ticami

V prípade, že potrebujeme pracovať s jednotlivými prvkami matice, (ako tomubolo napr. pri výpočte efektívnej hodnoty), potom použitie ( . ) pred príslušnýmoperátorom zmení maticové operácie na operácie s jednotlivými prvkami. Taknapr. operácia K.*L vráti:

» K=[1 2 3; 9 8 7]K = 1 2 3 9 8 7

» L=[4 5 6; 7 8 0]L = 4 5 6 7 8 0

» K.*Lans = 4 10 18 63 64 0 .

To isté platí aj o mocnine vektora a matice, čiže operácia (.^) vráti späť:

» V=[11 12 13 14 15];» Q=V.^2Q = 121 144 169 196 225 .

Na tomto mieste je vhodné pripomenúť, že niektoré maticové funkcieuskutočňujú operácie len s jednotlivými prvkami matíc automaticky. Napr. funkciaexp(X) vráti exponenciálnu hodnotu jednotlivých prvkov matice. Avšak keďchceme vypočítať hodnotu matice Xe , potom musíme použiť funkciu expm(X).Trigonometrické funkcie a iné elementárne matematické funkcie ako abs, sqrt,real a log, pracujú len ako operácie s jednotlivými prvkami.

39

Na princípe operácií s jednotlivými prvkami pracujú aj operátory obsiahnutév MatLabe. Napr. príkaz X=R<=S bude porovnávať každý prvok matice R sozodpovedajúcim prvkom matice S, pričom vráti maticu X, ktorá na miestachprvkov vyhovujúcim uvedenej podmienke bude mať hodnotu 1.

» R=[5 4; 2 1]R = 5 4 2 1

» S=[6 2; 0 2]S = 6 2 0 2

» X=R<=SX = 1 0 0 1 .

Logické operátory & pre AND, | pre OR a ~ pre NOT spoločne generujúhodnotu 1 pre pravdivý údaj a hodnotu 0 pre nepravdivý údaj. Tak napr. užporovnávané matice R a S po príkaze R&S generujú:

» R&Sans = 1 1

0 1.

40

2.3. Grafika MatLabu

MatLab má kvalitnú 2D a 3D grafiku, ktorá je kompatibilná s viacerýmitextovými editormi, takže grafické výstupy možno priamo použiť v textoch. Tátočasť sa preto zameriava na výpočet a ukážku možností grafického spracovaniavýsledkov v programovom prostredí MatLab od najjednoduchších grafov podvojrozmerné a trojrozmerné grafy.

2.3.1. Dvojrozmerné grafy

Najbežnejšie 2D grafy môžu byť lineárne, ktoré sa generujú príkazom plot,logaritmické generované príkazom loglog, semilogaritmické generované príkazmisemilogx a semilogy alebo polárne príkazom polar. Príkaz grid vytvára vhodnýraster grafu. Príkazy title, xlabel a ylabel umožňujú dať grafickému výsledkutitulok a popis osí. Umiestnenie textu v obrázku umožňuje príkaz gtext. SyntaxMatLabu tiež umožňuje vytvárať grafy s rozlíšením druhu čiary, ako ajnadefinovať farbu čiary v grafe:

.ox+*:-.--

bodkovanékrúžkovanékrížkovanékrížikovanéhviezdičkovanédvojbodkovanébodkočiarkovanéčiarkované

ymcrgbwk

žltá (yellow)fialová (magenta)tyrkysová (cyan)červená (red)zelená (green)modrá (blue)biela (white)čierna (black)

Možnosti grafiky MatLabu, ale aj využitie niektorých doteraz preberanýchpríkazov v súvislosti s príkazom plot aspoň čiastočne demonštruje nasledujúcipríklad.

Príklad 2.3.1: Zostavte graf pre súbor teplotných údajov za jednotlivé mesiace roka,ktorý má v ASCII formáte názov teplota.dat (pre šetrenie miestom sú stĺpcovévektory nahradené riadkovými):

1 2 3 4 5 6 7 8 9 10 11 12-12,5 -7,5 -2,25 3,5 8,5 17,5 25 27,5 22 12,5 5,5 1,5 .

41

Pri grafickom spracovaní daného dátového súboru postupujeme nasledovne:» load teplota.dat; % ukladá sa matica 12x2» x =teplota (:,1); % prvky 1. riadku sa priradia k premennej x» tepl =teplota (:,2); % prvky 2. riadku sa priradia k premennej teplmonth = ['Jan'; 'Feb'; 'Mar'; 'Apr'; 'May'; 'Jun'; 'Jul'; 'Aug'; 'Sep'; 'Oct'; 'Nov'; 'Dec'];

% k jedn. hodnotám sa priradí mesiac pre popis» plot(x,tepl,'o'); % vykreslí sa krúžkový graf tepl=f(x)» axis([0 12 -20 30]),grid; % určia sa mierky pre osi a raster» text(x,tepl,month); % jedn. hodnoty sa popíšu názvom mesiacov» title('Stredna Teplota'); % titulok pre graf» xlabel('mesiac'); % opis pre os x» ylabel('teplota [C]'); % opis pre os y.

Tieto príkazy sú zapísané v súbore tepleval.m, ktorý umožní spracovanie danéhodátového súboru automaticky, takže výsledkom je graf na obr. 2.3.1. Keďže popríkaze tepleval sú v pracovnom priestore uložené premenné moth, tepl, teplota a x,dostaneme podobný graf po príkazoch plot(x,tepl,’x’),grid; a text(x,tepl,month).

0 2 4 6 8 10 12-20

-15

-10

-5

0

5

10

15

20

25

30

mesiac

teplota [C]

Stredna Teplota

Jan

Feb

Mar

Apr

May

Jun

JulAug

Sep

Oct

Nov

Dec

Obr. 2.3.1 Znázornenie dátového súboru so strednými teplotami

Ďalšie príklady 2D grafiky, ktorými sú: tyčový graf - bar(tepl) , steblový graf -stem(tepl) , schodovitý - stairs(tepl) a pásový graf - ribbon(tepl) , (tento bol vybranýlen ako jedna možnosť z veľkého množstva, ktoré poskytuje verzia MatLab v.6), súna obr. 2.3.2.

42

0 2 4 6 8 10 12 14-15

-10

-5

0

5

10

15

20

25

30

0 2 4 6 8 10 12-15

-10

-5

0

5

10

15

20

25

30

a) príkaz bar(tepl) b) príkaz stem(tepl)

0 2 4 6 8 10 12-15

-10

-5

0

5

10

15

20

25

30

0.6

0.8

1

1.2

1.4

0

5

10

15

-20

-10

0

10

20

30

c) príkaz stairs(tepl) d) príkaz ribbon(tepl)

Obr. 2.3.2 Možnosti 2D grafiky v MatLabe

Ako už bolo spomenuté v časti opisujúcej prácu s polynómami, funkciaMatLabu polyfit(x,y,d) umožňuje náhradu danej funkcie y = f(x) polynómomzvoleného stupňa d, všeobecne:

( )p x c x c x cd dn= + + +−

1 21 ... ,

takže MatLab vráti (d+1) koeficientov podľa znižujúcej sa mocniny náhradnéhopolynómu. Vyhodnocovanie polynómu rádu d v bodoch x umožňuje funkciapolyval(d,x) , ktorá vypočíta hodnoty polynómu v bodoch x.

43

Príklad 2.3.2: Nájdite náhradu funkcie mesačnej priemernej teploty polynómomdruhého až štvrtého stupňa a príslušný polynóm znázornite graficky.

Postupom riešenia úlohy je sekvencia príkazov, ktorej výsledok ukazuje obr. 2.3.3.» polyfit(x,tepl,2)ans = -0.9015 13.5775 -30.9830» z2 = -.9015*x.*x + 13.5775*x - 30.9830;» polyfit(x,tepl,3)ans =-0.0988 1.0246 3.1566 -17.5000» d3 = ans;» z3 = polyval(d3,x);» polyfit(x,tepl,4)ans = 0.0234 -0.7079 6.2625 -13.4642 -2.8807» d4 = ans;» z4 = polyval(d4,x);» plot(x,tepl,'o', x,z2,':', x,z3,'-.', x,z4,'--');» text(x,tepl,month);» xlabel('mesiac'),ylabel('teplota [C]'),title('Nahrada strednej teploty polynomom');» axis([0 12 -20 30]),grid;» gtext('2.st. bodkovana'),gtext('3.st. bodkociarkovana'),gtext('4.st. ciarkovana').

0 2 4 6 8 10 12-20

-15

-10

-5

0

5

10

15

20

25

30

mesiac

teplota [C]

Nahrada strednej teploty polynomom

Jan

Feb

Mar

Apr

May

Jun

JulAug

Sep

Oct

Nov

Dec

2.st. bodkovana

3.st. bodkociarkovana

4.st. ciarkovana

Obr. 2.3.3 Náhrada údajov polynómom druhého až štvrtého rádu

44

Niekoľko grafických okien a tým aj možnosť zobraziť v jednotlivých oknáchviacero funkčných závislostí je možné vytvoriť príkazom subplot(xyz), v ktorom(x) udáva počet riadkov, (y) udáva počet stĺpcov a (z) poradie príslušných okien.Nasledujúci príklad ukazuje použitie tohoto príkazu, ako aj príkazov real a imagsúvisiacich s komplexnými číslami.

Príklad 2.3.3: Vypočítajte a znázornite Parkov vektor napätí trojfázovej súmernejsústavy, ktorý umožňuje zobraziť jej veličiny v komplexnej rovine a jedefinovaný ako:

( )32

21P uau*au*132U ++= ,

pričom definície jednotlivých napätí a jednotkových vektorov sú dané priamov prvej časti programu:

» wt=0:0.01:10;» Um=10; shift=2*pi/3; k=2/3; a=0.5*(-1 + j*sqrt(3)); aa=0.5*(-1 - j*sqrt(3));» u1=Um*sin(wt);» u2=Um*sin(wt-shift);» u3=Um*sin(wt+shift);» UP=k*(u1 + a*u2 + aa*u3);» UPre=real(UP);» UPim=imag(UP);» subplot(221), plot(wt,u1, wt,u2,':', wt,u3,'--'), axis([0 10 -15 15]), grid,title('Voltage');» gtext('u [V]'), gtext('angle [rad]');» subplot(222),plot(wt,UPre,':', wt,UPim,'--'), axis([0 10 -15 15]), grid, title('ParkVoltage');» gtext('u [V]'), gtext('angle [rad]');» subplot(223),plot(wt,u1,':', wt,UPre,'--'), axis([0 10 -15 15]), grid, title('u1 andUPre');» gtext('u [V]'),gtext('angle [rad]');» subplot(224),plot(UPre,UPim),axis([-15 15 -15 15]), grid, title('Polar Graph');» gtext('u [V]'),gtext('u [V]');

Zadanú úlohu rieši program parkgraf.m . Jeho výsledkom sú štyri grafickéokná na obr. 2.3.4, ktoré sa však objavujú postupne, až keď sú do jednotlivýchokien vložené príslušné poznámky definované príkazom gtext (označenia osí, takako to ukazuje nasledujúci obr. 2.3.4).

45

0 5 10-15

-10

-5

0

5

10

Voltage

u [V]

angle [rad]

0 5 10-15

-10

-5

0

5

10

Complex Park Voltage

u [V]

angle [rad]

0 5 10-15

-10

-5

0

5

10

u1 and UP{re}

u [V]

angle [rad]-10 0 10

-15

-10

-5

0

5

10

Polar Graph

u [V]

u [V]

subplot(221) subplot(222)

subplot(223) subplot(224)

Obr. 2.3.4 Napätie trojfázovej súmernej sústavy v časovej a komplexnej oblasti

Takýmto spôsobom (t.j. príkazmi subplot(331) až subplot(339)) možno vytvoriťv grafickom okne MatLabu až deväť rozličných grafov.

Veľmi pohodlné zobrazovanie komplexných čísel umožňuje funkcia compass.Nasledujúci graf na obr. 2.3.5 vytvárajú príkazy:» a=(3+1*i), b=(1+4*i); c=(a+b), Z=[a b c];» compass(Z),grid, gtext('{Real}'),gtext('{Imag.}'), gtext('a'),gtext('b'),gtext('c=a+b')

-2 0 2 4-1

0

1

2

3

4

5

{Real.}

{Imag.}

a

b

c=a+b

Obr. 2.3.5 Zobrazenie komplexných čísiel pomocou funkcie compass

Pozn.: Pre MatLab v.6 sa údaje pre funkciu compass zobrazujú v polárnych súradniciach.

46

Stúpajúca a klesajúca exponenciálna funkcia s časovou konštantou T=0,1 s prečasový rozsah t∈ (0, 0,5) s je na obr. 2.3.6 pre rozličné definované grafickézávislosti.

Tieto boli vytvorené ďalej uvedenou sekvenciou príkazov a potom grafickyzobrazené príkazmi: plot, semilogy, loglog a semilogx.

» x=0:0.005:0.5;» y=(1-exp(-x/T));» z=exp(-x/T);

0 0 .1 0 .2 0.3 0.4 0.50

0 .1

0 .2

0 .3

0 .4

0 .5

0 .6

0 .7

0 .8

0 .9

1

0 0.1 0.2 0.3 0.4 0.510-3

10-2

10-1

100

a) plot(x,y, x,z),grid b) semilogy(x,z, x,z),grid

1 0 -3 1 0-2 1 0 -1 1 0 01 0-3

1 0-2

1 0-1

1 00

10-3 10-2 10 -1 10 00

0 .2

0 .4

0 .6

0 .8

1

c) loglog(x,y, x,z),grid d) semilogx(x,y, x,z),grid

Obr. 2.3.6 Stúpajúca a klesajúca exponenciála v rozličných stupniciach

47

2.3.2. Trojrozmerné grafy

MatLab ponúka viacero možností trojrozmerných grafov. Nasledujúcepríklady ukážu použitie aspoň niekoľkých z nich. Napr. ozva na príkaz plot3 sanajlepšie vysvetlí na príklade.

Príklad 2.3.4: Vypočítajte a vykreslite funkciu danú parametrickými rovnicami( ) ( )x t y t z t= = =sin ; cos ; .

M-súbor s názvom valcspir.m vypočíta a vykreslí požadované funkčné závislostiv rozsahu ( )t ∈ 0 10, π s krokom -pi/30. Výsledok je na obr. 2.3.7.

t=10*pi:-pi/30:0;x=sin(t);y=cos(t);z=t;plot3(x,y,z),grid;

-1-0.5

00.5

1

-1-0.5

00.5

10

10

20

30

40

Obr. 2.3.7 Trojrozmerné zobrazenie pomocou príkazu plot3 parametrickejfunkcie danej ako ( ) ( )x t y t a z t= = =sin , cos

Pomocou príkazov moviein a getframe možno vypočítať a nasnímať p-rámovobrázku, ktoré príkaz movie uvedie do postupnosti, takže konečným výsledkom jepohybujúci sa trojrozmerný obrázok.

48

Príklad 2.3.5: V rozsahu ( )t ∈ 0 10, π vypočítajte a animujte pomocou 4 rámovfunkciu danú parametrickými rovnicami:

( )

( )tz

tcosey

tsinex

Tt

Tt

==

=−

.

Ďalšou úlohou je, aby sa vypočítaná animácia zobrazila päťkrát. SúborMatLabu s názvom spirapoh.m rieši túto úlohu. Výsledok posledného rámu poanimácii je na obr. 2.3.8.

T=20;M=moviein(4);for p=1:4t=0:pi/30:10*pi;x=exp(-t/T).*sin(t-p);y=exp(-t/T).*cos(t-p);z=t;plot3(x,y,z),grid,axis([-1 1 -1 1 -5 25]);M(:,p) = getframe;endmovie(M,5)

-1-0.5

00.5

1

-1-0.5

00.5

1-5

0

5

10

15

20

25

Obr. 2.3.8 Trojrozmerné zobrazenie posledného rámu animovanej parametrickej

funkcie ( ) ( ) tzatcosey,tsinex Tt

Tt

===−−

49

Iný spôsob vytvárania trojrozmerných grafov umožňuje funkcia mesh.S veľkou výhodou je ju možné využiť na zobrazovanie matíc. Napríkladzobrazenie matice C pozostávajúcej z núl, kladných a záporných jednotiekdefinovanej v nasledujúcom riadku príkazom mesh( C ) ukazuje obr. 2.3.9.» C=[zeros(4,12); (-1)*ones(4), zeros(4), ones(4); zeros(4,12)];» mesh(C),grid

05

1015

0

5

10

15-1

-0.5

0

0.5

1

Obr. 2.3.9 Zobrazenie matice C pomocou funkcie mesh

Funkcia Z = sin(R)./R, uvedená na obr. 2.3.10, je vytvorená pomocou matice Rdefinovanej ako R=sqrt(X.^2 + Y.^2) + eps , kde ε je malé číslo (definovanév odst. 2.1 ako eps=2,2204 e-016). Matica X ako jedna časť matice R je uvedenáv nasledujúcej tabuľke, pričom matica Y je obdobná. Obe boli vytvorené funkcioumeshdom (pre MatLab v6 funkcia meshgrid), ktorá transformovala množinu prvkovurčenú riadkovým vektorom x a stĺpcovým vektorom y na doménu reprezentujúcuzákladňu pre vytvorenie trojdimenzionálneho perspektívneho grafu, ktorýzodpovedá príkazu mesh.» x=-1.5:0.25:1.5;» y=x';» [X Y]=meshdom(x,y);» R=sqrt(X.^2 + Y.^2) + eps;» Z = sin(R)./R;» mesh(Z), grid, title(' mesh Z= sin(R)./R ');» pause» contour(Z),grid, title(' gradient Z= sin(R)./R ');» pause» gradient(Z),grid;» [xx yy]=gradient(Z, .2, .2);» quiver(x, y, xx, yy, 2), title(' gradient Z= sin(R)./R ');

50

X =-1.5000 -1.0000 -0.5000 0 0.50001.0000 1.5000-1.5000 -1.0000 -0.5000 0 0.50001.0000 1.5000-1.5000 -1.0000 -0.5000 0 0.50001.0000 1.5000-1.5000 -1.0000 -0.5000 0 0.50001.0000 1.5000-1.5000 -1.0000 -0.5000 0 0.50001.0000 1.5000-1.5000 -1.0000 -0.5000 0 0.50001.0000 1.5000-1.5000 -1.0000 -0.5000 0 0.50001.0000 1.5000

R =2.1213 1.8028 1.5811 1.5000 1.58111.8028 2.12131.8028 1.4142 1.1180 1.0000 1.11801.4142 1.80281.5811 1.1180 0.7071 0.5000 0.70711.1180 1.58111.5000 1.0000 0.5000 0.0000 0.50001.0000 1.50001.5811 1.1180 0.7071 0.5000 0.70711.1180 1.58111.8028 1.4142 1.1180 1.0000 1.11801.4142 1.80282.1213 1.8028 1.5811 1.5000 1.58111.8028 2.1213

05

1015

0

5

10

150.4

0.5

0.6

0.7

0.8

0.9

1

mesh Z=sin(R)./R

Obr. 2.3.10 Zobrazenie funkcie Z = sin(R)./R príkazom mesh

51

Prierezy plochou, ktorá je určená už definovanou funkciou Z=sin(R)./R resp.gradienty tejto funkcie, možno vidieť na nasledujúcom obr. 2.3.11, v ktorom sú vy-užité príkazy contour a gradient.

2 4 6 8 10 12

2

4

6

8

10

12

contour Z= sin(R)./R

a)

-1.5 -1 -0.5 0 0.5 1 1.5-1.5

-1

-0.5

0

0.5

1

1.5 gradient Z= sin(R)./R

b)

Obr. 2.3.11 Zobrazenie funkcie Z = sin(R)./R príkazom contoura príkazom quiver

52

Grafy, uvedené ako obr. 2.3.10 a obr. 2.3.11 sú zapísané vo forme skript-súborusinoid.m a možno si ich prezrieť v grafickom okne MatLabu po vpísaní príkazusinoid do príkazového okna. Medzi jednotlivými grafmi je vždy vložený príkazpause, takže grafy sa objavia až po stlačení ľubovoľnej klávesy.

Trojdimenzionálne možnosti demonštruje aj obr. 2.3.12, ktorý používa vlastnúfunkciu MatLabu cylinder.m v nasledujúcej sekvencii príkazov:» t=0:pi/12:pi;» [X, Y, Z]=cylinder(4*cos(t));» mesh(X,Y,Z), grid

-4-2

02

4

-4-2

02

40

0.2

0.4

0.6

0.8

1

Obr. 2.3.12 Trojrozmerný graf funkcie [X, Y, Z]=cylinder(4*cos(t))