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

38 

Texto

(1)

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éaa veľké písmenoA 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)

výrazom         − − T t e

1 , 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 sa vyhodnotí, ale na obrazovke sa neobjaví. Jeho hodnotu možno vyvolať napísaním prí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 tie zase majú prednosť pred sčítaním + a odčítaním -. Poradie vykonávania algebraických operácií demonštruje nasledujúca ukážka:

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

Automaticky nastavený formát zobrazenia výsledku (format short) zobrazuje vypočítaný výsledok ako 5-číselný znak. Príkazy format short e, format long a format long e zobrazia výsledok v pohyblivej čiarke (floating point) ako 15 číslic v pevnej čiarke (fixed point) a ako 15 číslic v pohyblivej čiarke. Napr. hodnota Ludolphovho čí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

(3)

Pre väčšiu pružnosť v zobrazovaní výsledku príkaz fprintf zobrazuje výsledok na 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 číslicami po 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 zadanie určitej hodnoty príkazom input možno vykonať nasledovne

:

» R = input('Zadaj polomer v metroch') %p

očítač zobrazí textový reťazec

Zadaj polomer v metroch %

čaká na zadanie

» 20 %k

toré potom uloží ako premennú R

R = 20.

Z ďalších príkazov napr. príkaz pause spôsobí zastavenie výpočtu, ale len do stlač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íkaze keyboard sa v príkazovom riadku objaví aj písmeno K» ako upozornenie na tento pracovný 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 keyboard môž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 patria hlavne premenné i a j, ktoré obe predstavujú imaginárnu jednotku. Táto je definovaná 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 je vypočítaná komplexná impedancia sériového R-L obvodu a komplexná admitancia sériového R-C obvodu spolu s amplitúdami a fázovým posunom prúdov v ustálenom stave, keď sa pripoja na zdroj sínusového napätia s amplitúdou Um=10 V a 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.

(4)

a)

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

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

» Ampl_I=Um/Z %amplitúda prúdu Ampl_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 oneskorenia t_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. admitancia y = 10.0000 -31.8471i

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

» Ampl_I=Um/Y % amplitúda prúdu Ampl_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 oneskorenia t_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 pre prvky matice, pretože novým nadefinovaním, napr. i=1 sa zmení hodnota i z hodnoty 1 na 1. Ak chceme znovu obnoviť vopred nadefinovanú hodnotu premennej 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

:

pi

eps

realmin

realmax

Inf

NaN

% 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

,

(5)

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 iba varovanie. 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/Inf m = 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íklad funkcia 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 alebo textová premenná. Napr. výraz d1

» d1='dnes' % má za výsledok d1 =

dnes,

to znamená, že text je uložený ako vektor, t.j. každé písmeno ako jeden prvok vektora, 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 =

(6)

Nový výraz, ktorý vznikne zlúčením výrazu d1 a novo definovaným výrazom ako d2, 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ívne rozš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í sa musia uložiť do prostredia MatLabu. Príkazy obsiahnuté v takomto súbore sa vyhodnocujú automaticky po napísaní mena súboru do príkazového riadku. Tak napr. m-súbor “mojprvy.m” počíta absolútnu hodnotu a uhol ľubovoľného komplexné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 čísla

disp('realna cast'); % požiadavka na zadanie reálnej zložky

re = input('re = '); re % v pracovnom poli sa objaví zadaná reálna zložka disp('imag. cast'); % požiadavka na zadanie imaginárnej zložky im = input('im = '); im % v pracovnom poli sa objaví zadaná imag. zložka KC = re + j*im; % definícia komplexného čísla ako KC

ampl=abs(KC) % výpočet abs. hodnoty pomocou m-funkcie abs.m uhol=atan(imag(KC)/real(KC)) % výpočet uhlu v rad pomocou m-funkcie atan.m » mojprvy realna cast re = 3 re = 3 imag. cast im = 4; ampl = 5 uhol = 0.9273 » mojprvy realna cast re = sqrt(3) re = 1.7321 imag. cast im = 1; ampl = 2 uhol = 0.5236

(7)

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 jej konkrétnu hodnotu. Tak napr. po zadaní prvého príkladu sa po príkaze who objaví

:

» who

Your variables are:

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 do pracovného okna riadky programu 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ýchlu orientáciu v prostredí MatLab je výhodné si vytvoriť vlastný adresár, ku ktorému je však nutné definovať cestu v súbore matlabrc.m. Pre MatLab verzia 6 a vyššie sa 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 function v prvom príkazovom riadku a definíciu vstupnej a výstupnej premennej. Meno sú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 funkcie a preto musia byť pri volaní funkcie vždy definované (priradené v zátvorkách) a sú funkciou ďalej spracovávané.

(8)

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 aj v 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 s

v ď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 pre novovytvorenú funkciu spracovať aj komentár, ktorý uľahčí jej použitie aj po dlhš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 hodnoty sí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á pre

vektor 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.

(9)

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čom musíme zapísať aj nulové. Napr. polynóm p = s4 + 2s3 +5s + 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ámych koreňov pomocou funkcie poly:

» p1=poly([-1 -2]) p1 =

1 3 2 .

Keď je vstupom do funkcie poly matica, potom táto funkcia vracia koeficienty jej 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 p1 = +s 1,

2 s

(10)

» 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ómy nadefinované 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ý. Ak zmeníme polynóm p3=s2+3s+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 to len možné. Napriek tomu sa však pri zložitejších úlohách tomuto problému nevyhneme. Preto MatLab tak, ako iné programovacie jazyky, pozná pre vytvorenie slučiek príkazy for, testovaciu podmienku while a pre podmienku príkaz if a break.

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

n=3;

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

(11)

Na zlepšenie orientácie v programe je dobré slučku rozpísať do jednotlivých riadkov, pretože ak výpočet obsahuje viac slučiek (dokonca vzájomne sa prekrý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 ich prí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 » A A = 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 tento vý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 svoje opakovanie, 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.

(12)

Demonštruje to aj nasledujúca ukážka v tab.2.1.7, ktorá výpočítava n+1 prirodzený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 » n

n = 4

» n = 1;

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

n = 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á ukazuje výpočet eA, 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 E ako 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 » E E = 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

(13)

Podmienka if má všeobecný tvar: if relácia 1

príkaz elseif relácia 2

príkaz 2

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

end

Použitie týchto príkazov demonštruje tab.2.1.9, ktorá uvádza ukážku určenia znamienka 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 » z z = 1 » n=10; » if n < 0 A = ['zaporne']; elseif rem(n,2) == 0 A = ['parne']; else A = ['neparne']; end » A A =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 alebo súčasným stlačením kláves CONTROL C.

(14)

2.2.

Vektorové a maticové operácie

Základné operácie s vektormi a maticami ako aj operácie s nimi ako s 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ĺpcovo usporiadaná n-tica čísiel v hranatých zátvorkách oddelených bodkočiarkami na vytvorenie 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é iba medzerami alebo čiarkami, potom je výsledkom riadkový vektor obsahujúci vypočí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ý vektor a 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 sa uskutočň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.

(15)

Operátor ( .* ) vykonáva násobenie jednotlivých prvkov vektora. Napr. pre už 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 y

i i n i ′=

1 , takže: » S=X' * Y S = -39 .

Dĺžka vektora v Euklidovskej norme ako druhá odmocnina vnútorného súčinu vektora 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

( )

Y X Y X cosϕ= 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čom druhé čí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 =

(16)

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 na predchádzajúci vektor y, potom dostaneme dve hodnoty, kde prvá hodnota je pri vektore 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ých v hranatých zátvorkách. Prvky v jednotlivých riadkoch sú oddelené čiarkami alebo jednoducho 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ť prvkom matice 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ým zadaním matice a v zátvorkách udaný riadok a stĺpec žiadaného prvku:

» A(3,2) ans = 8 .

(17)

Týmto spôsobom sa dá vymeniť aj hociktorý prvok matice. » A(3,2)=5; » A A = 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 MatLab automaticky doplní do novej matice nuly, ako chýbajúce prvky v príslušnom rozmere, pretože MatLab pracuje vždy s pravouhlými maticami.

» A(4,2)=7; » A A = 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é medzi 10x a10y. 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 len riadky 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.

(18)

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 hlavnej diagoná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íkazy zeros, 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 riaditelnosti matice CF, zodpovedajúcej charakteristickému polynómu s4+5s3 + 4s2 + 3s +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ú formu dostaneme 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

(19)

» G+H ans = 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*H

ans = 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*L ans = 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 je x P Q=1 , použijeme delenie zľava a x vypočítame ako x=P\Q. Naopak, ak

máme zadanú rovnicu, t.j. y P = Q, ktorej riešením je y =QP1, potom v MatLabe

použ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 X

inv(X) vypočíta inverznú maticu k matici X rank(X) určí hodnosť matice X

eig(X) vypočíta vlastné čísla matice X expm(X) vypočíta eX

cond(X) určí podmienenosť matice

(20)

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ú rovnici x

λ x

A = , sú vlastné hodnoty matice A. Tieto v MatLabe nájdeme pomocou funkcie eig(A) (eigenvalues). Vlastné hodnoty matice tvoria prvky diagonály matice D, ktorá spĺňa rovnicu

AX XD

=

. Vlastný vektor a vlastné hodnoty matice 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 číslami a 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 .

(21)

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

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

          = 3 1 1 1 1 3 1 1 3 1 1 1 1 1 1 3 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 0 0 3 2 3 0 1 4 12 6 1 2 3 − −                     =           x x x » 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 nej rieš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 .

(22)

Príklad 2.2.4: Nájdite riešenie systému lineárnych rovníc: x x x x x x x x x 1 2 3 1 2 3 1 2 3 2 3 5 3 4 5 10 2 5 7 9 + − = − − + = + − = − .

Daný systém má tvar P x = Q, ktorého riešením je x P Q=1 , takže na výpočet

použ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\Q

ans =

1.7500

9.7500

8.7500

a riešením je

x1=175. ; x2 = 9 75. a x3=8 75.

.

Magický štvorec je maticou, ktorú dostaneme ako maticu N*N pozostávajúcu z celistvých (integer) hodnôt od 1 po N2 a ktorá má rovnakú sumu prvkov v 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 .

(23)

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ĺpcoch matice 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 N príkazom N=M' , čo vlastne znamená pootočenie matice M okolo jej hlavnej diagonály. Potom urobíme sumu novej matice N, čo bude vlastne suma riadkov predchá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 prvkov v riadkoch magického štvorca M je opäť 15.

Sumu prvkov hlavnej diagonály môžeme dostať výhodnou kombináciou funkcií diag a sum. Funkcia diag(M) vytvorí stĺpcový vektor hdg pozostávajúci z prvkov hlavnej diagonály. Sčítaním jeho prvkov funkciou sum dostaneme súčet prvkov 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 ako pri hlavnej diagonále.

(24)

» 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 štvorci s 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 tomu bolo napr. pri výpočte efektívnej hodnoty), potom použitie ( .) pred príslušným operátorom zmení maticové operácie na operácie s jednotlivými prvkami. Tak napr. 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.*L

ans =

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.^2

Q =

121 144 169 196 225 .

Na tomto mieste je vhodné pripomenúť, že niektoré maticové funkcie uskutočňujú operácie len s jednotlivými prvkami matíc automaticky. Napr. funkcia exp(X) vráti exponenciálnu hodnotu jednotlivých prvkov matice. Avšak keď chceme vypočítať hodnotu matice eX, 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.

(25)

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 so zodpovedajúcim prvkom matice S, pričom vráti maticu X, ktorá na miestach prvkov 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<=S X = 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&S

ans =

1 1

(26)

2.3.

Grafika MatLabu

MatLab má kvalitnú 2D a 3D grafiku, ktorá je kompatibilná s viacerými textový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 spracovania výsledkov v programovom prostredí MatLab od najjednoduchších grafov po dvojrozmerné 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íkazmi semilogx 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ýsledku titulok a popis osí. Umiestnenie textu v obrázku umožňuje príkaz gtext. Syntax MatLabu tiež umožňuje vytvárať grafy s rozlíšením druhu čiary, ako aj nadefinovať farbu čiary v grafe:

. o x + * : -. --bodkované krúžkované krížkované krížikované hviezdičkované dvojbodkované bodkočiarkované čiarkované y m c r g b w k ž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ých príkazov v súvislosti s príkazom plot aspoň čiastočne demonštruje nasledujúci prí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):

(27)

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 tepl month = ['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ého dátového súboru automaticky, takže výsledkom je graf na obr.2.3.1. Keďže po prí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 Jul Aug 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.

(28)

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, funkcia MatLabu polyfit(x,y,d) umožňuje náhradu danej funkcie y = f(x) polynómom zvoleného stupňa d, všeobecne:

( )

p x

c x

d

c x

d

c

n

=

+

+

+

1 2 1

...

,

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

(29)

Príklad 2.3.2: Nájdite náhradu funkcie mesačnej priemernej teploty polynómom druhé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 Jul Aug Sep Oct Nov Dec 2.st. bodkovana 3.st. bodkociarkovana 4.st. ciarkovana

(30)

Niekoľko grafických okien a tým aj možnosť zobraziť v jednotlivých oknách viacero 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 imag súvisiacich s komplexnými číslami.

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

(

1 2 2 3

)

P 31*u a*u a u

2

U = + + ,

pričom definície jednotlivých napätí a jednotkových vektorov sú dané priamo v 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('Park Voltage');

» gtext('u [V]'), gtext('angle [rad]');

» subplot(223),plot(wt,u1,':', wt,UPre,'--'), axis([0 10 -15 15]), grid, title('u1 and UPre');

» 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ých okien vložené príslušné poznámky definované príkazom gtext (označenia osí, tak ako to ukazuje nasledujúci obr.2.3.4).

(31)

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.

(32)

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 graficky zobrazené 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 .5 0 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 .5 1 0-3 1 0-2 1 0-1 1 00

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

b) semilogy(x,z, x,z),grid

1 0-3 1 0-2 1 0-1 1 00 1 0-3 1 0-2 1 0-1 1 00 1 0-3 1 0-2 1 0-1 1 00 0 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

(33)

2.3.2.

Trojrozmerné grafy

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

Príklad 2.3.4: Vypočítajte a vykreslite funkciu danú parametrickými rovnicami

(

)

(

)

x = sin ;t y = cos ;t z = t.

M-súbor s názvom valcspir.m vypočíta a vykreslí požadované funkčné závislosti v 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 0 0.5 1 -1 -0.5 0 0.5 1 0 10 20 30 40

Obr.

2.3.7 Trojrozmerné zobrazenie pomocou príkazu plot3 parametrickej

funkcie danej ako

x = sin ,

(

t

)

y = cos

(

t

)

a z = t

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

(34)

Príklad 2.3.5: V rozsahu t ∈

(

0 10, π

)

vypočítajte a animujte pomocou 4 rámov funkciu danú parametrickými rovnicami:

( )

( )

t z t cos e y t sin e x T t T t = = = − −

.

Ďalšou úlohou je, aby sa vypočítaná animácia zobrazila päťkrát. Súbor MatLabu s názvom spirapoh.m rieši túto úlohu. Výsledok posledného rámu po animácii je na obr.2.3.8. T=20; M=moviein(4); for p=1:4 t=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; end movie(M,5) -1 -0.5 0 0.5 1 -1 -0.5 0 0.5 1 -5 0 5 10 15 20 25

Obr.2.3.8 Trojrozmerné zobrazenie posledného rámu animovanej parametrickej funkcie x e sin

( )

t ,y eT cos

( )

t az t

t T t = = = − −

(35)

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íklad zobrazenie matice C pozostávajúcej z núl, kladných a záporných jednotiek definovanej 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 0 5 10 15 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 R definovanej 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é funkciou meshdom (pre MatLab v6 funkcia meshgrid), ktorá transformovala množinu prvkov určenú riadkovým vektorom x a stĺpcovým vektorom y na doménu reprezentujúcu zá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);

(36)

X = -1.5000 -1.0000 -0.5000 0 0.5000 1.0000 1.5000 -1.5000 -1.0000 -0.5000 0 0.5000 1.0000 1.5000 -1.5000 -1.0000 -0.5000 0 0.5000 1.0000 1.5000 -1.5000 -1.0000 -0.5000 0 0.5000 1.0000 1.5000 -1.5000 -1.0000 -0.5000 0 0.5000 1.0000 1.5000 -1.5000 -1.0000 -0.5000 0 0.5000 1.0000 1.5000 -1.5000 -1.0000 -0.5000 0 0.5000 1.0000 1.5000 R = 2.1213 1.8028 1.5811 1.5000 1.5811 1.8028 2.1213 1.8028 1.4142 1.1180 1.0000 1.1180 1.4142 1.8028 1.5811 1.1180 0.7071 0.5000 0.7071 1.1180 1.5811 1.5000 1.0000 0.5000 0.0000 0.5000 1.0000 1.5000 1.5811 1.1180 0.7071 0.5000 0.7071 1.1180 1.5811 1.8028 1.4142 1.1180 1.0000 1.1180 1.4142 1.8028 2.1213 1.8028 1.5811 1.5000 1.5811 1.8028 2.1213 0 5 10 15 0 5 10 15 0.4 0.5 0.6 0.7 0.8 0.9 1 mesh Z=sin(R)./R

(37)

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 contour

a príkazom quiver

(38)

Grafy, uvedené ako obr.2.3.10 a obr.2.3.11 sú zapísané vo forme skript-súboru sinoid.m a možno si ich prezrieť v grafickom okne MatLabu po vpísaní príkazu sinoid do príkazového okna. Medzi jednotlivými grafmi je vždy vložený príkaz pause, 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 0 2 4 -4 -2 0 2 40 0.2 0.4 0.6 0.8 1

Imagem

Referências

temas relacionados :