Špeciálne jazykové prostriedky počítačov - SJPP

Obsah

1. Úvod do MATLABu

MATLAB® je integrované prostredie pre vedeckotechnické výpočty, modelovanie, návrhy algoritmov, simulácie, analýzu a prezentáciu údajov, meranie a spracovanie signálov, návrhy riadiacich a komunikačných systémov. MATLAB je nástroj tak pre pohodlnú interaktívnu prácu, ako aj pre vývoj širokého spektra aplikácií.

1.1. Systém MATLAB

MATLAB bol pôvodne vyvinutý pre prístup k matematickým knižniciam (EISPACK, LINPACK). Názov vznikol z anglických slov matrix laboratory. Najskôr existovali verzie iba pre operačné systémy typu UNIX, prvá verzia pre Windows bola uvedená na trh až v roku 1994.

1.1.1. História MATLABu

Prvá verzia (pre PC XT) vznikla okolo roku 1985. Ako väčšina programov tej doby mala problémy s nedostatkom pamäti, čo obmedzovalo hlavne veľkosť matíc, s ktorými bolo možné vykonávať výpočty. Ďalšia verzia bola určená špeciálne pre počítač PC AT, kde bola veľkosť matíc obmedzená na 16 MB.

Virtuálnu pamäť začal MATLAB používať s nástupom počítačov s procesorom 80386, výpočty ale boli stále veľmi pomalé. Pre ilustráciu: výpočet inverzie matice 1000x1000 trval niekoľko minút.

V roku 1994 bola na trh uvedená verzia pre Windows, čo zo sebou prinieslo veľkú výhodu v podobe väčších možností grafiky, na druhej strane boli výpočty pomalšie.

Posledná verzia je Release 14 / verzia 7.0 (rok 2005).

1.1.2. O programe

Program MATLAB používa programovací jazyk MATLAB. V postate sa jedná o prácu veľmi podobnú práci v unixové konzole. Užívateľ zadáva príkazy, ktoré sú potom na jeho pokyn vykonané. Dnes je však už možné veľkú časť príkazov zadávať v grafickom rozhraní. Odpadá tak namáhavé zadávanie údajov do príkazového riadku.

Najdôležitejšou časťou programu MATLAB je jeho výpočtové jadro. Medzi jeho základné operácie patria operácie s maticami (determinant, inverzia, atď.), vrátane rozsiahlych tzv. riedkych matíc a operácie s vektormi. Tie môžu byť reprezentované aj ako polynóm.

Základným dátovým typom v MATLABe sú matice, ďalším sú napríklad viacrozmerné pole reálnych alebo komplexných čísiel a tzv. pole buniek, v ktorých každá časť môže mať iný dátový typ. Ďalšie dátové typy si užívateľ môže nadefinovať sám a vytvárať tak v podstate neobmedzene zložité dátové štruktúry.

Verzia MATLABu (6.5) sa môže pochváliť veľmi prepracovanou grafikou, ide o systém nazvaný Handle Graphics. Vie kresliť grafy, rôzne ich upravovať, atď.

Výhodou je tiež prepojenie s jazykom Java. Je tak umožnené využívať knižnice vytvorené pre Javu. Do MATLABu potom možno vkladať aj časti vytvorené v jazyku C a naopak do jazyka C exportovať.

1.1.3. Toolboxy

Toolboxy (knižnice) sú špecializované knižnice obsahujúce preddefinované funkcie napísané v jazyku MATLAB určené k riešeniu problémov v danej oblasti. Spravidla boli vyvinuté (alebo aspoň ich jadro) na univerzite tímom okolo významného odborníka. Ku každému toolboxu existuje pomerne rozsiahla dokumentácia.

MATLAB pozostáva z piatich hlavných častí:

  1. Syntax jazyka MATLAB
  2. Užívateľské prostredie MATLABu
  3. Grafika MATLABu
  4. Knižnica matematických funkcií MATLABu
  5. Prepojenie MATLABu s aplikačnými programovacími jazykmi

Syntax jazyka MATLAB

Knižnica Opis
ops operátory s špeciálne znaky
lang konštrukcia programovacieho jazyka
strfun charakter reťazcov
iofun vstup-výstup súboru
timefun dátum a čas
datatypes dátové typy a štruktúry

Užívateľské prostredie MATLABu

Knižnica Opis
general operátory a špeciálne znaky

Grafika MATLABu

Knižnica Opis
graph2d dvojrozmerné grafy
graph3d trojrozmerné grafy
specgraph špeciálne grafy
graphics manipulácia s grafmi
uitools grafické užívateľské prostriedky

Knižnica matematických funkcií MATLABu

Knižnica Opis
elmat elementárne matice a manipulácia s maticami
elfun základné matematické funkcie
specfun špeciálne matematické funkcie
matfun maticové funkcie - numerická lineárna algebra
datafun analýza dát a Fourierová transformácia
polyfun interpolácia a polynómy
funfun práca s funkciami a riešenie dif. rovníc cez ODE
sparfun riedke (Sparse) matice

Prepojenie MATLABu s aplikačnými programovacími jazykmi

1.1.4. Simulink

Simulink je program, ktorý využíva MATLAB a jeho funkcie na simuláciu dynamických systémov. Je mladší než MATLAB, jeho prvá verzia bola k dispozícii s MATLABom 4. Simulink má trochu iné užívateľské rozhranie než MATLAB. Zatiaľ čo v MATLABe je stále najdôležitejší príkazový riadok, ovládanie Simulinku je jednoduchšie a intuitívnejšie, ale pokročilejšie funkcie nie je možné vykonávať bez znalosti jazyka MATLAB. Do Simulinku možno vkladať, rovnako ako v MATLABe, časti napísané v jazyku C.

Zoznam všetkých nainštalovaných toolboxov si môžete vypísať príkazom help.
Príklad 1.1: Zoznam nainštalovaných toolboxov
>> help

HELP topics:

matlab\general       -  General purpose commands.
matlab\ops           -  Operators and special characters.
matlab\lang          -  Programming language constructs.
matlab\elmat         -  Elementary matrices and matrix manipulation.
matlab\elfun         -  Elementary math functions.
matlab\specfun       -  Specialized math functions.
matlab\matfun        -  Matrix functions - numerical linear algebra.
matlab\datafun       -  Data analysis and Fourier transforms.
matlab\audio         -  Audio support.
matlab\polyfun       -  Interpolation and polynomials.
matlab\funfun        -  Function functions and ODE solvers.
matlab\sparfun       -  Sparse matrices.
matlab\graph2d       -  Two dimensional graphs.
matlab\graph3d       -  Three dimensional graphs.
matlab\specgraph     -  Specialized graphs.
matlab\graphics      -  Handle Graphics.
matlab\uitools       -  Graphical user interface tools.
matlab\strfun        -  Character strings.
matlab\iofun         -  File input/output.
matlab\timefun       -  Time and dates.
matlab\datatypes     -  Data types and structures.
matlab\verctrl       -  Version control.
matlab\winfun        -  Windows Operating System Interface Files (DDE/COM)
winfun\comcli        -  (No table of contents file)
matlab\demos         -  Examples and demonstrations.
toolbox\local        -  Preferences.
simulink\simulink    -  Simulink
simulink\blocks      -  Simulink block library.
simulink\components  -  Simulink components.
....
Príklad 1.2: Operátory a špeciálne znaky knižnice OPS
>> help ops

  Operators and special characters.
 
  Arithmetic operators.
    plus       - Plus                               +    
    uplus      - Unary plus                         +    
    minus      - Minus                              -    
    uminus     - Unary minus                        -    
    mtimes     - Matrix multiply                    *    
    times      - Array multiply                    .*    
    mpower     - Matrix power                       ^    
    power      - Array power                       .^    
    mldivide   - Backslash or left matrix divide    \    
    mrdivide   - Slash or right matrix divide       /    
    ldivide    - Left array divide                 .\    
    rdivide    - Right array divide                ./    
    kron       - Kronecker tensor product         kron   
 
  Relational operators.
    eq         - Equal                             ==     
    ne         - Not equal                         ~=     
    lt         - Less than                          <      
    gt         - Greater than                       >      
    le         - Less than or equal                <=     
    ge         - Greater than or equal             >=     
 
  Logical operators.
                 Short-circuit logical AND         &&     
                 Short-circuit logical OR          ||     
    and        - Element-wise logical AND           &      
    or         - Element-wise logical OR            |      
    not        - Logical NOT                        ~      
    xor        - Logical EXCLUSIVE OR
    any        - True if any element of vector is nonzero
    all        - True if all elements of vector are nonzero
 
  Special characters. 
    colon      - Colon                              : 
    paren      - Parentheses and subscripting      ( )              
    paren      - Brackets                          [ ]     
    paren      - Braces and subscripting           { }          
    punct      - Function handle creation           @
    punct      - Decimal point                      .      
    punct      - Structure field access             .      
    punct      - Parent directory                   ..     
    punct      - Continuation                       ...    
    punct      - Separator                          ,      
    punct      - Semicolon                          ;      
    punct      - Comment                            %      
    punct      - Invoke operating system command    !            
    punct      - Assignment                         =
    punct      - Quote                              '      
    transpose  - Transpose                         .'
    ctranspose - Complex conjugate transpose        ' 
    horzcat    - Horizontal concatenation          [,]     
    vertcat    - Vertical concatenation            [;]     
    subsasgn   - Subscripted assignment          ( ),{ },.   
    subsref    - Subscripted reference           ( ),{ },.   
    subsindex  - Subscript index                               
 
  Bitwise operators.
    bitand     - Bit-wise AND.
    bitcmp     - Complement bits.
    bitor      - Bit-wise OR.
    bitmax     - Maximum floating point integer.
    bitxor     - Bit-wise XOR.
    bitset     - Set bit.
    bitget     - Get bit.
    bitshift   - Bit-wise shift.
 
  Set operators.
    union      - Set union.
    unique     - Set unique.
    intersect  - Set intersection.
    setdiff    - Set difference.
    setxor     - Set exclusive-or.
    ismember   - True for set member.
 
  See also ARITH, RELOP, SLASH, FUNCTION_HANDLE.
Príklad 1.3: Operátor Plus
>> help plus

 +   Plus.
    X + Y adds matrices X and Y.  X and Y must have the same
    dimensions unless one is a scalar (a 1-by-1 matrix).
    A scalar can be added to anything.  
 
    C = PLUS(A,B) is called for the syntax 'A + B' when A or B is an
    object.

 Overloaded methods
    help zpk/plus.m
    help tf/plus.m
    help ss/plus.m
    help frd/plus.m

2. Užívateľské prostredie MATLABu

2.1. Spustenie MATLABu

Spustenie MATLABu na PC je možné vykonať dvojitým kliknutím myši na ikonu MATLABu alebo príkazom

C:\MATLAB6p5\bin\win32\matlab.exe

MATLAB bez použitia JAVY (Java Virtual Machine) sa spúšta príkazom

C:\MATLAB6p5\bin\win32\matlab.exe -nojvm

Ukončenie MATLABu je možné vykonať kliknutím myši na ikonku , alebo pomocou menu

File » Exit MATLAB alebo klávesovou skratkou CTRL+Q

top

2.2. Popis prostredia MATLABu

Po spustení systému se objaví okno zložené z niekoľkých častí. Najdôležitejšie z nich je (pod)okno Command Window. Usporiadanie (pod)okien môžeme zmeniť, resp. môžeme niektoré (pod)okna zavrieť.

Obnovenie pôvodného nastavenia vykonáme pomocou menu View.

2.2.1. Menu

2.2.2. Command Window - práca v dialógovom režime

2.2.3. Workspace - práca s premennými

Poznámka: okno Workspace nemusíte používať - všetku prácu s premennými zvládnete pomocou príkazov (Command Window).

Funkcia Opis
clear vymazanie premenných a funkcií z pamäte
disp zobrazenie matice alebo textu
length veľkosť vektora
save uloženie premenných na disk
load načítanie premenných z disku
size rozmery matice
who výpis aktuálnych premenných v skrátenej forme
whos výpis aktuálnych premenných v rozšírenej forme
Príklad 2.10: Vymazanie premenných a funkcií z pamäte
>> clear
>> clear C      % vymaže C
>> clear all    % vymaže aj globálne premenné 
Príklad 2.11: Zobrazenie textu alebo matice
>> disp('zobrazenie textu t_1')
zobrazenie textu t_1
>> disp(A)
     1     2
     7     4
Príklad 2.12: Veľkosť vektora
>> length(B)

ans =

     2
Príklad 2.13: Rozmery matice
>> size(B)

ans =

     2     1

>> size(A)

ans =

     2     2
Príklad 2.14: Výpis aktuálnych premenných v skrátenej forme
>> who

Your variables are:

A    B    C    a    ans  
Príklad 2.15: Výpis aktuálnych premenných v rozšírenej forme
>> whos
  Name      Size                   Bytes  Class

  A         2x2                       32  double array
  B         2x1                       16  double array
  C         2x1                       16  double array
  a         1x1                        8  double array
  ans       1x2                       16  double array

Grand total is 11 elements using 88 bytes 

2.2.4. Current Directory - pracovný adresár

Poznámka: okno Current Directory nemusíte používať - všetku prácu s adresármi zvládnete pomocou príkazov.

Funkcia Opis
cd zmena aktuálneho prac. adresára
delete vymazanie súboru
diary uloženie textu do súboru
dir výpis obsahu adresára
type výpis obsahu m-súboru
unix vykonávanie príkazu op. systému Unix
! vykonávanie príkazu op. systému MS-DOS
Príklad 2.16: Zmena aktuálneho prac. adresára - absolútna adresa
cd c:\MATLAB6p5\work
>> pwd                % zobrazenie aktuálneho prac. adresára
ans =
C:\MATLAB6p5\work
Príklad 2.17: Zmena aktuálneho prac. adresára - relatívna adresa
>> cd ..              % nastavenie adresára o úroveň vyššie 
>> cd                 % zobrazenie aktuálneho prac. adresára

C:\MATLAB6p5
>> cd work            % nastavenie adresára o úroveň nižšie
                      % v tomto prípade je to adresár work 
>> cd

C:\MATLAB6p5\work
Príklad 2.18: Výpis obsahu adresára
>> dir

.          data.dat   priklad.m  subor.m    
..         pokus      subor.dat  

Poznámka:
. - aktuálny adresár
.. - adresár o úroveň vyššie
pokus - adresár
data.dat, priklad.m, subor.m, subor.dat - súbory

Príklad 2.19: Vymazanie súboru
>> delete subor.m    % Vymazanie jedného súboru
>> dir
.          ..         data.dat   pokus      priklad.m  subor.dat  

>> delete *.dat      % Vymazanie skupiny súborov
>> dir
.          ..         pokus      priklad.m  
Príklad 2.20: Uloženie textu do súboru
>> diary('subor.m')   % Vytvorenie súboru s názvom subor.m
>> a=1;
>> b=3;
>> c=[1 2]
c =
     1     2
>> diary off          % Prerušenie ukladania
>> diary on           % Obnovenie ukladania
>> d=[1,2,3]
d =
     1     2     3
>> diary off          % Prerušenie ukladania
Príklad 2.21: Výpis obsahu súboru subor.m
>> type subor

a=1;
b=3;
c=[1 2]
c =
     1     2
diary off
d=[1,2,3]
d =
     1     2     3
diary off
Príklad 2.22: Vykonávanie príkazov OS MS-DOS
>> !mkdir adresar     % vytvorenie adresára adresar
>> dir
.          ..         adresar    pokus      priklad.m  subor.m    

>> !del adresar       % vymazanie obsahu adresára adresar
C:\MATLAB6p5\work\adresar\*, Are you sure (Y/N)?

2.2.5. Command History - prehľad použitých príkazov

Poznámka:
Copy - kopírovanie výberu do schránky (alternatíva: CTRL+C)
Evaluate Selection - vykonanie výrazu(ov) v Command Window (alternatíva: dvojklik)
Create M-File - spustí M-file editor a skopíruje vybrané výrazy do editora
Delete Selection - vymaže vybrané výrazy z histórie
Delete to Selection - vymaže všetky nevybrané výrazy z histórie
Delete Entire History - vymaže celú históriu

Poznámka: okno Command History nemusíte používať, pretože v Command Window možno listovať použitými príkazmi s použitím šípok (hore, dolu). Pokiaľ pred stiskom šípky napíšete začiatok hľadaného použitého príkazu (aspoň jeden znak), listuje sa iba v názvoch príkazov, ktoré začínajú napísaným textom.
top

2.3. Režimy práce

2.3.1. Dialógový režim

2.3.2. Programový režim

2.3.3. Grafický režim

top

2.4. Editácia M-súborov

Jedna z možností ako editovať m-súbor je využiť príkaz edit v príkazovom riadku MATLABu. Napríklad použitie nasledovného príkazu:

Príklad 2.23:
edit subor

spôsobí otvorenie editora so súborom subor.m. Súbor môžete na editovanie otvoriť aj pomocou menu MATLABu File » Open alebo .

Ďalšou možnosťou ako otvoriť súbor na editovanie je použitie kontextového menu na súbore v Current Directory alebo dvojklikom na daný súbor.

top

2.5. Používanie základných príkazov a funkcií

Funkcia Opis
demo spustenie ukážok - demo
help pomoc, opis príkazov a funkcií
info informácie o MATLABe a MathWorks
lookfor hľadanie kľúčového slova cez help položky
path kontrola nastavenia cesty
type výpis obsahu súboru
what výpis m-, mat-, mex-súborov v adresári
which lokalizácia funkcie a súboru
^C prerušenie práce
exit ukončenie MATLABu
quit ako exit
Príklad 2.24: Vyhľadanie všetkých funkcií, ktoré v opise obsahujú slovo inverse
>> lookfor inverse

INVHILB Inverse Hilbert matrix.
IPERMUTE Inverse permute array dimensions.
ACOS   Inverse cosine.
ACOSH  Inverse hyperbolic cosine.
ACOT   Inverse cotangent.
ACOTH  Inverse hyperbolic cotangent.
ACSC   Inverse cosecant.
ACSCH  Inverse hyperbolic cosecant.
ASEC   Inverse secant.
ASECH  Inverse hyperbolic secant.
ASIN   Inverse sine.
ASINH  Inverse hyperbolic sine.
ATAN   Inverse tangent.
ATAN2  Four quadrant inverse tangent.
ATANH  Inverse hyperbolic tangent.
ERFCINV Inverse complementary error function.
ERFINV Inverse error function.
INV    Matrix inverse.
PINV   Pseudoinverse.
IFFT Inverse discrete Fourier transform.
IFFT2 Two-dimensional inverse discrete Fourier transform.
IFFTN N-dimensional inverse discrete Fourier transform.
IFFTSHIFT Inverse FFT shift.
...
Príklad 2.25: Kontrola nastavenia cesty
>> path

		MATLABPATH

	C:\MATLAB6p5\toolbox\matlab\general
	C:\MATLAB6p5\toolbox\matlab\ops
	C:\MATLAB6p5\toolbox\matlab\lang
	C:\MATLAB6p5\toolbox\matlab\elmat
	C:\MATLAB6p5\toolbox\matlab\elfun
	C:\MATLAB6p5\toolbox\matlab\specfun
	C:\MATLAB6p5\toolbox\matlab\matfun
	C:\MATLAB6p5\toolbox\matlab\datafun
	C:\MATLAB6p5\toolbox\matlab\audio
	C:\MATLAB6p5\toolbox\matlab\polyfun
	C:\MATLAB6p5\toolbox\matlab\funfun
	C:\MATLAB6p5\toolbox\matlab\sparfun
	...
Príklad 2.26: Výpis m-, mat-, mex-súborov v adresári
>> what

M-files in the current directory C:\MATLAB6p5\work
priklad    subor      

MDL-files in the current directory C:\MATLAB6p5\work
schema 
Príklad 2.27: Lokalizácia funkcie type
>> which type
type is a built-in function.

>> which type.m
C:\MATLAB6p5\toolbox\matlab\general\type.m
top

2.6. Úlohy

  1. Spustite si MATLAB cez jeho ikonu alebo tlačidlo Štart
  2. Do príkazového riadku si vyskúšajte zapísať rôzne výrazy, napr.:
    • do premennej a zapíšte vektor s hodnotami 2, 6, 5, 3
    • do premennej b zapíšte číslo 4
    • zapíšte výraz pre výpočet odmocniny premennej b
    • vynásobte premenné a, b
    • vytvorte si vlastné výrazy pri potláčaní výpisu a pre povolenie výpisu
    • pokúste sa zapísať dlhý výraz do viacerých riadkov pomocou trojbodky pre pokračovanie
  3. Vyskúšajte si funkcie panelu príkazového okna
  4. Do premennej descis si napíšte nejaké desatinné číslo napr. 3.125478914 použitím rôznych druhov formátov
  5. Riaďte sa nasledujúcimi krokmi pri práci s pracovným priestorom
    • najprv si pozrite, aké premenné obsahuje pracovný priestor
    • ak nemáte vytvorené žiadne premenné, tak si potom vytvorte premenné rôzneho typu (skalár, vektor, matica, komplexné číslo)
    • tieto vytvorené premenné si uložte do súboru data1
    • vymažte premenné z pracovného priestoru
    • pozrite pracovný priestor, mal by byť prázdny
    • nahrajte si premenné uložené v súbore data1
    • prezrite obsah pracovného priestoru, použite na to prehliadač pracovného priestoru
  6. Spustite ukážky MATLABu pomocou príkazu demo
  7. Vyskúšajte pomoc (Help) MATLABu
    • zapíšte príkaz Help, mal by sa vám zobraziť zoznam knižníc
    • vyberte si niektorú knižnicu a zapíšte príkaz help "meno_knižnice"
    • vyberte si niektorú funkciu z knižnice a zapíšte príkaz "meno_funkcie"
  8. Spustite prehliadač nastavenia ciest
  9. Vyskúšajte príkazy pre prácu so súbormi
    • pozrite nastavený aktuálny adresár
    • vypíšte obsah aktuálneho adresára
    • prestavte aktuálny adresár
    • vytvorte nový súbor, ktorý potom zase zmažte

3. Premenné, výrazy a operátory

3.1. Premenné a konštanty

Premenná je objekt, ktorý má svoj názov, typ a obsah (hodnotu).

3.1.1. Názov premennej

V názve premennej, ktorý môže obsahovať až 31 znakov, sú povolené iba nasledujúce znaky:

Názov nesmie začínať číslicou. V názvoch sú rozlišované veľké a malé písmena (case-sensitive), t.j. pokus, Pokus a poKuS sú názvy troch rôznych premenných. V prípade viacslovného pomenovania premennej použite potrhovník (napr. dolna_hranica, horna_hranica, c_a, atď.)

Najčastejšia príčina chybných názvov premenných je v použití nepovolených znakov, ktoré majú v MATLABe špeciálny význam (medzera, čiarka, bodka, pomlčka, hviezdička, zátvorky, atď.)

3.1.2. Typ a hodnota premennej

Základným typom premennej v MATLABe je matica. Každá matica môže obsahovať akékoľvek čísla, komplexné čísla, prípadne znaky (texty, chybové hlásenia).

Z hľadiska rozmeru matíc rozlišujeme premenné na:

Vytvorenie premennej

Na vytvorenie premennej sa používa príkaz:

>> názov_premennej = výraz.

Príklad 3.1: Vytvorenie skalára
>> a=8;
>> desat_cislo=-2.145;
>> skalar8=15e-2; 

Desatinné čísla zadávame s desatinnou bodkou (nie čiarkou!) alebo pomocou zlomku (8.14, 13/100). Pokiaľ je pred desatinnou bodkou iba nula, môžeme ju vynechať (.52). Čísla je možné zadávať aj vo vedeckom formáte (1.6e11, 6.122e-8). Imaginárne čísla zadávame s použitím i alebo j (12i, 2-6.11j).

Maticu rozmeru mxn vytvárame pomocou hranatých zátvoriek, v ktorých uvádzame jednotlivé riadky oddelené bodkočiarkou, pričom prvky každého riadku (stĺpce) oddeľujeme medzerou alebo čiarkou (môžme ich použiť aj naraz).

V každom riadku musí byť rovnaký počet prvkov (stĺpcov)!

Príklad 3.2: Vytvorenie riadkového vektora
>> v1=[2 0.1 -3.7 4/5 0.14];
% alebo
>> u1=[2,.1, -3.7, 4/5,0.14];
Príklad 3.3: Vytvorenie stĺpcového vektora
>> v2=[2; 0.1; -3.7; 4/5; 0.14];
Príklad 3.4: Vytvorenie matice 3x2
>> A=[1 2; 0.1 -3; .7 1/4]
A =
    1.0000    2.0000
    0.1000   -3.0000
    0.7000    0.2500

Poznámka: príkazom priradenia je možné zmeniť hodnoty už existujúcich premenných.

Príklad 3.5: Zmena hodnoty premennej
>> u1
u1 =
    2.0000    0.1000   -3.7000    0.8000    0.1400

>> u1=[1 -3 2];
>> u1
u1 =
     1    -3     2

Zobrazenie hodnoty premennej

Ak chceme zistiť obsah premennej (jej hodnotu), môžeme použiť buď okno Workspace (dvojklik), alebo v dialógovom režime napíšeme názov premennej.
Príklad 3.6: Zobrazenie hodnoty matice A
>> A
A =
    1.0000    2.0000
    0.1000   -3.0000
    0.7000    0.2500

Vymazanie premennej

Premenné, ktoré už nie sú potrebné, možno vymazať s použitím okna Workspace, resp. pomocou príkazu clear.

Príklad 3.7: Vymazanie premennej
>> clear b a   % vymaže premennú b a premennú a
>> clear       % vymaže všetky premenné

Ak nie je uvedený zoznam premenných, potom sa budú vymazané všetky premenné z Workspace.

Preddefinované premenné

Niektoré premenné sú už definované systémom MATLAB:

Ak budú použité názvy preddefinovaných premenných pri vytváraní vlastných premenných, potom ich preddefinovaná hodnota sa zruší, ale po použití príkazu clear sa preddefinované premenné vrátia do pôvodného stavu.

Príklad 3.8: Predefinovanie preddefinovanej premennej
>> i
ans =
        0 + 1.0000i
>> i=7
i =
     7
>> clear i
>> i
ans =
        0 + 1.0000i

Premenná ans

Premenná ans je vytvorená automaticky, pokiaľ niektorý z príkazov potrebuje vypísať hodnotu, ktorú sme nepriradili do žiadnej premennej. Premenná ans teda obsahuje poslednú zobrazenú nepomenovanú hodnotu.

Príklad 3.9: Premenná ans
>> 2*3-5
ans =
     1
>> 2*3+5;
>> ans
ans =
    11

Načítanie a uloženie premenných v pracovnom priestore

Niekedy je potrebné uchovať niektoré dôležité premenné pre použitie pri budúcom spustení MATLABu (napr. pri prerušení prace). Potrebujeme teda premennú dostať z pamäti na disk počítača.

Na uloženie a načítanie premenných v pracovnom priestore MATLABu je možné použiť príkazy save a load. Syntax príkazu save je nasledovná:

Príkaz save ukladá premenné prac. priestoru do binárneho MAT-súboru, ktorý je možné spätné čítať s príkazom load.

Špecifikácia formátu súboru

Funkcia Opis
-mat využíva binárny formát M-súboru
-ascii využíva 8-bitový ASCII formát
-ascii -double využíva 16-bitový ASCII formát
-ascii -double -tabs oddeľuje prvky tabulátorom
-v4 ukladá do formátu MATLAB verzia 4
-append pripojí údaje do existujúceho MAT-súboru
Príklad 3.10:
% uloženie všetkých premenných prac. priestoru do súboru premen1.mat
>> save premen1

% uloženie premenných x, y, z do súboru premen2.mat
>> save premen2 x y z
Príklad 3.11:
% Načítanie premenných z disku (súbor premen1.mat) do prac. priestoru 
>> load premen1

% Načítanie premenných z disku, ak má súbor inú koncovku ako .mat 
% (súbor nazov.dat uložený v binárnom formáte)
>> load nazov.dat -mat

% Načítanie údajov z ASCII súboru
>> load pokus.dat
% v prac. priestore sa vytvorí premenná pokus 
Príklad 3.12: Uloženie údajov v ascii formáte
% predpoklad: ukladané údaje musia byť v tvare matice
>> A = [1 2;4 1];
>> save data.dat -ascii

% Vymazanie premenných z pamäte
>> clear

% Zobrazenie obsahu pamäte
>> who
  
% Načítanie premenných zo súboru 
>> load data.dat

% Zobrazenie obsahu pamäte
>> whos
  Name       Size                   Bytes  Class
  data       2x2                       32  double array
Grand total is 4 elements using 32 bytes

3.1.3. Špeciálne premenné a konštanty

PremennáOpis
ansautomatická premenná na odpoveď
computerpremenná počítačového typu
epsrelatívna presnosť (2.2204e-016)
i,jimaginárne operátory
infvýsledok je infinitív
NaNnie je číslo, neexistuje daná operácia (Not-a-Number)
narginvstupné číslo do funkcie
nargoutvýstupné číslo z funkcie
whyúspešná odpoveď
versiončíslo verzie MATLABu
pipi = 3.1415926...
realmaxnajväčšie reálne číslo 1.7977e+308
realminnajmenšie reálne číslo 2.2251e-308
Príklad 3.13: Delenie nulou
>> 12/0
Warning: Divide by zero.
ans =
   Inf
Príklad 3.14: Zistenie OS
>> computer
ans =
PCWIN
Príklad 3.15: Výsledok nie je číslo
>> 0/0
ans =
   NaN
Príklad 3.16:
>> why
Pete wanted it that way.
>> why
I told me to.
>> why
A young kid told me to.
>> why
Bill insisted on it.
>> why
For the love of Jack.
top

3.2. Výrazy

Výraz je postupnosť konštánt, názvov premenných, operátorov a volaní funkcií. Pokiaľ je výraz správny, potom po stisku klávesy ENTER je ihneď vyhodnotený. Vyhodnotením výrazu vzniká vždy nejaká hodnota. Výsledná hodnota výrazu môže byť uložená do premennej, alebo je uložená do premennej ans.

Pokiaľ nie je potrebné zobrazovať vypočítanú hodnotu, môže byť jej zobrazenie potlačené - za výrazom je napísaná bodkočiarka. Bodkočiarka teda okrem delenia riadkov matice slúži tiež k potlačeniu výpisu výsledku výrazu. Obvykle sa pri potlačenom výpise výsledku používa priradenie hodnoty výrazu do premennej, pretože inak vypočítaná hodnota zanikne.

3.2.1. Zápis dlhého výrazu v príkazovom riadku

Ak nie je možné výraz kvôli jeho dĺžke zapísať do jedného riadku, môžeme použiť zápis s tromi bodkami (...) na konci riadku, ktoré značia pokračovanie na ďalšom riadku. Tri bodky sa zvýrazňujú modrou farbou a znamenajú, že MATLAB má počkať s vykonaním príkazu, pretože ešte nie je celý. Pokiaľ MATLAB čaká na dokončenie príkazu, tak príkazový riadok nezačína >>.

Príklad 3.17: Zápis dlhého výrazu
>> s = 1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + 1/7 ...
      - 1/8 + 1/9 - 1/10 + 1/11 - 1/12;

>> A = [1.5 -3 4.1; 2...
1.14 5 0.2; 7 15.1 8/31 0];

>> A = [1.5 -3 4.1; 2...
1.14 5 0.2; 7 15.1...
8/31 0];

3.2.2. Ukončenie vykonávania príkazu

Príkaz, ktorý sa práve vykonáva, môže byť ukončený pomocou klávesovej skratky CTRL+C. Väčšinou sa CTRL+C používa v prípadoch nekonečného cyklu alebo výpisu príliš veľkej matice.

3.2.3. Viac výrazov na jednom riadku

Doteraz boli príkazy ukončované pomocou klávesy ENTER, ktorá zároveň odoslala príkaz k spracovaniu. Občas je ale potrebné odoslať k spracovaniu viac príkazov naraz. V takomto prípade môžu byť použité buď M-súbory, alebo zápis viac príkazov na jeden riadok, pričom na oddelenie jednotlivých príkazov sa používa čiarka alebo bodkočiarka (čiarka iba oddeľuje príkazy, bodkočiarka navyše potlačuje výpis ich výsledkov).

Príklad 3.18: Tri výrazy na jednom riadku
>> m=8, n=3; vysledok=3*m+0.5*n
m =
     8
vysledok =
   25.5000
top

3.3. Reťazce

Reťazce (anglicky character arrays alebo strings) sú v podstate vektory, ktoré obsahujú znaky anglickej abecedy. Nedoporučuje sa používať slovenské znaky obsahujúce diakritiku, pretože býva problém s ich správnym zobrazovaním.

3.3.1. Vytváranie reťazca

Na vytvorenie reťazca slúžia apostrofy, do ktorých sa zapisuje obsah reťazca (napríklad 'text' alebo 'Toto je dlhy text.'), pričom takto vytvorený reťazec môže byť uložený do premennej:

Príklad 3.19: Vytvorenie reťazca
>> text = 'lubovolny text'
text =
lubovolny text
>> nazov = 'text s diakritikou = ľubovoľný text'
nazov =
text s diakritikou = ľubovoľný text

Vo Workspace sa reťazec objaví ako premenná typu char array (doteraz boli používané iba čísla - double array).

Poznámka: reťazce možno ukladať aj do matíc, ale je nutné, aby všetky riadky (= reťazce) mali rovnakú dĺžku! Doplňuje sa väčšinou medzerami.

Príklad 3.20: Matica reťazcov
>> mena = ['Ivan '; 'Jana '; 'Peter'; 'Eva  '; 'Ivan ']
mena =
Ivan 
Jana 
Peter
Eva  
Ivan 
Príklad 3.21: Matica reťazcov - chybné zadanie
>> mena = ['Eva'; 'Ivan']
??? Error using ==> vertcat
All rows in the bracketed expression must have the same 
number of columns.

3.3.2. Výpis reťazca

Pokiaľ máme reťazec uložený v premennej, môže byť vypísaný rovnakým spôsobom ako obsah číselnej preomennej, teda zadaním názvu premennej.

Existujú tiež funkcie, ktoré vypisujú zadaný reťazec, a to funkcia disp(), ktorá má jeden argument. Argumentom môže byť text alebo názov premennej.

Príklad 3.22:
>> disp('ahoj')
ahoj

>> disp(text)
lubovolny text

Ďalšou funkciou vypisujúcou zadaný reťazec je funkcia error(), ktorej argumentom je chybové hlásenie (vypisuje sa červenou farbou). Táto funkcia navyše ukončuje vykonávanie aktuálneho príkazu (preto sa používa vnútri funkcií a skriptov).

Príklad 3.23: Výpis chybového hlásenia
>> error('Chyba')
??? Chyba

Poznámka: keďže je reťazec vektor zložený zo znakov, môže sa s ním pracovať znak po znaku. Ďalšou možnosťou je využiť funkcie MATLABu, ktoré ponúkajú porovnávanie reťazca (napr. funkcia strcmp), prevod na veľké alebo malé písmená (upper a lower), konverzia reťazca na čísla a naopak (napr. str2num a num2str) , atď. (viac: help strfun).

top

3.4. Komentáre (poznámky)

Komentáre slúžia väčšinou k vysvetleniu významu jednotlivých príkazov, skriptov alebo funkcií. Komentáre pri užívateľských funkcia navyše slúžia ako nápoveda, ktorú vie MATLAB zobrazovať napr. príkazom help názov (jedná sa o komentáre definované na začiatku skriptov).

Komentár začína znakom % a končí spolu s koncom riadku. Text komentára býva označený zelenou farbou (pokiaľ nie je zvolená iná farba).

Všetky komentáre sú MATLABom ignorovaní, t.j. nie sú vyhodnocované.

Príklad 3.24: Komentár
>> x = 10; % Vytvorenie premennej x, bez výpisu
top

3.5. Operátory a špeciálne znaky

Operátory v MATLABe môžeme rozdeliť do troch základných skupín:

Operátory, ktoré nie je možné začleniť do žiadnej skupiny sa nazývajú špeciálne znaky. V MATLABe je možné využívať nasledovné operátory a špeciálne znaky:

Znak Opis Znak Opis
+ plus ... pokračovanie
- mínus ; bodkočiarka
* maticové násobenie , čiarka
.* násobenie prvkov % komentár
^ umocnenie ! výkričník
.^ umocnenie prvkov ' transpozícia
Kron násobenie Kronecker .'  
\ ľavé delenie = priradenie
/ pravé delenie == zhodnosť
./ pravé delenie prvkov <> relačné operátory
: dvojbodka & logický AND
[] hranaté zátvorky | logický OR
() okrúhle zátvorky ~ logická negácia
. desatinná bodka XOR log. exclusive OR
.. rodičovský adresár    

3.5.1. Aritmetické operátory

Unárne

Názov Syntax Opis
unárny plus +a1
unárny mínus -a1
transpozícia a konjugovanosť a1'
transpozícia a1.'

Binárne

Názov Syntax Opis
sčítanie a1+a2
odčítanie a1-a2
násobenie matíc a1*a2
násobenie po prvkoch a1.*a2
umocnenie matice a1^a2
umocnenie po prvkoch a1.^a2
delenie matíc a1/a2
delenie po prvkoch a1./a2
delenie matíc zľava a1\a2
delenie po prvkoch zľava a1.\a2

Dvojbodka

Názov Syntax Opis
vytváranie aritmetických postupností i:k:j
i:j
  • všetky argumenty musia byť skaláry
  • vytvorí aritmetickú postupnosť od i do j s krokom k, t.j. [i i+k i+2k ... j] (v prípade, že (j-i)/k nie je celé číslo, potom posledný člen nie je j, ale číslo menšie (maximálne o k-1))
  • ak nie je definované k, potom je krok automaticky zvolený ako 1, teda i:j generuje postupnosť [i i+1 i+2 ... j]
  • ak je krok chybne zvolený (nedá sa dostať od i k j), potom je výsledkom prázdna matica

3.5.2. Relačné operátory

Názov Syntax Opis
menší <
  • vykonávajú sa po prvkoch
  • argumenty musia mať rovnaké rozmery alebo aspoň jeden z nich je skalár
  • výsledok má rozmer ako neskalárny argument (alebo je to skalár)
  • výsledok obsahuje iba nuly (nepravda, false) a jednotky (pravda, true) podľa toho, či je príslušná relácia medzi argumentmi pravdivá
  • pokiaľ je jeden z argumentov skalár, porovnáva sa s ním každý prvok druhého argumentu
menší alebo rovný <=
väčší >
väčší alebo rovný >=
rovnajúci sa ==
nerovnajúci sa ~=

Upozornenie: je veľký rozdiel medzi == (porovnanie) a = (priradenie).

Príklad 3.25: Rozdiel medzi priradením a porovnaním
>> a = 2
a =
     2

>> a == 2
ans =
     1

Poznámka: relačné operátory sa využívajú najmä v príkazoch cyklenia a vetvenia (if, for, while, switch).

Príklad 3.26:
A=[2 7 6;9 0 -1;3 1 6];
B=[8 0.2 0;-3 2 5;4 -1 7];
A < B
ans =
     1     0     0
     0     1     1
     1     0     1

3.5.3. Logické operátory

Unárne

Názov Syntax Opis
negácia ~a1
  • aplikuje sa na každý prvok a1
  • výsledok má rozmer ako a1
  • výsledok obsahuje iba nuly a jednotky

Nasledujúca tabuľka zobrazuje možné stavy dosiahnuté negáciou.

Negácia
a1~a1
nenulové0
01

Binárne

Názov Syntax Opis
logický súčin a1&a2
  • aplikuje sa na každý prvok a1
  • výsledok má rozmer ako a1
  • výsledok obsahuje iba nuly a jednotky
logický súčet a1|a2

Nasledujúca tabuľka zobrazuje možné stavy dosiahnuté logickým súčinom a súčtom.

Logický súčin a súčet
a1a2a1&a2a1|a2
nenulovénenulové11
nenulové001
0nenulové01
0000

Príklad 3.27:
a = [1 0 4 2 0 5];
b = [5 3 1 0 0 7];
% operácia AND
a & b
ans =
     1     0     1     0     0     1

% operácia OR
a | b
ans =
     1     1     1     1     0     1

% operácia NOT
~ b
ans =
     0     0     0     1     1     0

3.5.4. Priorita operátorov

Poradie, v akom sa budú jednotlivé časti výrazu vyhodnocovať, môžeme podľa potreby zadať tým, že použijeme guľaté zátvorky na ohraničenie všetkých potrebných častí výrazu. Nie vždy sú zátvorky potrebné, pretože každý z vyššie uvedených operátorov má pevne dané poradie vyhodnocovania (prioritu). Operátory v tabuľke sú zoradené zhora dolu podľa klesajúcej priority.

Postupnosť pravidiel vyhodnocovania aritmetických operátorov:

Priorita Operátor Poznámka
1.()zátvorky
2..', .^, ', ^transpozícia, umocnenie, transpozícia+konjugovanosť, maticové umocnenie
3.+, -, ~unárny plus, unárny mínus, negácia
4..*, ./, .\, *, /, \násobenie po prvkoch, delenie po prvkoch, delenie po prvkoch zľava, násobenie matíc, delenie matíc, delenie matíc zľava
5.+, -sčítanie, odčítanie
6.:dvojbodka
7.<<=>>===~=relačné operátory
8.&logický súčin, AND
9.|logický súčet, OR

Operátory sú vyhodnocované zľava doprava.

3.5.5. Logické funkcie

Príkaz Opis
all pravda ak všetky prvky vektora sú pravdivé
any pravda ak žiadny prvok vektora nie je pravdivý
exist kontroluje, kde existujú premenné alebo funkcie
find hľadá prvky, kde výraz je pravdivý
finite pravda pre konečné prvky
isempty pravda pre prázdnu maticu
isieee pravda pre IEEE floating point aritmetiku
isinf pravda ak prvok je infinitív
isnan pravda ak prvok nie je číslo
issparse pravda pre sparse maticu
isstr pravda pre textový reťazec
Príklad 3.28:
% reťazec alebo infinitív
a = [1 -2000 3 inf 89];
b = ['hello' 'ciao' 'inf'];
isstr(a)
ans =
     0
isstr(b)
ans =
     1
isinf(a)
ans =
     0 0 0 1 0
isinf(b)
ans =
     0 0 0 0 0 0 0 0 0 0 0 0

% funkcia XOR
a = [1 0 4 2 0 5];
b = [5 3 1 0 0 7];
xor(a,b)
ans =
     0 1 0 1 0 0

% stĺpce s nenulovými prvkami
A = [0 1 2 5;3 4 0 7];
all(A)
ans =
     0 1 0 1
Príklad 3.29:
% Delenie prvkov vektorov y a x nastane, 
% ak všetky prvky vektora x sú nenulové
if all(x)
  d = y./x
end
top

3.6. Úlohy

  1. Vytvorte si premenné a=-2, b=2, c=1.5 a vypočítajte hodnoty výrazov:
  2. Pre vektory e=[2,4,1,12,0,5], f=[0,8,6,3,10,7] vykonajte:
    • relačné operácie e<f, e>f
    • logické operácie AND, OR s vektormi e, f
  3. Zistite všetky prvky vektora f, ktoré sú z intervalu (5, 10)
  4. Vyskúšajte zápisy niektorých špeciálnych premenných a konštánt:
    • zapíšte komplexné čísla 5i, 3+4pi.i, 2/3pi.i
    • podeľte nejaké číslo nulou
  5. Vykonajte nasledujúce úkony (dodržujte poradie):
    • uložte premenné a, b, c z prac. priestoru do binárneho mat-súboru data1.mat
    • uložte premennú e z prac. priestoru do dátového ascii-súboru data2.dat
    • uložte premenné e, f z prac. priestoru do binárneho mat-súboru data3.txt
    • vymažte prac. priestor MATLABu (Workspace)
    • načítajte premenné z uloženého súboru data1.mat
    • v Command Window zobrazte zoznam premenných
    • načítajte premenné z uloženého súboru data2.dat
    • v Command Window zobrazte zoznam premenných
    • vytvorte nové premenné a1, b1, c1 ktoré budú obsahovať hodnoty premenných a, b, c.
    • vymažte premenné a, b, c z prac. priestoru
    • načítajte premenné z uloženého súboru data3.txt
    • v Command Window zobrazte zoznam premenných

4. Vytváranie vlastných aplikácií

4.1. M-súbory

M-súbory slúžia na ukladanie postupností príkazov (skripty) alebo na ukladanie užívateľských funkcií (funkcie). Tieto nové súbory majú príponu .m.

Poznámka: m-súbory sú obyčajné textové súbory (ASCII súbory), a preto je možné ich písať aj v ľubovoľnom textovom editore. Z dôvodov vyššieho komfortu (zvýraznenie syntaxe, možnosť krokovania) je súčasťou MATLABu tiež M-editor/Debugger, ktorý sa otvára v samostatnom okne po otvorení alebo vytvorení m-súboru (skriptu či funkcie).

4.1.1. M-editor

Od verzie 5.0 je súčasťou MATLABu aj vlastný editor, ktorý zároveň slúži ako debugger. Ide o jednoduchý editor, ktorý má niektoré užitočné vlastnosti:

M-editor/Debugger je spustený v samostatnom okne po otvorení (File » Open) alebo vytvorení (File » New » M-file) nového m-súboru. Slúži k pohodlnej editácii m-súboru. Navyše umožňuje krokovať obsah m-súboru (t.j. kontrolovať vykonávanie jeho jednotlivých príkazov).

top

4.2. Skripty

Skript (z angl. script) je postupnosť príkazov uložených do súboru. Každý skript pracuje s premennými pracovného prostredia, takže môže vytvárať nové alebo mazať či meniť vybrané. Výsledky skriptu teda zostávajú v pracovnom prostredí aj po jeho skončení. Skripty samozrejme môžu volať iné skripty alebo funkcie, vytvárať grafické okná, vypisovať do Command Window, ...

4.2.1. Vytvorenie skriptu

  1. Najskôr musí byť v MATLABe nastavený pracovný adresár (napr. príkazom cd).
  2. Vytvorenie nového alebo otvorenie existujúceho skriptu
    M-súbor, ktorý bude obsahovať skript, vytvoríme napríklad pomocou menu File » New » M-file, čím sa tiež otvorí okno M-editora/Debuggera. Pokiaľ je potrebné opraviť už existujúci skript, musíme ho otvoriť (napríklad pomocou menu File » Open).
  3. Zápis skriptu
    Do prázdneho m-súboru sa zapisujú všetky príkazy, ktoré má skript vykonať - príkazy sa píšu rovnako ako v Command Window, iba s tým rozdielom, že sa po napísaní nevykonávajú. Takto sa vytvára kód skriptu (postupnosť príkazov).
  4. Uloženie skriptu
    Ak je napísaný kód skriptu, musí sa celý m-súbor uložiť pod nejakým menom na disk (do pracovného adresára). Uloženie sa vykonáva pomocou menu File » Save. Meno skriptu musí spĺňať rovnaké pravidlá ako názov premennej. Je to z toho dôvodu, aby MATLAB mohol skript spustiť. Meno m-súboru so skriptom teda môže obsahovať iba písmená anglickej abecedy, podtrhovník a čísla (číslom nesmie začínať).

4.2.2. Spustenie skriptu

Spustenie skriptu dáva MATLABu pokyn k vykonaniu jeho príkazov. Pred spustením musí byť skript uložený! Skript môže byť spustený buď

Príklad 4.1: Skript parabola.m, ktorý kreslí graf funkcie x2
% GRAF - vykreslenie paraboly
x = -3:0.1:3; % vektor hodnôt z intervalu [-3;3] s krokom 0,1
y = x.^2; % závislá premenná
plot(x,y) % graf (parabola) 
Príklad 4.2: Spustenie skriptu parabola.m
>> parabola

Pokiaľ je všetko v poriadku, objaví sa okno s grafom. V opačnom prípade musí byť nájdená a opravená chyba, uložený súbor a jeho opätovné spustenie.

top

4.3. Užívateľské funkcie

Ak sa nejaká postupnosť príkazov (algoritmus) opakuje vo viacerých situáciách (napr. pre rôzne hodnoty premenných), nie je praktické používať skripty, pretože vždy sa musia upraviť hodnoty premenných v skripte, uložiť príslušný m-súbor a skript spustiť. Riešenie ponúkajú funkcie.

Funkcie sú m-súbory, ktoré majú presne definovanú štruktúru (viď. Vytvorenie funkcie). Funkcie akceptujú vstupné parametre, ktoré môžu mať pri každom spustení inú hodnotu.

Každá funkcia má svoje vlastné pracovné prostredie, ktoré je oddelené od pracovného prostredia Command Window. Všetky premenné vo funkcii sú lokálne (existujú iba vnútri funkcie). To znamená, že:

Našťastie existuje spôsob, ktorým funkcia môže svoje výsledky predať "von": výstupné premenné. Počet vstupných aj výstupných parametrov funkcie sa určuje pri jej vytváraní. Pokiaľ funkcia nemá žiadne vstupné parametre, môžu sa jej príkazy napísať tiež ako skript.

Príklad 4.3: Súbor (funkcia) priemer.m
function y = priemer(x)
% PRIEMER stredna hodnota vektora.
% PRIEMER(X), kde X je vektor vrati strednu hodnotu elementov vektora
% Ak vstup nie je vektor, vrati chybu.
[m,n] = size(x);
if (~((m == 1) | (n == 1)) | (m == 1 & n == 1))
error('Vstup musi byt vektor')
end
y = sum(x)/length(x); % Vypočet

4.3.1. Vytvorenie funkcie

  1. Najskôr musí byť v MATLABe nastavený pracovný adresár (napr. príkazom cd).
  2. Otvorenie m-súboru
    Funkcia je m-súbor, a preto sa najskôr musí otvoriť nový súbor: napríklad pomocou menu File » New » M-file. Tým sa otvorí okno M-editora/Debuggeru s prázdnym súborom.
    Poznámka: pokiaľ chceme nejakú existujúcu funkciu opraviť, použijeme menu File » Open.
  3. Zápis funkcie (štruktúra m-súboru obsahujúceho funkciu)
    Prvý riadok obsahuje definíciu funkcie, po ňom môžu nasledovať riadky s nápovedou k funkcii (komentáre) a zvyšok súboru tvoria príkazy (kód funkcie, algoritmus) potrebné na výpočet výstupu funkcie za použitia jej vstupov.
  4. Uloženie funkcie
    Napísaná funkcia sa musí uložiť na disk ako m-súbor (napr. pomocou menu File » Save). Pri ukladaní je potrebné:

4.3.2. Spustenie funkcie

Funkcie (aj vlastné) môžeme spustiť z Command Window (alebo z iných funkcií či skriptov).
Príkaz na spustenie funkcie vypadá obecne takto:

>> [vystupy] = nazov_funkcie(vstupy)
% pokiaľ je potrebné uložiť výsledky do premenných

>> nazov_funkcie(vstupy)
% pokiaľ sa výsledky neukladajú do premenných

Poznámky:

Príklad 4.7:
>> s = sucet(7,14);

>> vysledok = sucet(7,14)
vysledok =
     21
	 
>> x=7; y=14; sucet(x,y)
ans =
     21

4.3.3. Zobrazenie kódu funkcie

Kód funkcie (t.j. obsah m-súboru) je možné (okrem M-editora/Debuggera) zobraziť v Command Window príkazom type názov_funkcie, kde názov_funkcie je názov funkcie (názov m-súboru bez prípony).

top

4.4. Krokovanie (ladenie) funkcií/skriptov

Pokiaľ sú vo funkcii chyby (napr. nedáva správne výsledky) a nie je možné ich príčinu nájsť jednoduchým prečítaním jej kódu, potom sa používa Debugger, ktorý ponúka možnosť krokovania:

  1. v M-editore sa nastaví breakpoint na nejakom riadku s príkazom jedným z nasledujúcich spôsobov:
  2. spustí sa funkcia s jej parametrami (z Command window) - v Command Window sa objaví K>> a v M-editore svieti zelená šípka pred riadkom, ktorý bude následne spracovaný
  3. pomocou F10 (Debug » Step) a F11 (Debug » Step in) sa v M-editore krokuje (spúšťajú sa jednotlivé príkazy) - výsledky sa kontrolujú pomocou myši (pohyb nad názvom premennej, ktorej obsah nás zaujíma) alebo pomocou okna Workspace (kde by mal byť nastavený Stack pre krokovanú funkciu)
  4. výsledkom celého snaženia je nájdenie chyby, jej oprava a uloženie opravenej funkcie
top

4.5. Príkazy a funkcie pre vytváranie vlastných aplikácií

4.5.1. Práca s reťazcami, funkciami a premennými

Funkcia Opis
eval vykoná reťazec z MATLABového príkazu
feval vykoná funkciu so špecifikovaným menom
function pridanie novej funkcie
global definovanie globálnej premennej
nargin počet zadaných vstupných parametrov
nargout počet požadovaných výstupných parametrov

Pomocou funkcie eval umožňuje MATLAB vykonávanie výrazu prostredníctvom reťazca. Vykonávanie funkcií pomocou reťazca umožňuje funkcia feval.

Príklad 4.8:
% Vykonanie výrazu pomocou definovaných premenných
>> a = 2; b = 1;
>> c = '1/(a+b+7)';
>> eval(c)
ans =
	0.1000

% Vytvorenie premenných x1, x2, ..., x5 a priradenie
  druhých mocnín
>> for i=1:5  
  eval(['x',int2str(i),'=i.^2'])
end
x1 =
	1
x2 =
	4
x3 =
	9
x4 =
	16
x5 =
	25

% Možnosť vykonávania rôznych funkcií
>> fun = ['sin';'cos';'log'];
>> k = 1; x = 2;
>> feval(fun(k,:),x) % = sin(x)
ans =
	0.9093

Zistenie počtu skutočných vstupných a výstupných argumentov

Pokiaľ je potrebné, aby "vlastná" funkcia reagovala na rôzny počet vstupných parametrov, môže byť v jej kóde použitá funkcia nargin. Funkcia nargin nemá žiadne vstupy, ale vracia skutočný počet parametrov, s ktorými bola funkcia spustená. Pokiaľ je zavolaná "vlastná" funkcia s menším počtom vstupných argumentov, môže sa spracovať inak ako v prípade plného počtu vstupov.

Poznámka: poradie vstupných parametrov v definícii funkcie je zaväzujúce (napr. ak je vynechaný druhý zo štyroch vstupov, funkcia to pochopí tak, že vynechal ten štvrtý!).

Na zistenie skutočného počtu výstupných parametrov je funkcia nargout. Pracuje sa s ňou podobne ako s funkciou nargin.

Príklad 4.9: Funkcia nargin, nargout - súbor kontrola.m
function [x,y] = kontrola(a,b,c,d)
disp(sprintf('počet zadanych vstupnych argumentov: %d',nargin));
disp(sprintf('počet vyzadovanych vystupnych argumentov: %d',nargout));
x = 2;
y = 3;
Príklad 4.10:
>> [x,y] = kontrola(1,2);
počet zadanych vstupnych argumentov: 2
počet vystupnych argumentov: 2
Príklad 4.11:
>> [x] = kontrola(1);
počet zadanych vstupnych argumentov: 1
počet vystupnych argumentov: 1
Príklad 4.12:
>> kontrola(1);
počet zadanych vstupnych argumentov: 1
počet vystupnych argumentov: 0
Príklad 4.13: Vylepšenie funkcie sucet.m - hlásenie chyby, ak je zavolaná menším počtom parametrov
function [s] = sucet(a,b)
% SUCET - sucet dvoch cisiel
% s=sucet(a,b)
% a,b ... scitance
% s ... vysledok (sucet)
% priklad volania: s=sucet(10,-2.5)
if nargin~=2 % nespravny počet vstupov?
   error('CHYBA: na vypočet su potrebne DVA vstupy!') % vypis chyby a koniec funkcie
end % koniec if
s = a+b; % vypočet vysledku
top

4.6. Riadiace príkazy

Príkaz Opis
break ukončenie vykonávajúceho sa cyklu
else súvisiace s if
elseif súvisiace s if
end ukončenie rozsahu príkazov for, while, switch a if
error zobrazenie správy a ukončenie funkcie
for opakované vykonávanie príkazov so špecifikovaným číslom
if podmienené vykonávanie príkazov
switch podmienené vetvenie príkazov
return návrat do volajúcej funkcie
while podmienené opakovanie vykonávania príkazov

4.6.1. Podmienené vykonávanie príkazov (vetvenie)

Príkaz IF - ELSE

Občas potrebujeme, aby sa určité príkazy vykonali iba v prípade, ak je splnená nejaká podmienka. V MATLABe je k dispozíci príkaz if, ktorý umožnuje vyhodnotiť (otestovať) podmienku, a podľa jej pravdivosti potom vykoná (nebo nevykoná) zadanú množinu príkazov. Jeho základná syntax je:

if podmienka
   príkazy
end

Príkaz začína kľúčovým slovom if, za nim následuje podmienka (ľubovoľný výraz s logickou hodnotou 0 alebo 1 (väčšinou sa v podmienkach používajú relačné alebo binárne logické operátory). Vnutri príkazu if sú akékoľvek príkazy, ktoré sa majú vykonať v prípade splnenia podmienky. Pretože príkazov vnútri if môže byť viac, tak za posledným z nich musíme uviesť kľúčové slovo end, ktoré označuje koniec celého príkazu.

Poznámky:

Príklad 4.14:
>> znamka = 3;
>> if znamka == 1
zobraz = 'Gratulujeme! Lepsie to byt nemohlo!'
end

Poznámka:

Príklad 4.15: Zápis príkazov do jedného riadku
>> znamka = 1; if znamka == 1; zobraz = 'Gratulujeme! Lepsie to byt nemohlo!', end
zobraz =
Gratulujeme! Lepsie to byt nemohlo!
Príklad 4.16: Súbor priklad.m
if a < 5
   disp('hodnota premennej ''a'' je mensia ako cislo 5')
end
Výsledok príkladu 4.16:
>> a = 3;
>> priklad
hodnota premennej 'a' je mensia ako cislo 5
V prípade, že potrebujeme vykonať nejaké príkazy v prípade platnosti podmienky, ale iné príkazy v prípade jej neplatnosti, môžeme použiť vetvu else:
if podmienka
   príkazy1
else
   príkazy2
end

Činnosť príkazu if-else: najskôr sa testuje podmienka. Ak je pravdivá, vykonajú sa príkazy1, ak je nepravdivá, vykonajú sa príkazy2. Vždy sa teda vykoní jedna skupina príkazov.

Príklad 4.17: Súbor priklad1.m
if a < 5
   disp('hodnota premennej ''a'' je mensia ako cislo 5')
else
   disp('hodnota premennej ''a'' je vacsia alebo rovnaká ako cislo 5')
end
Výsledok príkladu 4.17:
>> a = 9;
>> priklad1
hodnota premennej 'a' je vacsia alebo rovnaká ako cislo 5

Z predchádzajúceho príkladu je vidieť, že niekedy može byť vhodné v prípade neplatnosti podmienky testovat tiež iné možnosti. Na splnenie tohto cieľa stačí vnoriť ďalší príkaz if do vetvy else. Existuje aj pohodlnejší prostriedok ako vnorenie - rozšírená syntax príkazu if:

if podmienka1
   príkazy1
elseif podmienka2
   príkazy2
else
   príkazy3
end

Poznámka:

Včeobecná činnosť príkazu if: najskôr sa testuje pravdivosť podmienky1. Pokiaľ platí, vykonajú sa príkazy1 a ostatné vetvy príkazu sú ignorované. Pokiaľ podmienka1 neplatila, začne sa testovať podmienka2. Ak platí, vykonajú sa príkazy2 a zvyšok vetvy je ignorovaná. Ak neplatí, pokračuje sa ďalšej vetve elseif (ak ešte nejaká je) ... V prípade, že ani jedna z podmienok neplatila, sú vykonané príkazy vo vetve else (ak je definovaná).

Príklad 4.18: Funkcia vetvenie1.m
function text = vetvenie1(x)
n = length(x);
if n == 0
  error('Vektor je prázdny');
elseif n < 3
  text = 'Vektor má 1 alebo 2 prvky';
elseif n >= 3 & n < 5
  text = 'Vektor má 3 alebo 4 prvky';
else
  text = 'Vektor má viac ako 4 prvky';
end
Výsledok príkladu 4.18:
>> a = 1;
>> b = vetvenie1(a)
b =
Vektor má 1 alebo 2 prvky

>> a = [1 2 3];
>> disp(vetvenie1(a))
Vektor má 3 alebo 4 prvky

>> a = [1 2 3 4 5 6];
>> vetvenie1(a)
ans =
Vektor má viac ako 4 prvky

Príkaz SWITCH

Príkaz vetvenia switch má takmer rovnaký význam ako if, ale môže niekedy zjednodušiť skript. Vďaka tomuto príkazu sa dajú nahradiť dlhé príkazy if. Vetva skriptu je daná hodnotou jedného výrazu. Príkazy za otherwise sa vykonajú, pokiaľ výraz neodpovedá žiadnej podmienke.

switch výraz
  case podmienka1, 
    príkazy1
  case podmienka2, 
    príkazy2
  ...
  case podmienkaN, 
    príkazyN
  otherwise,
    príkazy
end

Pokiaľ je výraz == podmienka1 pravdivý, potom sa vykonajú príkazy1 a ostatné vetvy príkazu sú ignorované. Pokiaľ podmienka1 neplatila, začne sa testovať výraz == podmienka2. Ak platí, vykonajú sa príkazy2 a zvyšok vetvy je ignorovaná. Ak neplatí, pokračuje sa ďalšej vetve case (ak ešte nejaká je) ... V prípade, že ani jedna z podmienok neplatila, sú vykonané príkazy vo vetve otherwise (ak je definovaná).

Príklad 4.19: Funkcia vetvenie2.m
function text = vetvenie2(x)
n = length(x);
switch n
  case 0
    error('Vektor je prázdny');
  case {1,2}
    text = 'Vektor má 1 alebo 2 prvky';
  case {3,4}
    text = 'Vektor má 3 alebo 4 prvky';
  otherwise
    text = 'Vektor má viac ako 4 prvky';
end
Výsledok príkladu 4.19:
>> a = 1;
>> b = vetvenie2(a)
b =
Vektor má 1 alebo 2 prvky

>> a = [1 2 3];
>> disp(vetvenie2(a))
Vektor má 3 alebo 4 prvky

>> a = [1 2 3 4 5 6];
>> vetvenie2(a)
ans =
Vektor má viac ako 4 prvky

4.6.2. Podmienené opakovanie vykonávania príkazov (cykly)

Cyklus slúži na zápis príkazov, ktoré majú byť vykonávané opakovane (nekoľkokrát za sebou). Počet opakovaní týchto príkazov závisí od nejakej podmienky alebo môže byť dopredu známy. Preto existujú dva základne typy cyklov:

Príkazy vnútri cyklu sa nazývajú telo cyklu.

Cyklus riadený podmienkou - WHILE

Cyklus riadený podmienkou používame, pokiaľ chceme niekoľkokrát vykonať určité príkazy, ale dopredu nepoznáme počet opakovaní, ale poznáme podmienky, za ktorých sa príkazy vykonávať majú. Táto podmienka sa nazýva riadiaca podmienka cyklu. V MATLABe je tento druh cyklov realizovaný príkazom while.

Cyklus while začína kľúčovým slovom while a končí kľúčovým slovom end:

while podmienka
  príkazy
end

Poznámky:

Činnosť cyklu je možné vyjadriť vetou: Pokiaľ platí podmienka, vykonávaj príkazy.

Na začiatku sa testuje platnosť riadiacej podmienky. Pokiaľ podmienka platí (t.j. výraz má nenulovú hodnotu), vykonajú sa všetky príkazy tela cyklu. Potom sa opäť testuje podmienka a pokiaľ platí, vykonajú sa opäť všetky príkazy tela cyklu atď., pokiaľ sa pri testovaní podmienky nezistí, že podmienka neplatí (t.j. hodnota výrazu je nulová). Vtedy cyklus skončí, t.j. pokračuje sa vykonávaním príkazu za jeho koncom (ktorý je označený kľúčovým slovom end), pokiaľ tam nejaké sú.

Koniec cyklu môže nastať už pri prvom teste podmienky (ak je nulová), takže sa môže stať, že príkazy v tele cyklu sa nevykonajú ani raz.

Pretože sa podmienka testuje opakovane a závisí na ej ukončenie cyklu, mali by sa dodržiavať následujúce doporučenia: riadiaca podmienka cyklu by mala byť ovplivňovaná vykonávaním príkazov v tele cyklu tak, aby raz prestala platiť. Inak cyklus nikdy neskončí (nekonečný cyklus). Pokiaľ chceme ukončiť vykonávanie nekonečného cyklu, stlačíme CTRL+C.

Príklad 4.20: Nekonečný cyklus
while 1  % podmienka je vždy pravdivá, má stále hodnotu 1
  disp('opakujem...')
end
Príklad 4.21: Funkcia fakt1.m
function f = fakt1(n)
% FAKT1 - vypočet faktorialu celeho cisla
% f = fakt1(n)
% n ... cislo
% f ... faktorial (f=n!)

if n<0
  error('faktorial neexistuje')
end
f = 1; 
while n>1 
  f = f*n; 
  n = n-1;
end
Výsledok príkladu 4.21:
>> f = fakt1(5)
f =
        120.00
		
>> fakt1(0)
ans =
          1.00
		  
>> f = fakt1(-5)
??? Error using ==> fakt1
faktorial neexistuje

Cyklus so známym počtom opakovaní (iteračný cyklus) - FOR

Tento cyklus používame, keď dopredu vieme, koľkokrát sa majú vykonať určité príkazy. Počet opakovaní je väčšinou daný vektorom, z ktorého si v každej iterácii (t.j. pri každom prechode cyklom) vezmeme jednu hodnotu - hodnota je uložená v tzv. riadiacej premennej cyklu. V MATLABe je tento druh cyklu realizovaný príkazom for.

Cyklus for začína kľúčovým slovom for a končí kľúčovým slovom end:

for premenná = výraz
  príkazy
end

Poznámky:

Činnosť cyklu je možné vyjadriť vetou: n-krát vykonať príkazy (n je dĺžka výrazu, t.j. počet prvkov vektora alebo počet stĺpcov matice).
Na začiatku sa zistí dĺžka (n) výrazu a pokiaľ je nenulová, n-krát sa vykoná telo cyklu (príkazy). V každej iterácii je riadiaca premenná cyklu rovná jednému prvku vektora (začína sa prvým prvkom a pokračuje sa po rade). Po vyčerpaní všetkých hodnôt vektora cyklus skončí, tzn. pokračuje sa vykonávaním príkazu za jeho koncom (ktorý je označený kľúčovým slovom end), pokiaľ tam nejaké sú.

Koniec cyklu môže nastať predčasne, pokiaľ je v tele cyklu obsiahnutý príkaz break alebo return.

Príklad 4.22: Skript fakt2.m
k = 1;
for i=1:5 
  k = k*i;
  sprintf('%d! = %d',i,k)
end
Výsledok príkladu 4.22:
>> fakt2
ans =
1! = 1
ans =
2! = 2
ans =
3! = 6
ans =
4! = 24
ans =
5! = 120
Príklad 4.23: Naplnenie matice súčinom jej súradníc - skript matica.m
n = 3;   % Pocet stlpcov 
m = 2;   % Pocet riadkov 
for i=1:m
  for j=1:n
    A(i,j) = i*j
  end
end
Príklad 4.24:
>> matica
A =
          1.00
A =
          1.00          2.00
A =
          1.00          2.00
          2.00             0
A =
          1.00          2.00
          2.00          4.00
A =
          1.00          2.00
          2.00          4.00
          3.00             0
A =
          1.00          2.00
          2.00          4.00
          3.00          6.00
top

4.7. Príkazy pre užívateľský vstup

Príkaz Opis
input žiadosť o vstup z klávesnice
keyboard funkcia preruší chod programu pre príkazy z príkazového riadku
menu funkcia umožňujúca výber cez menu, ktorá vracia poradie vybranej položky
pause čakanie na stlačenie klávesy
Príklad 4.25: Načítanie veľkosti vektora z klávesnice
>> dlzka = input('Zadaj velkost vektora: ')
Zadaj velkost vektora: 4
dlzka =
  4
Príklad 4.26: Súbor klavesnica.m - Použitie keyboard
disp('Zaciatok')
keyboard
disp('Koniec')
Výsledok príkladu 4.26:
>> klavesnica
Zaciatok
K>> c = 1
c =
          1.00
K>> b = 2
b =
          2.00
K>> return
Koniec
>> 
Príklad 4.27: Vytvorenie menu pre výber krivky
k = menu('Vyber krivky','Priamka','Parabola','Exponenciala')
Výsledok príkladu 4.27:

Výsledok príkladu 4.27: Výsledok po kliknutí na položku 'Parabola'
k =
          2.00
top

4.8. Úlohy

  1. Vytvorte:
    • matematickú funkciu v tvare y = x*sin(x)+cos(2*x).
    • funkciu, ktorej výstupnou hodnotou budú spoločné prvky dvoch vektorov (vektory » argumenty funkcie), napr. [1 3 4] a [2 4 5] majú spoločný prvok 4.
    • funkciu, ktorá vypočíta faktoriál zadaného čísla (číslo » argument funkcie). Ak použijeme funkciu bez argumentov, potom uvažujte číslo=1.
    • funkciu, ktorá vytvorí maticu zadaných rozmerov (rozmery matice » argumenty funkcie). Ak použijeme funkciu iba s jednym parametrom, potom funkcia vytvorí štvorcovú maticu. Ak použijeme funkciu bez parametrov, potom funkcia vytvorí štvorcovú maticu 5x5. Jednotlivé prvky matice budú definované poradovým číslom bunky (1 až N).
    • funkciu, ktorá vytvorí štvorcovú maticu zo zadaným rozmerom (rozmer matice » argument funkcie), kde na diagonále budú čísla 1 až N. Mimo diagonály budú čísla rovné 0.
  2. Vytvorte m-súbor v ktorom:
    • definujte vektor mince s hodnotami 1, 2, 5 a 10
    • v cykle, pomocou funkcie eval a vektora mince, vytvorte premenné minca1, minca2, minca5, minca10, ktoré naplňte príslušnou hodnotou (1, 2, 5, 10)
  3. Vytvorte malú aplikáciu pre načítanie a zobrazenie údajov pomocou menu, ktorá by obsahovala:
    • hlavné menu s položkami Inicializácia, Zobrazenie a Koniec
    • sa otvorí nové menu s ponukou nastavenia farby zobrazenia
    • výberom položky Inicializácia sa otvorí nové menu s ponukou:
      • sin
      • cos
      Výberom jednej z položiek sa vytvoria vektory t=[0:0.1:2pi] a y=sin(t), resp. y=cos(t)
    • výberom položky Zobrazenie sa otvorí nové menu s ponukou farby:
      • červená
      • modrá
      • čierna
      • fialová
      Výberom jednej z položiek sa vykreslí priebeh údajov so zvolenou farbou (príkaz plot(t,y,'farba'))
    • výberom položky Koniec sa aplikácia ukončí
    Poznámka: aby sa ponuka po výbere opäť zobrazila, použite nekonečný cyklus. Cyklus sa ukončí výberom položky Koniec.

5. Matice a vektory

V názve matice, ktorý môže obsahovať až 31 znakov, sú povolené iba nasledujúce znaky:

Názov nesmie začínať číslicou.

5.1. Zápis matice

Maticu rozmeru mxn vytvárame pomocou hranatých zátvoriek, v ktorých uvádzame jednotlivé riadky oddelené bodkočiarkou, pričom prvky každého riadku (stĺpce) oddeľujeme medzerou alebo čiarkou (môžme ich použiť aj naraz). V každom riadku musí byť rovnaký počet prvkov (stĺpcov)!

5.1.1. Spôsoby zadávania matice

Rôzne spôsoby zadávania matice si ukážeme na príkladoch. Majme maticu

Príklad 5.1: Zápis medzera, bodkočiarka
>> A = [1 2 3;4 5 6;7 8 9]
A =
     1  2  3
     4  5  6
     7  8  9
Príklad 5.2: Zápis čiarka, bodkočiarka
>> A = [1,2,3;4,5,6;7,8,9]
A =
     1  2  3
     4  5  6
     7  8  9
Príklad 5.3: Zápis čiarka, enter
>> A = [1,2,3
     4,5,6
     7,8,9]
A =
     1  2  3
     4  5  6
     7  8  9
Príklad 5.4: Kombinácia
>> A = [1 2 3;4,5,6
     7 8 9]
A =
     1  2  3
     4  5  6
     7  8  9
Príklad 5.5: Zmena hodnoty prvku matice
>> A(1,2) = 0
A =
     1  0  3
     4  5  6
     7  8  9
Príklad 5.6: Definovanie matice "pozíciou prvkov"
>> B(1,2) = 3  % B(riadok, stĺpec) = hodnota
B =
     0  3

>> B(3,3) = 4
B =
     0  3  0
     0  0  0
     0  0  4

>> B(2,2:3) = [1 2]
B =
     0  3  0
     0  1  2
     0  0  4
top

5.2. Manipulácia s maticami

5.2.1. Výber prvkov a nejakej časti matice

Rôzne spôsoby manipulácie matice si opäť ukážeme na príkladoch. Majme maticu

Príklad 5.7: Výber prvku matice
>> B = A(2,2)
B =
     5

>> A(1,3)
ans =
     3
Príklad 5.8: Výber riadku, stĺpca
>> B = A(2,:) % Výraz : znamená všetky stĺpce
B = 
     4  5  6
>> A(:,3)     % Výraz : znamená všetky riadky
ans =
     3 
     6
     9
Príklad 5.9: Výber časti matice
>> B = A(2:3,1:2) % Výraz n:m znamená
B =               % n-tý riadok (stĺpec) až m-tý riadok (stĺpec)
     4  5
     7  8
	 
>> A(1,1:2)
ans = 
     1 2
Príklad 5.10:
>> a = [1 2 3 4 5 6 7 8 9 0 1 2 3]
a =
      1  2  3  4  5  6  7  8  9  0  1  2  3
	  
>> a(1:end)     % Výraz end posledný prvok (index)
ans = 
      1  2  3  4  5  6  7  8  9  0  1  2  3
	  
>> a(4:end-2)
ans = 
      4  5  6  7  8  9  0  1

5.2.2. Funkcie pre manipuláciu s maticami

Medzi užitočné funkcie patria tiež tie, ktoré manipulujú s maticami/vektormi. Môžu nám uľahčiť prácu so zadávaním matíc/vektorov.

Funkcia Opis
diag vytvorenie a vybratie diagonály matice
fliplr výmena stĺpcov matice zľava-doprava
flipud výmena riadkov matice zhora-nadol
rot90 rotácia matice o 90 stupňov
size rozmery matice
tril vybratie dolnej triangulárnej matice
triu vybratie hornej triangulárnej matice
: index v matici

Použitie funkcií pre manipuláciu s maticami, ktoré sú uvedené v tabuľke, si opäť ukážeme na príkladoch. Majme maticu a vektor



Príklad 5.11: Výber hlavnej diagonály matice
>> d = diag(A)
d =
     1
     5
     9
Príklad 5.12: Výber subdiagonály pod hlavnou diagonálou matice
>> d = diag(A,-1)
d =
     4
     8
Príklad 5.13: Výber subdiagonály nad hlavnou diagonálou matice
>> d = diag(A,1)
d =
     2
     6
	 
>> d = diag(A,2)
d =
     3
Príklad 5.14: Vytvorenie diagonálnej matice
>> D = diag(b)
D =

     1  0  0  0  0
     0  2  0  0  0
     0  0  3  0  0
     0  0  0  4  0
     0  0  0  0  5
Príklad 5.15: Zámena stĺpcov
>> B = fliplr(A)
B =
     3     2     1
     6     5     4
     9     8     7
Príklad 5.16: Zámena riadkov
>> B = flipud(A)
B =
     7     8     9
     4     5     6
     1     2     3
Príklad 5.17: Rozmer matice
>> size(A)
ans =
     3     3

>> [riadky, stlpce] = size(A)
riadky =
     3
stlpce =
     3
Príklad 5.18: Rotácia matice
>> B = rot90(A)    % Rotácia matice o 90º
B =
     3     6     9
     2     5     8
     1     4     7
Príklad 5.19: Vytvorenie dolnej trojuholníkovej matice
>> B = tril(A)
B =
     1     0     0
     4     5     0
     7     8     9

>> B = tril(A,-1)
B =
     0     0     0
     4     0     0
     7     8     0
Príklad 5.20: Vytvorenie hornej trojuholníkovej matice
>> B = triu(A)
B =
     1     2     3
     0     5     6
     0     0     9

>> B = triu(A,1)
B =
     0     2     3
     0     0     6
     0     0     0
top

5.3. Maticové operácie

Všetky premenné sú v MATLABe chápané ako matice. S tým súvisí aj správanie sa operátorov.

Názov Syntax Opis
sčítanie a1+a2
  • vykonáva sa po prvkoch
  • argumety musia mať rovnaké rozmery alebo aspoň jeden z nich je skalár
  • prvky výsledku sú súčtom/rozdielom odpovedajúcich si prvkov a1 a a2 (skalár je automaticky doplnený na rozmer druhého argumentu)
odčítanie a1-a2
násobenie matíc a1*a2
  • jedná sa o algebraické násobenie matíc, a preto počet stĺpcov a1 musí byť rovnaký ako počet riadkov a2 (t.j. mxp a pxn). Potom výsledok C=A*B má rozmer mxn a každý jeho prvok je
umocnenie matice a1^a2
  • pokiaľ sú oba argumenty skaláry, ide o a2-tú mocninu čísla a1
  • pokiaľ je a1 matica a a2 kladné celé číslo (skalár), platí: a1^a2 = a1*a1*...*a1 (násobenie matíc!), teda a1 musí byť štvorcová matica
delenie matíc a1/a2
  • zhruba platí, že A/B = A*inv(B), teda druhým argumentom by mala byť regulárna matica (skalár) odpovedajúceho rozmeru. Presne je A/B=(B'\A')'
  • druhým argumentom muže byť aj skalár
delenie matíc zľava a1\a2
  • pokiaľ je prvým argumentom štvorcová matica, potom je výsledok A\B rovnaký ako inv(A)*B
  • ak je argumentom štvorcová matica A a stĺpcový vektor b, potom sa operátor používa pre riešenie sústav lineárnych rovníc, kde riešenie je x=A\b (pri výpočte sa používa Gaussova eliminácia)
transpozícia a konjugovanosť a1'
  • výsledkom je transponovaná matica, pričom všetky komplexné čísla zmenia znamienko imaginárnej časti (na opačné)
  • pri reálných maticiach funguje rovnako ako .'

5.3.1. Príklady pre základné maticové operácie

Príklad 5.21: Súčet matíc
>> C = [1 2;7 8];
>> D = [3 -5;-1 4];
>> C+D
ans =
     4    -3
     6    12

>> 3+D
ans =
     6    -2
     2     7
Príklad 5.22: Rozdiel matíc
>> C-D
ans =
    -2     7
     8     4
	 
>> D-2
     1    -7
    -3     2
Príklad 5.23: Násobenie matíc
>> b = [2;6];
>> C*D
ans =
     1     3
    13    -3

>> C*b   % Rozmery: 2x2 x 2x1 » 2x1
ans =
    14
    62

>> D*2
ans =
     6   -10
    -2     8
Príklad 5.24: Delenie matíc
>> A = [1 2;7 8];
>> B = [3 -5;-1 4];
>> x = B/A
x =
   -9.8333    1.8333
    6.0000   -1.0000
Príklad 5.25: Ľavé delenie matíc
>> x = A\B
x =
   -4.3333    8.0000
    3.6667   -6.5000
Príklad 5.26: Transpozícia matice
>> C'
ans =
     1     7
     2     8
Príklad 5.27: Umocnenie matice
C^2
ans =
    15    18
    63    78
% Rovnaký výsledok dosiahneme aj výrazom
C*C
ans =
    15    18
    63    78

5.3.2. Operácie po prvkoch v maticových zápisoch

Názov Syntax Opis
sčítanie a1+a2
odčítanie a1-a2
násobenie po prvkoch a1.*a2
umocnenie po prvkoch a1.^a2
delenie po prvkoch a1./a2
delenie po prvkoch zľava a1.\a2
Príklad 5.28: Násobenie matice po prvkoch
>> C.*D
ans =
     3   -10
    -7    32
Príklad 5.29: Delenie matice po prvkoch
>> C./D
ans =
    0.3333   -0.4000
   -7.0000    2.0000
Príklad 5.30: Umocnenie matíc po prvkoch
>> C.^2
ans =
     1     4
    49    64

>> C.*C
ans =
     1     4
    49    64

5.3.3. Riešenie sústavy lineárnych rovníc

Sústavu rovníc Ax = b riešime pomocou operátora \ alebo pomocou inverznej matice (funkcie inv). V každom prípade je potreba najskôr overiť rešiteľnosť sústavy, napríklad pomocou výpočtu determinantu (funkcie det):

Príklad 5.31: Funkcia sustava.m
function x = sustava(A,b)
% SUSTAVA - riesenie sustavy linearnych rovnic 
% A ... matice sustavy
% b ... vektor pravych stran
% x ... riesenie sustavy
if det(A) == 0
   error('Sustava nema riesenie!')
end
x = A\b; % vypocet riesenia alebo x=inv(A)*b; 
Príklad 5.32: Spustenie funkcie a overenie výsledku
>> M=[3 2 -1; 1 0 1; 2 1 -1];   % zadanie sustavy v maticovem tvare
>> v=[5;4;2]; 
>> riesenie = sustava(M,v)      % spustenie funkcie
riesenie =
    1.5000
    1.5000
    2.5000

>> M*riesenie                   % overenie spravnosti riesenia
ans =
     5
     4
     2

5.3.4. Operácie v cykle

Ak je potrebné vektor naplniť prvkami, ktoré sú od seba rovnako "vzdialené", je možné to urobiť pomocou "dvojbodkového priradenia", x = [xzac:dx:xkon] kde xzac je začiatočná hodnota, dx je inkrement a xkon je konečná hodnota.
Príklad 5.33:
% Vytvorenie vektora s prvkami od 0 po 3 delením 0.5
x = [0:0.5:3]
x =
    0    0.5    1    1.5    2    2.5    3

% Vytvorenie vektora s prvkami od 10 po 15 delením 1
y = 10:15
y =
    10    11    12    13    14    15
top

5.4. Špeciálne matice

Medzi užitočné funkcie patria tiež tie, ktoré vytvárajú matice/vektory. Môžu nám uľahčiť prácu so zadávaním matíc/vektorov. Tieto funkcie majú väčšinou dva vstupné parametre: [matica] = nazov_funkcie(m,n), ale pokiaľ chceme získať štvorcovú maticu (typu mxm), stačí zadať iba jeden vstup. Prehľad týchto funkcií zobrazí príkaz help elmat.

funkcia Opis
eye jednotková diagonálna matica
zeros nulová matica
ones matica zložená z jednotiek
rand matica náhodných čísel z intervalu (0,1)
randn matica náhodných čísel
linspace vektor hodnôt s lineárnym delením
logspace vektor hodnôt s logaritmickým delením
magic magická štvorcová matica
meshgrid X a Y súradnice pre 3-D zobrazenie
Príklad 5.34: Vytvorenie diagonálnej (jednotkovej) matice
>> C = eye(3)  % alebo C = eye(3,3)
C =
     1     0     0
     0     1     0
     0     0     1
Príklad 5.35: Vytvorenie nulovej matice
>> C = zeros(2,3)
C =
     0     0     0
     0     0     0
Príklad 5.36: Vytvorenie matice iba s jednotkami
>> C = ones(3,2)
C =
     1     1
     1     1
     1     1
Príklad 5.37: Vytvorenie matice s náhodnými prvkami z intervalu (0,1)
>> rand(2,3)
ans =
    0.4447    0.7919    0.7382
    0.6154    0.9218    0.1763
Príklad 5.38: Vytvorenie matice s náhodnými prvkami
>> randn(2,3)
ans =
   -0.5883   -0.1364    1.0668
    2.1832    0.1139    0.0593
Príklad 5.39: Vytvorenie vektora hodnôt s lineárnym delením
>> linspace(1,3)     % 100 bodov v intervale <1,3>
ans =
  Columns 1 through 7 
    1.0000    1.0202    1.0404    1.0606    1.0808    1.1010    1.1212
  Columns 8 through 14 
    1.1414    1.1616    1.1818    1.2020    1.2222    1.2424    1.2626
...

  Columns 99 through 100 
    2.9798    3.0000

>> linspace(1,3,10)  % 10 bodov v intervale <1,3>
ans =
  Columns 1 through 7 
    1.0000    1.2222    1.4444    1.6667    1.8889    2.1111    2.3333
  Columns 8 through 10 
    2.5556    2.7778    3.0000
Príklad 5.40: Vytvorenie vektora hodnôt s logaritmickým delením
>> logspace(1,3)
ans =
  1.0e+003 *
  Columns 1 through 7 
    0.0100    0.0110    0.0121    0.0133    0.0146    0.0160    0.0176
  Columns 8 through 14 
    0.0193    0.0212    0.0233    0.0256    0.0281    0.0309    0.0339

...

  Columns 99 through 100 
    2.9798    3.0000

>> linspace(1,3,10)  % 10 bodov v intervale <1,3>
ans =
  1.0e+003 *
  Columns 1 through 7 
    0.0100    0.0167    0.0278    0.0464    0.0774    0.1292    0.2154
  Columns 8 through 10 
    0.3594    0.5995    1.0000
Príklad 5.41: Vytvorenie magickej matice
% Magicka matica: sucet kazdeho riadka a stlpca a diagonály je rovnaky
>> magic(4)   % magic(n) - musi platit n >= 3
ans =
    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1
Príklad 5.42: Vytvorenie X a Y súradníc pre 3-D zobrazenie
>> [X,Y] = meshgrid(-2:.2:2, -2:.2:2);
>> size(X)
ans =
    21    21
>> size(Y)
ans =
    21    21
>> length(-2:.2:2)
ans =
    21
Príklad 5.43: Vytvorenie stavovej matice systému, ktorého charakteristický polynóm je s4+8s3+5s2+3s+1
Asys = [zeros(3,1), eye(3); -1,-3,-5,-8]
Asys =
     0     1     0     0
     0     0     1     0
     0     0     0     1
    -1    -3    -5    -8
top

5.5. Úlohy

  1. Vytvorte ľubovoľnú maticu A o rozmere 3x3, vyskúšajte si rôzne spôsoby zápisu
  2. S maticou A urobte nasledovné úkony:
    • vyberte prvok prvého riadku a druhého stĺpca
    • vyberte prvky druhého riadku a druhého až tretieho stĺpca
    • vyberte prvky prvého riadku
    • vyberte prvky tretieho stĺpca
    • vyberte hlavnú diagonálu
    • zistite rozmery matice
    • rotujte maticu o 90 stupňov
  3. Vytvorte dve matice rovnakých rozmerov a skúste urobiť ich súčet a rozdiel
  4. Vytvorte si štvorcovú maticu, urobte jej transpozíciu a umocnite na druhú
  5. Vytvorte si dve štvorcové matice a vynásobte ich
  6. Operácie umocnenia a násobenia vyskúšajte aj po prvkoch
  7. Riešte sústavu rovníc
    2x1 + 5x2 + 3x3 = 1
    4x1 + 6x2 + 2x3 = 5
     x1 - 5x2 + 3x3 = 3
  8. Vytvorte vektor s hodnotami od 10 do 30 s delením 3
  9. Vytvorte si nasledovné špecialne matice:
    • jednotkovú diagonálnu maticu rozmerov 3x3
    • nulovú maticu rozmerov 2x3
    • maticu náhodných čísel roznerov 5x3

6. Polynómy

6.1. Polynomické funkcie

Funkcia Opis
conv násobenie polynómov
deconv delenie polynómov
poly konštrukcia polynómov zo špecifikovaných koreňov
polyder derivácia polynómu
polyfit aproximácia dát polynómom
polyval hodnota polynómu
polyvalm hodnota polynómu s maticovým argumentom
residue rozklad na parciálne zlomky
roots nájdenie koreňov polynómu

Všeobecne polynóm p vieme zapísať nasledovne: p = [p1 p2 ... pn pn+1], čo vyjadruje p = p1sn+p2sn-1+ ... pns+ pn+1].

Jednotlivé funkcie uvedené v tabuľke si ukážeme na príkladoch.

6.1.1. Násobenie a delenie polynómov

Príklad 6.1: Súčin polynómov
>> b = [1 4 5 2]; a = [2 5 3];
>> conv(a,b)
ans =
     2    13    33    41    25     6
Príklad 6.2: Delenie polynómov
>> [q,r] = deconv(b,a)
q =
    0.5000    0.7500
r =
    0         0   -0.2500   -0.2500
% Spätná kontrola 
>> conv(q,a)+r
ans =
     1     4     5     2

6.1.2. Hodnota polynómu

Nech p = [p1 p2 ... pn pn+1], potom funkciu y = polyval(p,x) je získaná z výrazu y = p1xn+p2xn-1+ ... pnx+pn+1
Príklad 6.3: Skalár
>> p = [2 3 4 1];
>> polyval(p,1)
ans =
    10
Príklad 6.4: Vektor
>> polyval(p,[0 2 3])
ans =
     1    37    94

6.1.3. Korene polynómu

Príklad 6.5: Korene polynómu x3+2x2-9x-18
>> roots([1 2 -9 -18])
ans =
    3.0000
   -3.0000
   -2.0000
Príklad 6.6: Korene polynómu z3-2z2+3z+5
>> roots([1 -2 3 5])
ans =
   1.4473 + 1.8694i
   1.4473 - 1.8694i
  -0.8946 

6.1.4. Charakteristický polynóm matice

Príklad 6.7:
>> A = [1.2 3 -0.9;5 1.75 6;9 0 1];
>> poly(A)
ans =
    1.0000   -3.9500   -1.8500 -163.2750

6.1.5. Vytvorenie polynómu na základe jeho koreňov

Príklad 6.8:
>> a = [1.2 3 -0.9 0 1];
>> poly(a)
ans =
    1.0000   -4.3000    3.1200    3.4200   -3.2400   0
% Spätná kontrola 
>> roots(ans)
ans =
         0
    3.0000
   -0.9000
    1.2000
    1.0000

6.1.6. Derivácia polynómu

Príklad 6.9: Derivácia polynómu
>> a = [2 1 3];
>> polyder(a)
ans =
     4     1

>> b = [3 1 5 4];
>> polyder(b)
ans =
     9     2     5
Príklad 6.10: Derivácia súčinu polynómov a*b
>> polyder(a,b)
ans =
    30    20    60    32    19
Príklad 6.11: Derivácia podielu polynómov b/a ako podiel q/d
>> [q,d] = polyder(b,a)
q =
     6     6    18   -10    11
d =
     4     4    13     6     9

6.1.7. Rozklad polynómov na parciálne zlomky

B/A = R(1)/(s-P(1)) + R(2)/(s-P(2)) + ... R(n)/(s-P(n)) + K

Príklad 6.12:
>> a = [1 5.5 -1.5 -27]; b = [2 5 1];
>> [R,P,K] = residue(b,a)
R =
    1.9487
   -0.5333
    0.5846
P =
   -4.5000
   -3.0000
    2.0000
K =
     []

6.1.8. Aproximácia dát polynómom n-tého stupňa

V MATLABe je možné zadané (namerené) údaje aproximovať polynómom n-tého stupňa pomocou funkcie polyfit, ktorá používa metódu najmenších štvorcov (MNŠ):
Syntax príkazu:
p = polyfit(x,y,n)

kde

Poznámka:

Pretože nás okrem koeficientov aproximovaného polynómu väčšinou zaujímajú aj hodnoty polynómu P(x) vo všetkých prvkoch vektora x (napr. kvôli grafickému znázorneniu), existuje tiež funkcia polyval:

Syntax príkazu:
y_aprox = polyval(p,x)

kde

Príklad 6.13: Aproximácia namerených hodnôt polynómom 2. stupňa
% namerene udaje, nezavisl. premenne
>> u = [1 1.5 2.1 2.5 3 3.1 3.2 3.5];
% namerene udaje, zavisl. premenne
>> v = [7.8 8.15 8.3 8.25 8.1 8.3 8.35 8.2]; 
>> p1 = polyfit(u,v,2)       % koeficienty polynomu 2. stupna pre 'u' a 'v'
p1 =
   -0.1629    0.8665    7.1462

>> v_aprox = polyval(p1,u);  % hodnoty polynómu pre 'u'
>> Sv = sum((v_aprox-v).^2)  % suma stvorcov odchyliek
Sv =
    0.0556
Príklad 6.14: Aproxiácia priamkou
>> p2 = polyfit(u,v,1)       % koeficienty polynomu 1. stupna pre 'u' a 'v'
p2 =
    0.1313    7.8547
>> p_aprox = polyval(p2,u);  % hodnoty polynómu pre 'u'
>> Sp = sum((p_aprox-v).^2)  % suma stvorcov odchyliek
Sp =
    0.1198
Príklad 6.15: Vykreslenie aproximácie polynómom 1. a 2. stupňa
>> plot(u,v,'r+')        % graf, povodne udaje ako cervene kriziky 
>> hold on               % prikreslenie dalsich udajov
>> plot(u,v_aprox,'k')   % graf polynomu 2. stupna (cierne body spojene ciarou)
>> plot(u,p_aprox,'b')   % graf polynomu 1. stupna (modre body spojene ciarou)
Výsledok príkladu 6.15:
top

6.2. Úlohy

  1. Vyvorte polynómy:
    • a = 2x3-3x+1
    • b = 3x2+7x+2
    • c = x-3
  2. Vyskúšajte operácie násobenia a delenia polynómov:
    • vynásobte polynómy a*b, b*c, a*c
    • vydeľte polynómy a/b
  3. Vypočítajte nasledovné derivácie polynómov:
    • deriváciu polynómu a
    • deriváciu súčinu polynómov b, c
    • deriváciu podielu polynómov a, c
  4. Zistite korene polynómov a, b
  5. Vypočítajte hodnoty polynómov a, b pre vstupné hodnoty [1 2 3]
  6. Aproximujte údaje x, y polynómami 2. až 5. stupňa ak:
    x = [1:10];
    y = [-4 -7 4 41 116 241 428 689 1036 1481];
    • vypočítajte sumy štvorcov odchyliek
    • ktorá aproximácia je najlepšia? (na vyhodnotenie použite príkaz pre vetvenie)

7. Matice a lineárna algebra

Základné vlastnosti maticových funkcií sú:

Prehľad týchto funkcií zobrazí príkaz help matfun.

7.1. Príkazy na analýzu vlastnosti matíc

Funkcia Opis
det determinant matice
null nulové zobrazenie matice
orth ortogonalizacia matice
rank počet lineárne nezávislých riadkov
trace suma diagonálnych prvkov matice

7.1.1. Determinant a operácie s prvkami matice

Príklad 7.1: Výpočet determinantu
>> A = [4 -2 1;-1 5 6;2 0 5];
det(A)
ans =
     56
Príklad 7.2: Súčet diagonálnych prvkov
>> B = [1 0 2;2 3 4;4 6 8];
trace(B)
ans =
     12
Príklad 7.3: Počet lineárne nezávislých riadkov matice
>> rank(B)
ans =
     2

7.1.2. Nulové zobrazenie a ortogonalizácia matice

Príkazom null(A) je možné získať takú maticu Q, pre ktorú platí:

  1. Súčin transponovanej a matice Q sa rovná jednotkovej matici, Q'*Q=I
  2. Súčin matíc A a Q je rovný nulovej matici A*Q=0

Ak taká matica Q neexistuje, funkcia vráti [].

Pod pojmom ortogonalizácia matice A t.j. použitím príkazu orth(A) rozumieme získanie takej matice Q, pre ktorú platí:

  1. Súčin matíc Q' a Q sa rovná jednotkovej matici, Q'*Q=I
  2. Stĺpce sa menia v tom istom intervale ako stĺpce matice A
  3. Počet stĺpcov je daný počtom nezávislých riadkov matice A
Príklad 7.4: Nulové zobrazenie - existuje matica Q
>> A = [1 -2;-3 6];
>> Q = null(A)
Q  =
    0.8944
    0.4472
% Spätná kontrola
>> Q'*Q
ans =
    1.0000
>> A*Q
ans =
     0
     0
Príklad 7.5: Nulové zobrazenie - neexistuje matica Q
>> B = [1 2;3 5];
>> Q = null(B)
Q  =
   Empty matrix: 2-by-0
Príklad 7.6: Ortogonalizácia matice - riadky matice sú nezávislé
>> A = [1 2 -3;3 5 2;4 6 1];
>> Q = orth(A)
Q =
   -0.1806    0.9505   -0.2527
   -0.6298   -0.3091   -0.7126
   -0.7555    0.0305    0.6545
% Spätná kontrola
>> Q'*Q
ans =
    1.0000    0.0000    0.0000
    0.0000    1.0000    0.0000
    0.0000    0.0000    1.0000
Príklad 7.7: Ortogonalizácia matice - riadky matice sú závislé
>> B = [4 2 -3;1 -2 2;2 -4 4];
>> Q = orth(B)
Q =
    0.4939    0.8695
   -0.3889    0.2209
   -0.7777    0.4417
% Spätná kontrola
>> Q'*Q
ans =
    1.0000    0.0000
    0.0000    1.0000
top

7.2. Príkazy pre riešenie sústavy lineárnych rovníc

Na riešenie soustavy lineárnych rovníc, ktorá je prevedená do maticového tvaru (Ax = b), môžeme použiť okrem operátora \ aj inverznú maticu.

Príkaz Opis
inv inverzná matica
pinv pseudoinverzná matica

Príkaz Y = pinv(A) vracia maticu, pre ktorú platí:

  1. je rozmerov ako A'
  2. A*Y*A=A; Y*A*Y=Y
  3. Y, A*Y a Y*A sú Hemiltovské matice
Príklad 7.8: Inverzná matica
>> A = [1 5 2;4 -2 1;-3 3 2];
>> B = inv(A)
B =
    0.1400    0.0800   -0.1800
    0.2200   -0.1600   -0.1400
   -0.1200    0.3600    0.4400
% Spätná kontrola
>> A*B
ans =
    1.0000    0.0000         0
   -0.0000    1.0000    0.0000
    0.0000   -0.0000    1.0000
Príklad 7.9: Pseudoinverzná matica
>> C = [1 0 -0.04;0 1 0.2];
>> B = pinv(C)
B =
    0.9985    0.0077
    0.0077    0.9616
   -0.0384    0.1920
% Spätná kontrola 
>> C*B*C
ans =
    1.0000    0.0000   -0.0400
    0.0000    1.0000    0.2000
>> B*C*B
ans =
    0.9985    0.0077
    0.0077    0.9616
   -0.0384    0.1920
>> C*B
ans =
    1.0000    0.0000
    0.0000    1.0000
Príklad 7.10: Maticová rovnica Ax = b
>> A = [5 8 9; 1 -2 3;2 -5 3];
>> b = [48;6;1];
>> x = inv(A)*b
x =
    1.0000
    2.0000
    3.0000
top

7.3. Rozklady matice na vlastné a singulárne hodnoty

Príkaz Opis
eig rozklad matice na vlastné hodnoty a vlastné vektory
svd singulárny rozklad
Príklad 7.11: Rozklad matice na vlastné hodnoty
>> A = [1 5 2;4 -2 1;-3 3 2];
>> eig(A)
ans =
  -5.0766          
   3.0383 + 0.7859i
   3.0383 - 0.7859i
Príklad 7.12: Rozklad matice na vlastné hodnoty a vlastné vektory
>> [vektor, hodnota] = eig(A)
vektor =
   0.4445   0.6998             0.6998          
  -0.7414   0.4647 - 0.0120i   0.4647 + 0.0120i
   0.5027   -0.4485 + 0.3049i  -0.4485 - 0.3049i

hodnota =
  -5.0766        0                  0          
        0   3.0383 + 0.7859i        0          
        0        0             3.0383 - 0.7859i

7.3.1. Singulárny rozklad matice

Na singulárne hodnoty je možné rozložiť maticu A pomocou príkazu [U,S,V] = svd(A), kde S je diagonálna matica a U, V sú také matice, aby bol splnený vzťah U*S*V' = A.

Príklad 7.13: Celý rozklad
>> A = [1 5 2;4 -2 1;-3 3 2];
>> [U,S,V] = svd(A)
U =
    0.6265    0.6963   -0.3503
   -0.4509    0.6904    0.5657
    0.6357   -0.1965    0.7465

S =
    7.0082         0         0
         0    4.6389         0
         0         0    1.5380

V =
   -0.4401    0.8724   -0.2125
    0.8478    0.3258   -0.4185
    0.2959    0.3643    0.8830
% Spätná kontrola 
>> U*S*V'
ans =
    1.0000    5.0000    2.0000
    4.0000   -2.0000    1.0000
   -3.0000    3.0000    2.0000
Príklad 7.14: Výpis iba prvkov diagonály matice
>> svd(A)
ans =
    7.0082
    4.6389
    1.5380
top

7.4. Úlohy

  1. Vyvorte maticu C = [2 5 -3;-1 4 7;5 4 8] a zistite:
    • determinant matice
    • súčet diagonálnych prvkov
    • inverznú maticu
    • počet nezávislých riadkov matice
  2. Vyvorte maticu B = [2 8 1;1 4 7;5 2 6] a určte ortogonalizáciu matice
  3. Urobte singulárny rozklad matice D = [5 -1 3;2 7 6;-2 0 5]

8. Funkcie pre prácu s údajmi

8.1. Základné funkcie pre prácu s údajmi

MATLAB umožňuje aj štatistické spracovanie údajov. Jednotlivé prvky sú zadávané ako matica (vektor). V prípade matice sa operácie robia po stĺpcoch.

Funkcia Opis
cumprod kumulatívne násobenie prvkov
cumsum kumulatívny súčet prvkov
max najväčší prvok
mean priemer alebo stredná hodnota
median stredná hodnota polohy
min najmenší prvok
prod násobenie prvkov
sort triedenie, zoraďovanie prvkov
std štandardná odchýlka
sum súčet prvkov
trapz numerická integrácia

8.1.1. Kumulatívny súčet prvkov a kumulatívne násobenie prvkov

Príklad 8.1: Kumulatívny súčet prvkov vektora
>> data3 = [3 2 5];
>> cumsum(data3)
ans =
     3     5    10
Príklad 8.2: Kumulatívny súčet prvkov matice
>> data4 = [4 3 2;3 7 4;-2 1 5]
data4 =
     4     3     2
     3     7     4
    -2     1     5
>> cumsum(data4)
ans =
     4     3     2
     7    10     6
     5    11    11
Príklad 8.3: Kumulatívne násobenie prvkov vektora
>> cumprod(data3)
ans =
     3     6    30
Príklad 8.4: Kumulatívne násobenie prvkov matice
>> cumprod(data4)
ans =
     4     3     2
    12    21     8
   -24    21    40

8.1.2. Súčet a násobenie prvkov

Príklad 8.5: Súčet prvkov vektora
>> data1 = [2 4 7];
>> sum(data1)
ans =
    13
Príklad 8.6: Súčet prvkov matice
>> data2 = [4 5 2;1 3 7;4 -2 1];
>> sum(data2)       % Sucet stlpcov 
ans =
     9     6    10

>> sum(data2,1)     % Sucet stlpcov 
ans =
     9     6    10

>> sum(data2,2)     % Sucet riadkov 
ans =
    11
    11
     3

>> sum(sum(data2))  % Sucet vsetkych prvkov 
ans =
    25
Príklad 8.7: Súčin prvkov vektora
>> prod(data1)
ans =
    56
Príklad 8.8: Súčin prvkov matice
>> prod(data2)        % Sucin stlpcov 
ans =
    16   -30    14

>> prod(data2,1)      % Sucin stlpcov 
ans =
    16   -30    14

>> prod(data2,2)      % Sucin riadkov 
ans =
    40
    21
    -8

>> prod(prod(data2))  % Sucin vsetkych prvkov 
ans =
    -6720

8.1.3. Minimálny a maximálny prvok z údajov

Príklad 8.9: Maximálny prvok vektora
>> max([4 2 15])
ans =
    15
Príklad 8.10: Minimálne prvky stĺpcov
>> min([15 5 3;1 6 7;4 8 2])
ans =
     1     5     2

>> min(min([15 5 3;1 6 7;4 8 2]))
ans =
     1

8.1.4. Stredná hodnota, priemer údajov

Príklad 8.11: Priemer prvkov vektora
>> mean([1 4 2 2 1])
ans =
     2
Príklad 8.12: Priemer prvkov matice
>> mean([1 3 2;5 2 1;2 2 1;4 2 2])
ans =
    3.0000    2.2500    1.5000

8.1.5. Zoradenie prvkov vektora a matice

Príklad 8.13: Zoradenie prvkov vektora
>> sort([4 8 5 1])
ans =
     1     4     5     8
Príklad 8.14: Zoradenie prvkov matice
>> sort([5 8 4;2 1 3;9 7 1])
ans =
     2     1     1
     5     7     3
     9     8     4

8.1.6. Numerický integrál

Funkciou trapz vieme vypočítať číselnú hodnotu integrálu krivky, ktorá je zadaná bodmi pomocou vektorov X, Y. Funkcia používa na výpočet integrálu lichobežníkovú náhradu.

Príklad 8.15: Numerický integrál
>> X = [1 2 3.5 5 7];
>> Y = [3 2 6 7 4];
>> trapz(X,Y)
ans =
   29.2500
Príklad 8.16: Numerický integrál, ak X je v tvare X = [0 1 2 3 ...]
>> trapz(Y)
ans =
   18.5000
top

8.2. Konečné diferencie, skalárny a vektorový súčin vektorov

Funkcia Opis
diff diferencia
gradient aproximovaný gradient

8.2.1. Výpočet diferencie

Funkcia diff vypočítava diferenciu, t.j. rozdiel medzi dvoma alebo viacerými bodmi podľa toho aký stupeň diferencie sa zvolí:

  1. diff(X), kde X je vektor, potom výsledná diferencia je v tvare
    [X(2)-X(1) X(3)-X(2) ... X(n)-X(n-1)]
  2. diff(X), kde X je matica, potom výsledná diferencia je realizovaná po stĺpcoch
    [X(2:n,:)-X(1:n-1,:)]
  3. diff(X,n), zápis n-tej diferencie. Napríklad pre 2. stupeň je v tvare
    [X(3)-2X(2)+X(1) ... X(n)-2X(n-1)+X(n-2)]
Príklad 8.17: Diferencia 1. stupňa - vektor
>> x = [4 7 3.5 -1 5 3 6];
>> diff(x)
ans = 
    3.0000   -3.5000   -4.5000    6.0000   -2.0000    3.0000
Príklad 8.18: Diferencia 2. stupňa - vektor
>> diff(x,2)
ans =
   -6.5000   -1.0000   10.5000   -8.0000    5.0000
Príklad 8.19: Diferencia 1. stupňa - matica
>> A=[1 2 3;1 4 5;7 8 9]
>> diff(A)
ans = 
     0     2     2
     6     4     4
Príklad 8.20: Diferencia 2. stupňa - matica
>> diff(A,2)
ans =
     6     2     2
Príklad 8.21: Výpočet derivácie funkcie sin(x2) použitím diferencie
>> h = .01;              % h je perióda vzorkovania
>> x = 0:h:pi;           % dy = y(i+1)-y(i); dt = h
>> diff(sin(x.^2))/h;    % derivácia funkcie použitím diferencie dy/dt
ans =
    0.0100    0.0300    0.0500    0.0700    0.0900    0.1100 ...
Príklad 8.22: Skutočná derivácia
>> 2*cos(x.^2).*x
ans =
    0    0.0200    0.0400    0.0600    0.0800    0.1000 ...

8.2.2. Výpočet gradientu

Funkcia gradient slúži na číselný výpočet gradientu funkcie. Funkcia môže byť dvojparametrová f(X,Y) alebo jednoparametrová f(X).
Pre dvojparametrovú funkciu platí zápis:
[PX,PY] = gradient(Z,dx,dy)
Funkcia vracia číselné partikulárne derivácie z matice Z do matíc PX = dZ/dx a PY = dZ/dy, kde dx a dy sú periódy vzorkovania pre X a Y.
Pri zápise [PX,PY] = gradient(Z) je dx = dy = 1.
Príklad 8.23: Jednoparametrová funkcia
>> x = [0:0.4:2.5];
>> y = exp(-x.^2);
>> gradient(y,0.4)
ans =
   -0.3696   -0.5909   -0.7690   -0.5625   -0.2733   -0.0927   -0.0379
top

8.3. Úlohy

  1. Vyvorte vektor a = [1 3 -2 2.4 8.4 -5.3] a maticu A = [1 2 3 4;-4 7 -2 3;7 4 2 -5]
  2. Použite základné funkcie pre prácu s údajmi (maticou A a vektorom a):
    • súčet a kumulatívny súčet prvkov
    • násobenie a kumulatívne násobenie prvkov
    • minimálny a maximálny prvok
    • triedenie prvkov
    • priemernú hodnotu prvkov
  3. Vypočítajte plochu pod krivkou určenou bodmi: X = [1 2.5 4 6 8]; Y = [3 5 2 7 4];
  4. Nájdite inflexný bod na krivke y=f(x), ktorej body získate príkazom:
    [y,t,x] = step([1],[1 2 1],[0:0.01:10])
    Príkazom plot(x,y) si môžete krivku vykresliť.

9. Práca s funkciami v Matlabe

Funkcia Opis
fminbnd minimalizácia funkcie s jednou premennou
fminsearch minimalizácia funkcie s niekoľkými premennými
fplot zobrazenie priebehu funkcie
fzero nájdenie núl funkcie s jednou premennou
ode23 riešenie diferenciálnych rovníc RK 3. radu
ode45 riešenie diferenciálnych rovníc RK 5. radu
quad numerický integrál v tvare nižšieho rádu

9.1. Minimalizácia funkcií a hľadanie nulového bodu

Pomocou funkcie fminbnd(F,x1,x2) je možné nájsť lokálne minimum funkcie s jednou premennou a menom F na inervale (x1,x2).

Pomocou funkcie fminsearch(F,x0) je možné nájsť najbližšie lokálne minimum funkcie s viacerými premennými a menom F pre začiatočný vektor x0.

9.1.1. Nastavenie položiek minimalizácie

Proces minimalizácie je možné ovplyvniť nastavením riadiacich položiek minimalizácie (options) a použiť nasledovný zápis funkcie fminbnd alebo fminsearch

fminbnd(F,x1,x2,options) alebo fminsearch(F,x0,options)

options je vektor o dĺžke 18. Automatické nastavenie je možné previesť zápisom:

options = foptions;

Príklad 9.1: Jednoparametrová funkcia jedno_par.m
function y = jedno_par(x)
% Jednoparametrova funkcia 
% f(x) = 1/((x-0.3)2+0.01) + 1./((x-0.9)2+0.04) - 6 

y = 1./((x-0.3).^2+0.01) + 1./((x-0.9).^2+0.04) - 6;
Príklad 9.2: Minimum jednoparametrovej funkcie
>> fminbnd('cos',3,4)            % minimum na intervale <3,4>
ans =
    3.1416

>> fminbnd('jedno_par',0.3,1)    % minimum na intervale <0.3,1>
ans =
    0.6370

Poznámka: pri hľadaní minima viacparametrovej funkcie musí mať funkcia iba jeden argument (napr. vektor).
Správne: y = funkcia(x).
Nesprávne: y = funkcia(x1,x2).

Príklad 9.3: Dvojparametrová funkcia dvoj_par.m
function y = dvoj_par(x)
% Dvojparametrova funkcia 
% f(x) = (x1-10)2 + (x2-5)2 - 25 

y = (x(1)-10).^2 + (x(2)-5).^2 - 25;
Príklad 9.4: Minimum dvojparametrovej funkcie
>> fminsearch('dvoj_par',[0,0])      % zaciatocne hodnoty [0,0]
ans =
   10.0000    5.0000

>> fminsearch('dvoj_par',[20,10])    % zaciatocne hodnoty [20,10]
ans =
   10.0000    5.0000
Príklad 9.5: Nulový bod funkcie
>> fzero('sin',3)    		% nulový bod v okolí 3
ans =
    3.1416
>> fzero('sin',4)    		% nulový bod v okolí 4
ans =
    3.1416
>> fzero('sin',5)    		% nulový bod v okolí 5
ans =
    6.2832
	
% Spätná kontrola
>> sin(3.1416)
ans =
 -7.3464e-006
 
>> fzero('jedno_par',-0.2)
ans =
   -0.1316

% Spätná kontrola
>> jedno_par(-0.1316)
ans =
  4.3418e-004
top

9.2. Zobrazenie priebehu funkcie

Pomocu funkcie fplot(fmeno,limit) sa zobrazuje priebeh funkcie s názvom fmeno v zadanom rozsahu limit.

Príklad 9.6: Vykreslenie funkcie jedno_par
>> fplot('jedno_par',[-3,3])
Výsledok príkladu 9.6:
Príklad 9.7: Vykreslenie funkcií sin(x) a cos(x)
>> fplot('[sin(x), cos(x)]',[0 4*pi])
Výsledok príkladu 9.7:
top

9.3. Riešenie diferenciálnych rovníc

Na riešenie diferenciálnych rovníc je možné použiť funkcie ode23, ode45 a ďalšie.

Syntax príkazu: ode23
[T,Y]=ode23('funkcia',[t0 tfinal],y0)
Funkcia rieši differenciálnu rovnicu opísanú vo funkcii funkcia. Parametre t0 a tfinal predstavujú začiatočný a koncový čas integrácie a y0 je vektor začiatočných hodnôt.

Majme diferenciálnu rovnicu: y''' + 3y'' + 3y' + y = 1
so začiatočnými podmienkami y(0) = 0, y'(0) = 1, y''(0) = -1

Zadefinujme si (rozložme diferenciálnu rovnicu 3. rádu na diferenciálne rovnice 1. rádu):

y1 = y
y2 = y'
y3 = y''
dy3/dt = - 3y3 - 3y2 - y1 + 1

Potom funkcia v matlabe je v tvare:

Príklad 9.8: Funkcia fundif.m
function dydt = fundif(t,y)
% Diferencialna rovnica: y''' = - 3y'' - 3y' - y + 1
% dydt = [y'; y''; y'''] 
% Vektorovy zapis
% dydt = [y(2); y(3); -3y(3)-3y(2)-y(1)+1]) 

dydt = [y(2); y(3); - 3*y(3) - 3*y(2) - y(1) + 1];
Príklad 9.9: Riešenie diferenciálnej rovnice fundif pomocou ode45
>> [t,y] = ode45('fundif',[0 10],[0 1 -1]);

>> subplot(2,1,1);   % vykreslenie
>> plot(t,y(:,1));
>> subplot(2,1,2);
>> plot(t,y);


Príklad 9.10: Riešenie algebraickej rovnice (dy/dt = 0)
>> [t,y] = ode45('fundif',[0 10],[0 1 -1]);
% riesenie = y(t1), kde t1->infinity, resp. t1 je cas v ustalenom stave
>> riesenie = y(end,1)    
riesenie =
    1.0000
top

9.4. Numerická integrácia

Zápis funkcie pre výpočet určitého integrálu funkcie funkcia s hranicami a, b, toleranciou tol:

Syntax príkazu: quad
[Q,FCNT] = quad('funkcia',a,b,tol,trace)
Ak číslo trace je rôzne od nuly, tak sa zobrazia aj hodnoty [fcnt a b-a Q].

Príklad 9.11: trace = 1
>> quad('sin',0,pi,1e-5,1)
       9     0.0000000000    8.53193733e-001     0.3424195349
      11     0.8531937329    1.43520519e+000     1.3151544267
      13     0.8531937329    7.17602594e-001     0.6575803480
      15     1.5707963268    7.17602594e-001     0.6575803480
      17     2.2883989207    8.53193733e-001     0.3424195349
ans =
    2.0000
Príklad 9.12: trace = 0
>> quad('sin',0,pi,1e-5,0)
ans =
    2.0000
Príklad 9.13: Vytvorenie funkcie funkcia.m
function f = funkcia(t)
f = sqrt(4*cos(2*t).^2 + sin(t).^2 + 1);
Príklad 9.14: Výpočet integrálu na intervale <0,3pi>
>> quad('funkcia',0,3*pi)
ans =
   17.2220
top

9.5. Úlohy

  1. Vytvorte jednoparametrovú matematickú funkciu f(x) = (x-10)2 + (x-5)2 - 25
  2. S vytvorenou funkciou vykonajte nasledovné úkony:
    • zobrazte jej priebeh na intervale <0,15>
    • nájdite jej lokálne minimum
    • nájdite jej nulový bod
    • vypočítajte numerický integrál funkcie na intervale <0,15>
  3. Vytvorte dvojparametrovú matematickú funkciu f(x,y) = x.*exp(-x.^2-y.^2), nájdite jej minimum
  4. Pomocou funkcie quad riešte integrály:
    • integrál (ex.sin(x) dx) na intervale (0,2)
    • integrál (x2.ex dx) na intervale (3,5)
  5. Pomocou funkcie ode23 riešte diferenciálne rovnice:
    • y'' + 2y' + 2y = 0, y(0) = 1, y'(0) = 1
    • y'' - 4y' + 3y = 2, y(0) = 1, y'(0) = -3

10. Elementárne matematické funkcie

10.1. Goniometrické funkcie

Funkcia Opis
acos arkuskosínus
acosh hyperbolický arkuskosínus
asin arkussínus
asinh hyperbolický arkussínus
atan arkustangens
atanh hyperbolický arkustangens
cos kosínus
cosh hyperbolický kosínus
tan tangens
tanh hyperbolický tangens
sin sínus
sinh hyperbolický sínus
Príklad 10.1: Goniometrické funkcie
>> sin(pi/2) + cos(2*pi)
ans =
     2

>> asin(0.5)
ans =
    0.5236

>> tan(pi/4)
ans =
    1.0000

>> A=[pi/2 0;1/2 0.2];
>> sin(A)
ans =
    1.0000         0
    0.4794    0.1987

>> b=[pi/2 0 2];
>> cos(b)
ans =
    0.0000    1.0000   -0.4161
top

10.2. Exponenciálne funkcie

Funkcia Opis
exp exponenciála so základom e (e=2.71828182845905 - Eulerovo číslo)
log prirodzený logaritmus
log10 dekadický logaritmus
sqrt odmocnina
Príklad 10.2: Exponenciálna funkcia
>> exp(2)
ans = 
    7.3891

>> exp(2+3i)
ans = 
  -7.3151 + 1.0427i
Príklad 10.3: Prirodzený a dekadický logaritmus
>> log(7.3891)
ans =
    2.0000

>> log10(100)
ans =
     2
Príklad 10.4: Odmocnina
>> sqrt(25)
ans =
     5

>> sqrt([1 4;16 81])
ans =
     1     2
     4     9
Príklad 10.5: Mocninová funkcia
>> 5^0.25
ans =
    1.4953

>> 2.^[1 2 3 4 5]
ans =
     2     4     8    16    32
top

10.3. Komplexné funkcie

Funkcia Opis
abs absolútna hodnota
angle fázový uhol
conj komplexne združené číslo
imag imaginárna časť
real reálna časť komplexného čísla
Príklad 10.6: Veľkosť a fázový uhol
>> b = 6+8i;
>> velkost = abs(b)
velkost =
    10

>> uhol = angle(b)
uhol =
    0.9273
Príklad 10.7: Reálna a imaginárna časť komplexného čísla
>> A = [4i -3+5i;-1-7i 6]
>> real_cast = real(A)
real_cast =
     0    -3
    -1     6

>> imag_cast = imag(A)
imag_cast =
     4     5
    -7     0
Príklad 10.8: Komplexne združené číslo
>> conj(2+7i)
ans =
   2.0000 - 7.0000i
top

10.4. Číselné funkcie

Funkcia Opis
rem zvyšok po celočíselnom delení
sign signum funkcia
fix najbližšie celé číslo smerom k nule
floor najbližšie celé číslo smerom k -infinity
ceil najbližšie celé číslo smerom k +infinity
round najbližšie celé číslo
Príklad 10.9: Funkcia rem (zvyšok po celočíselnom delení)
>> rem(10,3)
ans =
     1

>> rem([45 12 37],7)
ans =
     3     5     2
Príklad 10.10: Funkcia sign (signum funkcia)
sign(-5)
ans =
    -1

sign([12 0 -3 4])
ans =
     1     0    -1     1
Príklad 10.11: Funkcia fix (najbližšie celé číslo smerom k nule)
>> fix(2.7)
ans =
     2
Príklad 10.12: Funkcia ceil (najbližšie celé číslo smerom k +infinity)
>> ceil(2.3)
ans =
     3
Príklad 10.13: Funkcia floor (najbližšie celé číslo smerom k -infinity)
>> floor(2.7)
ans =
     2
Príklad 10.14: Funkcia round (najbližšie celé číslo)
>> round(2.3)
ans =
     2
top

10.5. Úlohy

  1. Vypočítajte hodnoty nasledujúcich výrazov obsahujúcich goniometrické funkcie:
    • sin(pi/4) + cos(pi/3)
    • tg(pi/3)
    • 10 * arcsin(0.2)
  2. Zapíšte výrazy, v ktorých použijete:
    • exponenciálnu funkciu
    • odmocninu
    • logaritmickú funkciu
  3. Určte veľkosť a fázový uhol vektora v komplexnej rovine s koncovým bodom b = 4 + 5i
  4. Vytvorte maticu komplexných čísel a zistite jej reálnu a imaginárnu časť
  5. Vytvorte zápis funkcie sign so skalárom, vektorom a maticou

11. Grafika v Matlabe

MATLAB umožňuje zobrazovať údaje v 2 a 3-rozmerných grafoch.

11.1. Grafické prostredie v MATLABe

Grafické funkcie automaticky otvoria nové grafické okno, pokiaľ už predtým žiadne neexistuje. V prípade, že je už nejaké grafické okno otvorené, je použité na vykreslovanie to, ktoré "je aktívne" (jedná sa o posledné okno, ktoré bolo otvorené alebo na ktoré bolo kliknuté).

Funkcia Opis
clf zmazanie aktuálneho obrazca
close uzatvorenie okna grafického obrázku
figure otvorenie okna grafického obrázku
gcf číslo aktuálneho okna grafického obrázku

Príkaz figure poskytuje nasledovné možnosti zápisu:

Príklad 11.1:
% otvorenie okna grafického obrázku č.3
>> figure(3)				% obrázok

% otvorenie okna grafického obrázku č.2
>> figure(2)				% obrázok

>> gcf         % číslo aktuálneho okna grafického obrázku
ans =
     2

>> close       % uzatvorenie aktívneho okna grafického obrázku
>> close(3)    % uzatvorenie okna grafického obrázku č.3
>> close all   % uzatvorenie všetkých okien grafických obrázkov
top

11.2. Vytváranie dvojrozmerných grafov

11.2.1. Základné grafické funkcie zobrazenia

Funkcia Opis
fill vyplnenie dvojrozmerného mnohouholníka
loglog zobrazenie, ak osi majú logaritmické mierky
plot lineárne zobrazenie
plotyy lineárne zobrazenie s mierkami na ľavej a pravej strane
semilogx zobrazenie, ak os x je v logaritmickej mierke
semilogy zobrazenie, ak os y je v logaritmickej mierke

11.2.2. Lineárne zobrazenie

Lineárne zobrazenie bodov, priebehov veličín je možné uskutočniť funkciou plot(x1,y1,x2,y2, ..., xn,yn), kde x1, y1, x2, y2, ..., xn, yn sú vektory s hodnotami súradníc bodov.

Príklad 11.2: Lineárne zobrazenie paraboly
>> x = [-5:0.1:5];
>> y = x.^2;
>> plot(y)        % vykreslí hodnoty 'y' v závislosti na ich poradí - obrázok 
>> plot(x,y)      % vykreslí hodnoty 'y' v závislosti na hodnotách 'x' - obrázok 

Farba, typ a znaky čiary

Pri zobrazovaní pomocou funkcie plot je možné zadefinovať farbu, typ a znaky vykreslovanej čiary nasledovným spôsobom: plot(x,y,'farba_typ_znak'), kde farba_typ_zank je reťazec zložený zo symbolov vyjadrujúcich farbu, typ a znak čiary.

Symbol Farba (RGB) Symbol Typ čiary
c cyan (0 1 1) - plná čiara (auto)
m magenta (1 0 1) -- čiarkovaná
y žltá (1 1 0) -. bodkočiarkovaná
r červená (1 0 0) : bodková
g zelená (0 1 0) none žiadna
b modrá (0 0 1)
w biela (1 1 1)
k čierna (0 0 0)

Znak Opis znaku
+ plus
o kruh
* hviezdička
. bodka
x krížik
square štvrtok
diamond kosoštvorec
V dole orientovaný trojuholník
< vľavo orientovaný trojuholník
> vpravo orientovaný trojuholník
pentagram päťcípa hviezda
hexagram šesťcípa hviezda
none žiadny (auto)
Príklad 11.3: Farba, typ a znaky čiary
>> x = [-5:5];
>> y = x.^2;
>> plot(x,y,'r-*',x,y/2,'m-.')		% obrázok

11.2.3. Zobrazenie v logaritmických súradniciach

Pri funkciách semilogx, semilogy a loglog ide o podobné zobrazenie ako v prípade lineárneho zobrazenia, len niektorá z osí alebo obe sú v logaritmickej mierke.

Príklad 11.4: Definovanie premennych pre rôzne zobrazenia
>> x = 0:0.01:4;
>> y = sin(0:0.01:4);
>> z = x.^2;
Príklad 11.5: Zobrazenie, ak osi majú logaritmické mierky
>> figure
>> loglog(x,y)                   % obrázok

11.2.4. Vyplnenie dvojrozmerného mnohouholníka

Funkciou fill(x,y,c) je možné zobraziť farebný mnohouholník, kde x,y sú vektory súradníc bodov mnohouholníka a c je premenná, ktorá definuje farbu.

Príklad 11.6: Vyplnenie trojuholníka červenou farbou
>> figure
>> fill([0,1,0.5],[0,0,1],'r')   % obrázok

11.2.5. Ďalšie zobrazenia

Príklad 11.7: Lineárne zobrazenie s mierkami na ľavej a pravej strane
>> figure
>> plotyy(x,y,x,z)               % obrázok
Príklad 11.8: Bodeho diagram - definovanie premenných
>> [amp,faza,w] = bode([1],[1 2 1])
amp =
    0.9999
    0.9996
	...
    0.0004
    0.0001

faza =
   -1.1459
   -2.2915
   ...
 -177.7085
 -178.8541

w =
    0.0100
    0.0200
	...
   50.0000
  100.0000
  
>> amp_db = 20*log10(amp)
amp_db =
   -0.0009
   -0.0035
   ...
  -67.9623
  -80.0009
Príklad 11.9: Lineárne zobrazenie Bodeho diagramu
>> plot(w,amp_db)           % obrázok
Príklad 11.10: Zobrazenie, ak os x je v logaritmickej mierke
>> semilogx(w,amp_db)       % obrázok
top

11.3. Základné riadiace funkcie pre zobrazenie

Funkcia Opis
axes vytvorenie osí na ľubovoľnú pozíciu
axis nastavenie parametrov osí a vzhľadu
caxis nastavenie rozsahu farieb osí
cla zmazanie osí
box zobrazenie rámika osí
gca vracia číslo aktuálnych osí
get zistenie nastavenia grafického objektu
hold zachovanie aktuálneho grafu
set nastavenie vlastností grafického objektu
subplot rozdelenie grafického okna na subokná

11.3.1. Nastavenie osí

Funkciou axes je možné vytvoriť osi a umiestniť ich na ľubovoľné miesto v grafickom okne

Príklad 11.11:
% nastavenie parametrov osí a vzhľadu
% axes('position',[left, bottom, width, height]), 
% kde left, bottom sú body poč. súradnicového systému
% a width, height sú veľkosti x-ovej a y-ovej osi (rozmery 1x1)
>> axes('position',[0.2, 0.2, 0.7, 0.7])	% obrázok
Príklad 11.12:
% nastavenie rozmerov osí x, y
>> axis([0,100,0,100])			% obrázok

% nastavenie rozmerov osí x, y a z
>> axis([0,10,0,10,1,5])			% obrázok

% funkcia vracia vektor nastavenia osí
>> axis
ans =
     0    10     0    10     1     5

% rozmery osí sa nastavia automaticky
>> axis auto				% obrázok

% vypnutie zobrazenia osí
>> plot([0:0.01:pi],sin([0:0.01:pi]))
>> axis off				% obrázok

% zapnutie zobrazenia osí
>> axis on

11.3.2. Zobrazenie viacerých grafov

Ak je požadované pridať do jedného grafu viac priebehov alebo v ňom vykonať ďalšie grafické operácie, potom je potrebné použiť príkaz hold on.

Príklad 11.13: Zachovanie aktuálneho grafu
>> plot(x,y,'r')				% obrázok
>> hold on
>> plot(x,z,'b')				% obrázok
Príklad 11.14: Zrušenie zachovania aktuálneho grafu
>> hold off

Príkaz subplot(m,n,p) rozdelí graf na subokná, kde m,n,p vyjadrujú počet riadkov, stĺpcov a poradie okna

Príklad 11.15: Ukážka rozdelenia grafického okna na subokná - 3 riadky a 4 stĺpce
>> subplot(3,4,7)				% obrázok

1    2    3    4   
5 6 7 8
9 10 11 12
Príklad 11.16: Rozdelenie grafického okna na subokná
>> subplot(1,2,1)
>> plot(x,y,'r')
>> subplot(1,2,2)
>> plot(x,z,'b')				% obrázok

11.3.3. Nastavenie parametrov grafických objektov

Pri vytvorení grafického objektu mu Matlab pridelí identifikačné číslo. Pomocou tohto čísla je možné potom pristupovať k jednotlivým objektom. Číslo objektu vracia vždy funkcia, ktorá ho vytvorila.

Nastavenie objektu je možné získať príkazom get(h), kde h je čislo objektu. Nastaviť určitú položku vlastnosti je možné príkazom set(h,'položka',hodnota).

Príklad 11.17: Získanie čísla objektu
>> h = plot(w,amp_db);
Príklad 11.18: Výpis položiek vlastností
>> get(h)
	Color = [0 0 1]
	EraseMode = normal
	LineStyle = -
	LineWidth = [0.5]
	Marker = none
	MarkerSize = [6]
	MarkerEdgeColor = auto
	MarkerFaceColor = none
	XData = [ (1 by 45) double array]
	YData = [ (1 by 45) double array]
	ZData = []

	BeingDeleted = off
	ButtonDownFcn = 
	Children = []
	Clipping = on
	CreateFcn = 
	DeleteFcn = 
	BusyAction = queue
	HandleVisibility = on
	HitTest = on
	Interruptible = on
	Parent = [102.017]
	Selected = off
	SelectionHighlight = on
	Tag = 
	Type = line
	UIContextMenu = []
	UserData = []
	Visible = on
Príklad 11.19: Zmena typu čiary
% pôvodné: LineStyle = - 
% zmeniť na: LineStyle = x
>> set(h,'LineStyle','x')			% obrázok
Príklad 11.20: Zmena farby čiary
% pôvodné: Color = [0 0 1] (R,G,B) 
% zmeniť na: Color = [0 1 0] (Color = green alebo Color = g)
>> set(h,'Color','green')			% obrázok
top

11.4. Označenie a popis grafov

Funkcia Opis
grid čiarová sieť
gtext text umiestnený myšou
legend vytvorenie legendy priebehov
text umiestnenie textu
title názov grafu
xlabel popis osi x
ylabel popis osi y
zlabel popis osi z
Príklad 11.21: Vykreslenie a popis grafov
>> t = 0:0.01:2*pi;                % definovanie premennych
>> y = sin(t); 

>> plot(t,y)                       % vykreslenie
>> xlabel('t = 0 \rightarrow 2pi') % popis osi x
>> ylabel('sin(t)')                % popis osi y
>> title('Priebeh funkcie sínus')  % názov grafu
Príklad 11.22: Zápis textu pomocou súradníc dát
>> text(3*pi/4,sin(3*pi/4),'\leftarrow sin(t) = 0.707')
>> text(7*pi/6,sin(7*pi/6),'sin(t) = -0.5 \rightarrow',...
'HorizontalAlignment','right')				% obrázok
Príklad 11.23: Legenda
>> y1 = sin(t); y2 = cos(t); y3 = y1+y2;
>> plot(t,y1,t,y2,t,y3);
>> legend('y_1=sin(t)','y_2=cos(t)','y_3=sin(t)+cos(t)')	% obrázok
Príklad 11.24: Mriežka (hlavná, vedlajšia)
>> plot(t,y1,t,y2,t,y3);
>> grid on						% obrázok
>> grid minor						% obrázok

Poznámka: ak chceme zmeniť orientáciu opisu vertikálnej osi (y) z vertikálnej na vodorovnú môžeme použiť príkaz set(get(gca,'YLabel'),'Rotation',0.0).

11.4.1. Špeciálne znaky (TEX)

ZnakZápisZnakZápisZnakZápis
\alpha\beta\gamma
\delta\epsilon\omega
\lambda\xi\pi
\rho\sigma\tau
\sigma\Delta\Sigma
\nabla\partial\infty
\surd\int\neq
\in\subset\subseteq
\leq\geq\uparrow
\wedge\vee\downarrow
\leftrightarrow\leftarrow\rightarrow
¬\neg\forall\exists
horný index^{horný index}dolný index_{dolný index}
top

11.5. Špeciálne grafy

Špeciálne grafy sú využívané najmä v oblastiach:

11.5.1. Štatistické grafy

Funkcia Opis
bar dvojrozmerný zvislý stĺpcový graf
bar3 trojrozmerný zvislý stĺpcový graf
barh dvojrozmerný vodorovný stĺpcový graf
bar3h trojrozmerný vodorovný stĺpcový graf
errorbar zobrazenie s odchýlkou
hist zobrazenie histogramu
rose zobrazenie uhlového histogramu
polar zobrazenie v polárnych súradniciach
area plošný graf
pie kruhový graf
Príklad 11.25:
>> Y = [6 3 2;9 6 4;7 5 4;5 6 5;4 3 2];
>> bar3(Y)
>> xlabel('Os x'), ylabel('Os y'), 
>> zlabel('Os z')				% obrázok
Príklad 11.26: Zobrazenie v polárnych súradniciach
>> t = 0:0.01:2*pi;
>> polar(t,abs(sin(2*t).*cos(2*t)));		% obrázok

11.5.2. Zobrazenie diskrétnych dát

Funkcia Opis
stem dvojrozmerné kmeňové zobrazenie
stem3 trojrozmerné kmeňové zobrazenie
stairs schodové zobrazenie
Príklad 11.27: schodové zobrazenie
>> x = 0:0.25:10;
>> stairs(x,sin(x));		% obrázok
Príklad 11.28: Stonkové zobrazenie
>> x = 0:0.1:4;
>> y = sin(x.^2).*exp(-x);
>> stem(x,y);			% obrázok

11.5.3. Priame a rýchlostné vektorové grafy

Funkcia Opis
compass zobrazenie vektorov v polárnych súradniciach
feather zobrazenie vektorov pozdĺž vodorovnej čiary
quiver zobrazenie 2-D vektorov definovaných (u,v) parametrami
quiver3 zobrazenie 3-D vektorov definovaných (u,v,w) parametrami
Príklad 11.29: Zobrazenie v polárnych súradniciach, ktoré sú zadané uhlom a veľkosťou
>> uhol = [45 0 90 150 230 300];
>> velkost = [5 7 10 6 12 8];
>> ruhol = uhol*pi/180;		% prepočet na radiány 
>> [x,y] = pol2cart(ruhol,velkost);	% prepočet do kart. súradníc
>> compass(x,y);			% obrázok
Príklad 11.30: Zobrazenie vektorov pozdĺž x-ovej osi, ktoré sú zadané uhlom od 90º do 0º a veľkosťou 5
>> uhol = 90:-10:0;
>> velkost = 5*ones(size(uhol));
>> [u,v] = pol2cart(uhol*pi/180,velkost);
>> feather(u,v);			% obrázok
Príklad 11.31: Zobrazenie vektorov intenzity el. magnetického poľa dvoch nábojov pomocou zobrazenia zmeny súradníc
>> x = -2:.2:2;
>> y = -1.5:.2:1.5;
>> [xx,yy] = meshgrid(x,y);
>> zz = xx.*exp(-xx.^2-yy.^2);
>> [px,py] = gradient(zz,.2,.2);
>> quiver(x,y,px,py,2);		% obrázok

11.5.4. Hladinové zobrazenie - rezy a pohľady

Funkcia Opis
clabel popis hladinového zobrazenia
contour plošné hladinové obrazenie
contour3 trojrozmené hladinové obrazenie
contourf plošné hladinové obrazenie s farebnou výplňou
pcolor pseudofarebné zobrazenie
Príklad 11.32: Príkladová funkcia 'peaks'
>> z = peaks(25);
>> pcolor(z)
>> colormap(hsv)			% obrázok
Príklad 11.33: Hladinové zobrazenie obrazca s popisom jednotlivých hladín
>> [C,h] = contour(z,10);
>> clabel(C,h);			% obrázok
Príklad 11.34: Hladinové zobrazenie obrazca s farebným rozlíšením
>> [C,h] = contourf(z,10);
>> caxis([-10 10]);		% obrázok
top

11.6. Vytváranie trojrozmerných grafov

11.6.1. Príprava údajov

Pri zobrazení trojrozmerného obrazca potrebujeme mať dve matice (napr. X, Y), ktorých prvky X(i,j), Y(i,j) budú obsahovať súradnice bodov v rovine. Na generovanie týchto matíc slúži funkcia meshgrid:

[X,Y] = meshgrid(v1,v2) - vektor v1 určuje interval na osi x s daným krokom a vektor v2 určuje interval na osi y s daným krokom

[X,Y] = meshgrid(v) - vektor v určuje interval na osi x aj na osi y

11.6.2. Základné funkcie 3-D zobrazenia

V 3-D zobrazeniach sa používajú podobné funkcie fill3 a plot3 ako v 2-D grafike

Funkcia Opis
fill3 Vyplnenie trojrozmerného mnohouholníka
plot3 zobrazenie čiar a bodov 3-D priestore (lineárne zobrazenie)
Príklad 11.35: Zobrazenie špirály (lineárne zobrazenie)
>> t = 0:pi/50:10*pi;
>> plot3(sin(t),cos(t),t);			% obrázok
Príklad 11.36: Zobrazenie trojrozmerného obrazca
>> [x,y] = meshgrid([-2:0.1:2]);
>> z = x.*exp(-x.^2-y.^2);
>> plot3(x,y,z);				% obrázok
Príklad 11.37: Zobrazenie kocky s rezom
>> x = [0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0];
>> y = [0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1];
>> z = [0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0];
>> axis([0 1 0 1 0 1]);
>> hold on
>> for i=1:2:23
plot3([x(i) x(i+1)],[y(i) y(i+1)],[z(i) z(i+1)],'r-');
end
>> fill3([0 0.5 0],[0 0 0.5],[0.5 1 1],'g'); 	% obrázok

11.6.3. Zobrazenie povrchu obrazca maticovou reprezentáciou

Funkcia Opis
mesh trojrozmerné sieťové zobrazenie povrchu
meshc kombinácia zobrazení mesh/contour
meshz zobrazenie mesh s nulovou rovinou
slice objemové predstavenie zobrazenia
surf zobrazenie povrchu zatienením
surfc kombinácia zobrazení surf/contour
surfl zobrazenie surf s vysvietením
surface vytvorenie povrchu grafického obrazca
waterfall vlnové zobrazenie (priestorové)

11.6.4. Možnosti nastavenia zobrazenia

Funkcia Opis
axis nastavenie typu osí
caxis nastavenie rozsahu farieb z aktuálnej farebnej palety
colormap nastavenie farebnej palety
hidden skrytie siete 3-D zobrazenia
shading nastavenie módu tieňovania
brighten vyjasňovanie alebo stmavovanie farebnej palety
lighting nastavenie módu osvetlenia
rotate3d zapnutie/vypnutie možnosti natáčania obrazca
view špecifikácia bodov zobrazenia v 3-D grafe
viewmtx transformácia matíc pre zobrazenie
Príklad 11.38: Zobrazenie povrchu obrazca tieňovaním
>> z = peaks(25);		% vytvorí maticu 25x25
>> surf(z);		% zobrazenie povrchu zatienením - obrázok
>> shading flat;		% tieňovanie 'flat' - obrázok
>> shading interp;		% tieňovanie 'interpolated' - obrázok
>> shading faceted;	% tieňovanie 'faceted' (pôvodné) - obrázok
>> colormap(copper)	% zmena farby (pink) - obrázok
>> surfc(z);		% kombinácia zobrazení surf/contour - obrázok
Príklad 11.39: Zobrazenie povrchu obrazca sieťou
>> z = peaks(25);		% vytvorí maticu 25x25
>> mesh(z);		% zobrazenie povrchu sieťou - obrázok
>> colormap(cool);		% zmena farby (cool) - obrázok
>> colormap(hot);		% zmena farby (hot) - obrázok
>> colormap(gray);		% zmena farby (gray) - obrázok
>> meshc(z);		% kombinácia zobrazení mesh/contour - obrázok
>> meshz(z);		% zobrazenie mesh s nulovou rovinou - obrázok
Príklad 11.40: Zobrazenie povrchu obrazca vlnami
>> z = peaks(25);		% vytvorí maticu 25x25
>> waterfall(z);		% zobrazenie povrchu vlnami - obrázok
>> colormap(pink);		% zmena farby (pink) - obrázok
top

11.7. Práca s farebnými obrazmi

Funkcia Opis
image zobrazenie obrazu (vytvorenie objektu obrazu)
imagesc mierkovanie dát a zobrazenie obrazu
imread načítanie obrazu z grafického súboru
imwrite uloženie obrazu do grafického súboru
imfinfo získanie informácie o obraze z grafického súboru
axis nastavenie mierky a vzhľadu osí pri zobrazení

11.7.1. Typy obrazov

Farebný obraz je v MATLABe tvorený maticou dát a maticou palety farieb.

Zápis zobrazenia Typ obrazu
image(X); colormap(map) indexový
image(I,[0,1]); colormap(gray) intenzívny
image(RGB) trojfarebný
Príklad 11.41: Zobrazenie obrazu z dát uložených v earth.mat
>> load earth;	% Načítanie matice dát X,
		  matice farebnej palety map
>> image(X)	% Zobrazenie obrazu
>> colormap(map);	
>> axis image;	% Nastavenie osí v pomere 1:1 	
		% obrázok
Príklad 11.42: Vygenerovanie náhodného farebného obrazca
>> X = magic(6);	% Vytvorenie matice X,
		  matice farebnej palety map
>> image(X)	% Zobrazenie farebného obrazu
		% obrázok

11.7.2. Načítanie a uloženie grafického súboru

MATLAB umožňuje načítanie a uloženie dát farebného obrazu v niekoľkých grafických súboroch a nasledovných formátov: BMP, HDF, JPEG(JPG), PCX, TIFF, XWD.

Príklad 11.43: Načítanie, zobrazenie a uloženie obrazu
[X,MAP] = imread('penguin','bmp');
image(X); 		% obrázok
axis image;		% obrázok
imwrite(X,'penguin.jpg')	% Uloženie farebného obrazu
top

11.8. Úlohy

  1. Zobrazte priebeh funkcie 2*cos(x) na intervale (0,4*pi) s krokom 0.01.
    Postupne aplikujte nasledujúce nastavenia:
    • farbu zobrazenia nastavte modrú
    • typ čiary zvoľte čiarkovaný
    • popíšte osi (x » time [s], y » cos) a nadpis zobrazenia (graf funkcie kosínus)
    • pridajte do obrázku priebeh funkcie 3*sin(2x)
    • vytvorte legendu pre jednotlivé priebehy (y1=2*cos(x), y2=3*sin(2x))
  2. Zobrazte priebehy funkcii y=f(t) a x=f(t), kde [x,y,t] = bode([2],[1 3 3 1]):
    • s mierkami na ľavej (y=f(t)) a pravej (x=f(t)) strane
    • s nezávislou logaritmickou osou y=f(t)
    • s nezávislou logaritmickou osou x=f(t)
  3. Pre funkciu z=x.*exp(-x.^2-y.^2) vytvorte zobrazenia:
    • sieťové zobrazenie s farebnou mapou 'cool'
    • tieňové zobrazenie s farebnou mapou 'pink' a tieňovaním 'interpolated'
    • lineárne zobrazenie s farebnou mapou 'hot'
  4. Vytvorte jedno grafické okno, v ktorom bude 6 grafov (rozdelenie 2 x 3):
    • na pozícii [1,1] zobrazte sin(t);
    • na pozícii [1,2] zobrazte cos(t);
    • na pozícii [2,1] zobrazte log(t);
    • na pozícii [3,3] zobrazte et,
    kde t=[0.01:0.01:2*pi]
  5. Vykreslite pre t=[0.01:0.01:2*pi] priebeh funkcie sin(t) tak, aby bol zobrazený iba interval <0.5*pi, 1.5*pi> (- interval na nezávislej osi). Nerobte to zmenou vektora t.

12. Ďalšie možnosti MATLABu

12.1. Lokálne funkcie

Do jedného súboru je možné umiestniť viac funkcií, t.j. viac funkcií začínajúcich kľúčovým slovom function. Tieto funkcie sú potom lokálne vzhľadom k súboru - sú "viditeľné" iba z ostatných funkcií v súbore a je možné ich používať iba v nich. Prvá funkcia v súbore je tzv. primárna a iba táto funkcia je prístupná "z vonku". Táto vlastnosť je užitočná napr. v situácii, keď sa nejaká funkcia niekoľkokrát používa, ale nijaká iná funkcia ju nebude potrebovať.

Príklad 12.1: Funkcia, ktorá vypisuje faktoriál zadaného čísla (faktorial.m)
function faktorial(n)
% FAKTORIAL - vypocet a vypis faktorialu celeho cisla (n!)
% faktorial(n)   
% n ... cislo

if n<0
  error('faktorial neexistuje')
end
y = 1; 
for i=1:n
    y = y*i;    
end
vypis(n,y)

% Lokalna funkcia

function vypis(a,b)
% VYPIS - vypis faktorialu celeho cisla
% a ... cislo   
% b ... faktorial(a)
y = sprintf('%d! = %d',a,b);
disp(y);
Výsledok príkladu 12.1:
>> faktorial(5)
5! = 120
top

12.2. Viacrozmerné matice a objektová orientácia

Okrem základných typov - char (string), uint8, double a sparse MATLAB od verzie 5 zavádza nové dátové typy cell (cell array) a struct (struct array). Zavedenie týchto dátových štruktúr súvisí s prechodom na objekty.

12.2.1. Pole buniek

Cell array (pole buniek) je dátová štruktúra odpovedajúca viacrozmernej matici. Vytvoriť premennú tohto typu je možné funkciou cell alebo pomocou zložených zátvoriek {}. V poli buniek možno kombinovať rôzne dátové typy.

Syntax príkazu:
cell(m, n, p, ...) 

Vytvára m x n x p x ... pole buniek prázdnych matíc. Argumenty m, n, p, ... musia byť skaláry.

Príklad 12.5: Pole buniek prázdnych matíc (2x3x2)
>> C = cell(2,3,2)
C(:,:,1) = 
     []     []     []
     []     []     []
C(:,:,2) = 
     []     []     []
     []     []     []
Príklad 12.6: Naplnenie poľa buniek
>> for n = 1:12
   C{n} = n;
   end

>> C
C(:,:,1) = 
    [1]    [3]    [5]
    [2]    [4]    [6]
C(:,:,2) = 
    [7]    [ 9]    [11]
    [8]    [10]    [12]
Výsledok príkladu 12.6: Vypísanie niektorých častí poľa buniek
>> C(1,2,1)
ans = 
    [3]

>> C(:,2,1)
ans = 
    [3]
    [4]
>> C(:,2,2)
ans = 
    [ 9]
    [10]
Príklad 12.7: Iný spôsob vytvorenia poľa buniek
>> CC = {pi 'Ahoj' magic(3); 5 C 7}
CC = 
    [3.1416]    'Ahoj'          [3x3 double]
    [     5]    {2x3x2 cell}    [         7]
Príklad 12.8: Vypísanie obsahu poľa buniek: celldisp
>> celldisp(CC)
CC{1,1} =
    3.1416
CC{2,1} =
     5
CC{1,2} =
Ahoj
CC{2,2}{1,1,1} =
     []
CC{2,2}{1,2,1} =
     []
CC{2,2}{1,1,2} =
     []
CC{2,2}{1,2,2} =
     []
CC{1,3} =
     8     1     6
     3     5     7
     4     9     2
CC{2,3} =
     7
Príklad 12.9: Grafické zobrazenie štruktúry poľa buniek: cellplot
>> cellplot(CC)


Príklad 12.10: Sekvencia "magických" matíc rôznych stupňov
>> cell(8,1);
>> for n = 1:8
   M{n} = magic(n);
   end
>> M
    [         1]
    [2x2 double]
    [3x3 double]
    [4x4 double]
    [5x5 double]
    [6x6 double]
    [7x7 double]
    [8x8 double]
Výsledok príkladu 12.10:

12.2.2. Pole štruktúr

Structure array (pole štruktúr) odpovedá priamo významu štruktúry používanej v programovacích jazykoch. Jednotlivé prvky poľa sú pomenované. Štruktúru možno vytvoriť funkciou struct alebo naplnením jednotlivých položiek.

Syntax príkazu:
s = struct('položka1', {}, 'položka2', {}, ...)
s = struct('položka', hodnota1, 'položka2', hodnota2, ...)

s = struct('položka1', {}, 'položka2', {}, ...) vytvára prázdne pole štruktúr položka1, položka2, ....
s = struct('položka1', hodnota1, 'položka2', hodnota2, ...) vytvára pole štruktúr so špecifikovanými položkami a hodnotami. Hodnoty hodnota1, hodnota2, atď. musia byť polia buniek rovnakej veľkosti alebo bunky so skalármi.

Príklad 12.11: Pole štruktúr
>> student = struct('meno',{'Ján','Jozef','Milan'},'priezvisko', ...
{'Novak','Sovak','Liska'},'rocnik',{1,2,5})

student = 
1x3 struct array with fields:
    meno
    priezvisko
    rocnik
Výsledok príkladu 12.11:
>> student(1)
ans = 
          meno: 'Ján'
    priezvisko: 'Novak'
        rocnik: 1

>> student(2)
ans = 
          meno: 'Jozef'
    priezvisko: 'Sovak'
        rocnik: 2

>> student(3)
ans = 
          meno: 'Milan'
    priezvisko: 'Liska'
        rocnik: 5
Príklad 12.12: Doplnenie hodnôt
>> student(4).meno = 'Michal';
student = 

1x4 struct array with fields:
    meno
    priezvisko
    rocnik

>> student(4)
ans = 
          meno: 'Michal'
    priezvisko: []
        rocnik: []
Výsledok príkladu 12.12:
% prístup k menu 1. študenta
>> student(1).meno
ans =
Ján
% prístup k priezvisku 1. študenta
>> student(1).priezvisko
ans =
Novak

% prístup k ročníku 2. študenta
>> student(2).rocnik
ans =
     2
	
% prístup k menu 3. študenta
>> student(3).meno
ans =
Milan
Príklad 12.13: Iný spôsob vytvorenia poľa štruktúr
>> skuska(1).predmet = 'Optimalizácia' 
skuska = 
    predmet: 'Optimalizácia'

>> skuska(1).datum = [20 12 2005]
skuska = 
    predmet: 'Optimalizácia'
      datum: [20 12 2005]

% prístup k roku 1. skúšky  
>> skuska(1).datum(3)
ans =
        2005 
top

12.3. Riešenie nelineárnych rovníc

Na riešenie nelineárnych rovníc metódou najmenších štvorcov môžeme použiť funkciu fsolve. Fsolve rieši rovnice v tvare F(X) = 0, kde F a X môžu byť vektory alebo matice.

Syntax funkcie: X = fsolve(funkcia,XO)
Funkcia rieši rovnice vo funkcii funkcia s počiatočnými hodnotami X0.

Úplný zápis funkcie: [X,FVAL,EXITFLAG] = fsolve(FUN,X0,OPTIONS,P1,P2,...), kde

Príklad

Úlohou je zistiť ustálené výšky hladín h1s a h2s dvoch zásobníkov (zapojených za sebou bez interakcie) pre vstupný prietok qs = 6 do prvého z nich.

Príklad 12.14: Funkcia zasob.m
function y = zasob(h,q)
k1 = 3; f1 = 3; 
k2 = 2.4; f2 = 2.7;
y(1) = q/f1 - k1/f1*sqrt(h(1));
y(2) = k1/f1*sqrt(h(1)) - k2/f2*sqrt(h(2));
Výsledok príkladu 12.14: Riešenie pre qs = 6
>> [h,FVAL,EXITFLAG] = fsolve('zasob',[2;2],optimset('Display','iter'),6)

                                         Norm of      First-order   Trust-region
 Iteration  Func-count     f(x)          step         optimality    radius
     0          3        0.367837                         0.152               1
     1          6        0.198685              1         0.0975               1
     2          9      0.00687788        2.39651         0.0167             2.5
     3         12     6.0457e-006        0.49403       0.000586            5.99
     4         15    2.70656e-012      0.0129899      4.11e-007            5.99
Optimization terminated: first-order optimality is less than options.TolFun.

h =
    4.0000
    5.0625
FVAL =
  1.0e-005 *
    0.0003    0.1645
EXITFLAG =
     1
Výsledok príkladu 12.14: Graf ustálených výšok pre prietoky qs = 1 až 10

top

12.4. Úlohy

  1. Majme binárny súbor data.mat, v ktorom je uložená premenná získaná zo simulácie (viď. obrázok).

    Analyzujte uvedenú premennú (štruktúru) a
    • vykreslite do jedného grafu (do troch podokien) priebeh vstupnej(1), výstupnej(2), vstupnej a výstupnej(3) veličiny (bloku Function Fcn) v závislosti od času (viď. ukážka);

      1

      vstup = f(čas)
      2

      výstup = f(čas)
      3

      vstup, výstup = f(čas)

    • popíšte časové osi: time [s];
    • popíšte názvy grafov: 1) vstup; 2) výstup; 3) vstup a výstup;
    • zobrazte legendu v 3. podokne: --- vstup x1, -.- výstup x2
  2. Zistite ustálenú hodnotu výšky hladiny v zásobníku (hs) opísaného diferenciálnou rovnicou

    dh/dt = q/f1 - k1/f1*h0.5, kde k1 = 3, f1 = 3 a ustálený prietok qs = 5.

    Poznámka: index s označuje ustálené hodnoty.
  3. Riešte sústavu nelineárnych rovníc

    0 = 0.8 - x + (1-x)*e(y)
    0 = 5 - 2*y + (2-x)*e1/y

13. Simulink

Základnou podmienkou pre spustenie Simulinku je spustený MATLAB.

Spustenie Simulinku:

Spustením Simulinku sa zobrazí okno (obr. 1) s knižnicami v ľavom stĺpci a zoznamom vybranej knižnice v pravom stĺpci. Stručný popis vybraného prvku je v hornej časti okna.


Obr. 1. Okno prehliadača knižníc (Library Browser - Simulink v. 5.0)

Otvorenie existujúceho modelu Simulinku (existujúcej schémy - štandardná koncovka .mdl):

Otvorenie nového modelu Simulinku:

13.1. Vytvorenie modelu

13.1.1. Presun a kopírovanie blokov

Vlastný model sa vytvára výberom bloku(ov) z knižníc a ich presunom do okna modelu myšou. Okrem presunu z knižnice je možné bloky v okne modelu kopírovať štandardným spôsobom (Copy->Paste) alebo duplikovaním (Ctrl + Drag&Drop alebo PK + Drag&Drop).

13.1.2. Označovanie blokov

Označenie jedného objektu:

Označenie viacerých objektov:

Označenie všetkých objektov:

13.1.3. Pomenovanie blokov

Po presune, resp. kopírovaní blokov je možné zadať parametre týchto blokov. Názov nového bloku sa nastaví automaticky tak, aby bol v rámci okna modelu jednoznačný. Zmena názvu sa vykoná dvojklikom na názov bloku.

13.1.4. Prepojovanie blokov (kreslenie čiar)

Výstup z jedného bloku môže byť pripojený na ľubovoľný počet vstupov iných blokov. Spojenie sa vykoná tak, že kurzor myši sa umiestni na značku vstupu, resp. výstupu bloku a pri stisnutom ľavom tlačítku sa kurzor premiestni na výstup, resp. vstup iného bloku a tlačítko sa pustí (Drag&Drop). V prípade väčšieho počtu pravouhlých zalomení je možné čiaru ukončiť bez ukončujúceho pripojenia a z tohto miesta vytvárať ďalšiu čiaru.

Novinka v Simulinku: prepojenie jedného bloku s druhým môžeme vykonať aj nasledujúcim spôsobom: ĽK na blok, z ktorého vystupuje prepojenie, potom stlačením Ctrl a ĽK na blok, do ktorého vstupuje prepojenie.

Prepojenie je možné rozdeliť pomocou Ctrl + Drag&Drop. Shift + Drag&Drop pridá nový bod.

13.1.5. Ďalšie operácie s blokmi

Bloky je možné upravovať aj prostredníctvom menu Format:

Flip name
Premiestnenie názvu bloku na opačnú stranu
Hide/Show name
Skrytie/Zobrazenie názvu bloku
Flip blok
Zmena orientácie bloku na opačnú stranu (CTRL + I)
Rotate block
Rotácia bloku o 90° v smere hodinových ručičiek
Show/Hide drop shadow
Zobrazenie tienovania bloku
Foreground color
Farba popredia bloku a tienovania
Background color
Farba pozdia bloku
Screen color
Farba pozadia celého okna/modelu

13.1.6. Nastavenie parametrov blokov

Parametre blokov nastavujeme v dialógovom okne, ktoré sa otvorí dvojitým kliknutím (2׼K) na blok.

top

13.2. Spustenie modelu

Po vytvorení modelu sa obyčajne nastavujú základné parametre simulácie.

Parametre sa nastavujú prostredníctvom položky Simulation->Simulation parameters ... (alebo Ctrl + E) z hlavného menu okna modelu. Po otvorení tejto položky sa zobrazí okno (obr. 2.1, 2.2) so záložkami:


Obr. 2.1. Okno parametrov simulácie - Solver/Variable-step


Obr. 2.2. Okno parametrov simulácie - Solver/Fixed-step

13.2.1. Záložka Solver

V tejto záložke je možné:


Obr. 2.3. Priebeh stavu a oblasti

13.2.2. Záložka Workspace I/O

Nastavenia v tejto záložke sa týkajú možnosti napojenia na pracovný priestor MATLABu. Je možné predpísať,


Obr. 3. Okno parametrov simulácie - Workspace I/O

13.2.3. Záložka Diagnostics

Voľby pod záložkou Diagnostics (obr. 4) umožňujú nastaviť, ktoré z 17 kontrolovaných druhov chýb či udalostí majú vyvolať hlásenie a na akej úrovni. Možné úrovne hlásení sú


Obr. 4. Okno parametrov simulácie - Workspace I/O

13.2.4. Záložka Advanced

Pod touto záložkou (obr. 5) sa skrývajú nastavenia vzťahujúce sa k optimalizácii výpočtu.


Obr. 5. Okno parametrov simulácie - Workspace I/O

13.2.5. Záložka Real-Time Workshop

Pod touto záložkou (obr. 5) sa skrývajú nastavenia vzťahujúce sa k aplikáciám v reálnom čase. Táto záložka sa zobrazí iba v prípade, ak je nainštalovaný toolbox Real-Time Workshop.


Obr. 6. Okno parametrov simulácie - Real-Time Workshop

13.2.6. Spustenie simulácie modelu

Spustenie je možné:

Ukončenie je možné:

Prerušenie je možné:

13.2.7. Spustenie simulácie modelu z príkazového riadku

Spustenie simulácie modelu z príkazového riadku umožňuje príkaz/funkcia sim.

Syntax funkcie: sim('model')

Úplný zápis funkcie: [T,X,Y] = sim('model',TIMESPAN,OPTIONS,UT), kde

Ak bude argument (na pravej strane funkcie) nastavený ako prázdna matica ([]), potom bude použité predvolené nastavenie pre daný argument. Iba prvý parameter je nutný ('model').

Príklad 13.1: Súbor vdp.mdl
Model {
  Name                            "vdp"
  Version                         5.0
  SaveDefaultBlockParams          on
  SampleTimeColors                off
  LibraryLinkDisplay              "none"
  WideLines                       off
  ShowLineDimensions              off
  ShowPortDataTypes               off
  
  ...
  
  StartTime                       "0.0"
  StopTime                        "10.0"
  MaxOrder                        5
  MaxStep                         "auto"
  MinStep                         "auto"
  MaxNumMinSteps                  "-1"
  InitialStep                     "auto"
  FixedStep                       "auto"
  RelTol                          "1e-3"
  AbsTol                          "auto"
  OutputOption                    "RefineOutputTimes"
  OutputTimes                     "[]"
  Refine                          "1"
  LoadExternalInput               off

  ...

  OutputSaveName                  "yout"
  SaveFinalState                  off
  FinalStateName                  "xFinal"
  SaveFormat                      "Array"
  Decimation                      "1"
  LimitDataPoints                 off
  MaxDataPoints                   "1000"
  
  ...

}
Príklad 13.2:
% Model vdp.mdl
[t,x,y] = sim('vdp')
[t,x,y] = sim('vdp',[],simset('Decimation',2));
[t,x,y] = sim('vdp',1000,simset('FinalStateName','xState','MaxDataPoints',2000)); 
Príklad 13.3: Zistenie vlastností modelu 'schema.mdl'
>> simget('schema')
ans = 
             AbsTol: 'auto'
              Debug: 'off'
         Decimation: 5
       DstWorkspace: 'current'
     FinalStateName: 'xFinal'
          FixedStep: 'auto'
       InitialState: []
        InitialStep: 'auto'
           MaxOrder: 5
         SaveFormat: 'StructureWithTime'
      MaxDataPoints: 1000
            MaxStep: 'auto'
            MinStep: 'auto'
       OutputPoints: 'all'
    OutputVariables: 'txy'
             Refine: 1
             RelTol: 0.0010
             Solver: 'ode45'
       SrcWorkspace: 'base'
              Trace: ''
          ZeroCross: 'on'
top

13.3. Úlohy

  1. Vytvorte si model s názvom schema.mdl, ktorý obsahuje bloky:
    • Step
    • Transfer Fcn
    • To Workspace
  2. Nastavte prenos systému v tvare 1/(s2+2s+1), skokovú zmenu v čase 0 z hodnoty 0 na hodnotu 1. Názov premennej v bloku To Workspace nastavte na vystup.
  3. Vytvorte m-súbor subor.m, v ktorom postupne simulujte model pre časy 20, 40, 60, 80, 100.
  4. Výsledné priebehy zobrazte v samostatných suboknách v jednom okne
  5. Minimalizujte kód v m-súbore subor.m

14. Set_param a callback funkcie

14.1. Príkaz set_param

Príkazom set_param sa nastavujú parametre simulácie modelu a jeho blokov.

Syntax príkazu:
set_param('model', 'parameter1', hodnota1, 'parameter2', hodnota2, ...)

kde 'model' je názov modelu a 'parameter1', 'parameter2' ... sú parametre a 'hodnota1', 'hodnota2' ... sú hodnoty zodpovedajúcich parametrov.

Príkaz set_param je možné použiť na spustenie, zastavenie, prerušenie/pokračovanie alebo zmenu parametrov simulácie. Jeho syntax bude vysvetlená na príklade nastavenia vlastnosti SimulationCommand:

Syntax príkazu: Spustenie, zastavenie a prerušenie/pokračovanie simulácie
set_param('sys', 'SimulationCommand', 'cmd')

kde 'sys' je názov modelu a 'cmd' je 'start', 'stop', 'pause', 'continue' alebo 'update'.

Naopak, príkazom get_param je možné skontrolovať stav simulácie.

Syntax príkazu:
get_param('sys', 'SimulationStatus')

Simulink vráti: 'stopped', 'initializing', 'running', 'paused', 'updating', 'terminating' a 'external' (Real-Time Workshop).

Príklad 14.1: Spustenie, prerušenie/pokračovanie a zastavenie simulácie modelu sys.mdl
>> set_param('sys', 'SimulationCommand', 'start')
>> set_param('sys', 'SimulationCommand', 'pause')

>> get_param('sys', 'SimulationStatus')
ans =
paused

>> set_param('sys', 'SimulationCommand', 'continue')
>> get_param('sys', 'SimulationStatus')
ans =
running

>> set_param('sys', 'SimulationCommand', 'stop')
>> get_param('sys', 'SimulationStatus')
ans =
stopped
Príklad 14.2: Nastavenie parametrov simulácie (Solver = ode15s, StopTime = 3000) modelu sys.mdl
>> set_param('sys', 'Solver', 'ode15s', 'StopTime', '3000')
Príklad 14.3: Nastavenie zosilnenia (Gain = 1000) bloku Zosilnenie v modeli sys.mdl

>> set_param('sys/Zosilnenie', 'Gain', '1000')
Príklad 14.4: Nastavenie núl (Zeros = [2 4]) a pólov (Poles = [1 2 3]) bloku Zero-Pole v modeli sys.mdl

>> set_param('sys/Zero-Pole','Zeros','[2 4]','Poles','[1 2 3]')
Príklad 14.5: Skript pidreg_m.m, ktorý simuluje model pidreg.mdl s rôznymi parametrami PID
% otvorenie modelu
open_system('pidreg');

% nastavenie parametrov PID regulátora a prenosovej funkcie
set_param('pidreg/PID Controller','P','1');
set_param('pidreg/PID Controller','I','0.5');
set_param('pidreg/Transfer Fcn','Numerator','[2]');
set_param('pidreg/Transfer Fcn','Denominator','[1 3 1]');

% spustenie simulácie
[t,x] = sim('pidreg');

% iné nastavenie parametrov PID regulátora a prenosovej funkcie
set_param('pidreg/PID Controller','P','0.5');
set_param('pidreg/PID Controller','I','2');
set_param('pidreg/Transfer Fcn','Numerator','[4 1]');
set_param('pidreg/Transfer Fcn','Denominator','[1 4 1]');

% spustenie simulácie
[t1,x1] = sim('pidreg');

% zatvorenie všetkých modelov
bdclose('all');

% vykreslenie
plot(t,x(:,2),t1,x1(:,2))


Obr. Model pidreg.mdl

Kód modelu pidreg.mdl. Výsledný graf.

top

14.2. Callback funkcie

Callback je funkcia, ktorá sa spustí, ak užívateľ vykoná určitú akciu, napr. otvorí alebo zatvorí model, spustí simuláciu, vytvorí alebo vymaže blok v modeli.

Callback funkcie rozdelujeme na funkcie pre

14.2.1. Callback funkcie pre model

Funkcia Opis
CloseFcn Before the block diagram is closed
PostLoadFcn After the model is loaded. Defining a callback routine for this parameter might be useful for generating an interface that requires that the model has already been loaded
InitFcn Called at start of model simulation
PostSaveFcn After the model is saved
PreLoadFcn Before the model is loaded. Defining a callback routine for this parameter might be useful for loading variables used by the model
PreSaveFcn Before the model is saved
StartFcn Before the simulation starts
StopFcn After the simulation stops. Output is written to workspace variables and files before the StopFcn is executed

Použitie Callback funkcií pre model si ukážeme na príklade. Majme model ap11.mdl (obr. 7), ktorý nemá nastavené prenosy (LTI objekty) G1, G2, G3. V prípade, že otvoríme model ap11.mdl skôr ako definujeme prenosy G1, G2, G3, zobrazí sa chybové hlásenie (obr. 8). Bloky G1, G2, G3 majú zobrazené ???, pretože nie sú definované.


Obr. 7. Model ap11.mdl bez použitia Callback funkcií


Obr. 8. Chybové hlásenie

Aby sme sa vyhli takýmto hláseniam, môžeme použiť Callback funkciu, ktorá nám nastaví parametre pred otvorením modelu. V tomto prípade parametre nastavíme pomocou súboru ap11m.m, ktorý musí byť spustený pred otvorením modelu. Po uzatvorení modelu sa vypíše správa "koniec predstavenia", ktorá sa nachádza v súbore ap11mend.m.

Príklad 14.6: m-súbor: ap11m.m
G1=tf(1,1);
G2=tf(1,1);
G3=tf(1,1);
Príklad 14.7: m-súbor: ap11mend.m
disp('koniec predstavenia')

Aby sme mohli uvedené nastavenia aplikovať, musíme nastaviť parametre (callback funkcie) modelu ap11.mdl príkazom set_param.

Príklad 14.8:
set_param('ap11n', 'PreLoadFcn', 'ap11m')
set_param('ap11n', 'CloseFcn', 'ap11mend')

Výsledkom je model ap11n.mdl (kód, obr. 9)


Obr. 9. Model ap11n.mdl s použitím Callback funkcií

14.2.2. Callback funkcie pre bloky

Funkcia Opis
CloseFcn When the block is closed using the close_system command
CopyFcn After a block is copied. The callback is recursive for Subsystem blocks (that is, if you copy a Subsystem block that contains a block for which the CopyFcn parameter is defined, the routine is also executed). The routine is also executed if an add_block command is used to copy the block
DeleteFcn Before a block is deleted. This callback is recursive for Subsystem blocks
DestroyFcn When the block has been destroyed
InitFcn Before the block diagram is compiled and before block parameters are evaluated
LoadFcn After the block diagram is loaded. This callback is recursive for Subsystem blocks
ModelCloseFcn Before the block diagram is closed. This callback is recursive for Subsystem blocks
MoveFcn When the block is moved or resized
NameChangeFcn After a block’s name and/or path changes. When a Subsystem block’s path is changed, it recursively calls this function for all blocks it contains after calling its own NameChangeFcn routine
OpenFcn When the block is opened. This parameter is generally used with Subsystem blocks. The routine is executed when you double-click the block or when an open_system command is called with the block as an argument. The OpenFcn parameter overrides the normal behavior associated with opening a block, which is to display the block’s dialog box or to open the subsystem
ParentCloseFcn Before closing a subsystem containing the block or when the block is made part of a new subsystem using the new_system command (see new_system in the “Model Creation Commands” section of the Simulink online help)
PreSaveFcn Before the block diagram is saved. This callback is recursive for Subsystem blocks
PostSaveFcn After the block diagram is saved. This callback is recursive for Subsystem blocks
StartFcn After the block diagram is compiled and before the simulation starts. In the case of an S-Function block, StartFcn executes immediately before the first execution of the block’s mdlProcessParameters function. See “S-Function Callback Methods” in Writing S-Functions for more information
StopFcn At any termination of the simulation. In the case of an S-Function block, StopFcn executes after the block’s mdlTerminate function executes. See “S-Function Callback Methods” in Writing S-Functions for more information
UndoDeleteFcn When a block delete is undone

Majme nový model sys.mdl a m-súbor start.m, ktorý obsahuje definície premenných num a dem, ktoré sme použili v bloku prenosovej funkcie (Transfer function) modelu sys.mdl.

Príklad 14.9: M-súbor start.m
num = 1
den = [10 1]
pocet = 0

Chceme, aby model pri otvorení načítal údaje zo súbora start.m

Príklad 14.10:
>> open_system('sys')
>> set_param('sys', 'PreLoadFcn', 'start') % uložiť model >> bdclose('sys') >> open_system('sys') num = 1 den = 10 1 pocet = 0

Vytvorme si m-súbor, ktorý bude vypisovať text, v ktorom sa bude meniť číslo zodpovedajúce počtu spustení súbora, t.j. koľkokrát sa presunie blok Scope v modeli sys.mdl.

Príklad 14.11: M-súbor move.m
pocet = pocet + 1;
sprintf('Blok bol posunutý %d. krát',pocet)
Príklad 14.12:
>> get_param('sys/Scope','position')
ans =
   160    34   190    66

>> set_param('sys/Scope','MoveFcn','move')
ans = Blok bol posunutý 1. krát >> get_param('sys/Scope','position') ans = 160 54 190 86
ans = Blok bol posunutý 2. krát >> get_param('sys/Scope','position') ans = 175 54 205 86

Poznámka:

Niektoré Callback funkcie (Model pre-load, Model initialization, Simulation start, Simulation stop, Model pre-save a Model close) môžu byť nastavené pomcou menu File » Model properties » Callback.

top

14.3. Úlohy

  1. Vytvorte si model s názvom schema.mdl podľa úlohy v prechádzajúcom zadaní
  2. Čitateľ a menovateľ prenosu označte pomocou premenných num a den
  3. Pomocou Callback funkcií nastavte:
    • aby sa pri otvorení modelu zavolala m-funkcia init.m, ktorá obsahuje definíciu premenných num=1 a den=[1 2 1]
    • aby pri spustení simulácie bol vypísaný text 'Simulácia bola spustená'
    • aby pri zastavení/ukončení simulácie bol vykreslený priebeh premennej vystup v závislosti od času
    • aby pri zatvorení modelu bol vypísaný text 'Model schema.mdl bol zatvorený'

15. Subsystém a maska subsystému

15.1. Subsystém

Subsystém obyčajne zahrňuje logický celok, ktorý si s okolím vymieňa relatívne obmedzené množstvo informácií. Táto výmena informácií je realizovaná prostredníctvom vstupných a výstupných premenných (signálov).

Postup tvorby subsystémov a ich maskovania bude vysvetlený na príklade modelu "lineárnej závislosti".

Príklad 15.1:
Vytvorme model, ktorý predstavuje nasledujúcu závislosť 
y = a + b u

[in 1] -> [gain b]  -> +[sum] -> [out 1]
          [const a] -> +

Subsystém v Simulinku vytvoríme tak, že zostavíme model a označíme vstupné a výstupné signály pomocou blokov In a Out (obr. 1). Tieto bloky môžeme pomenovať. Názvy sa prenesú do označenia vstupných a výstupných signálov bloku, ktorý vznikne po vytvorení subsystému. Po označení vstupov a výstupov vyberieme všetky bloky, ktoré majú byť v subsystéme, a voľbou Edit->Create Subsystem vytvoríme subsystém (obr. 2). Vznikne nový blok, ktorý možno kopírovať či otvoriť do samostatného okna a ďalej upravovať.


Obr. 1. Model pripravený na tvorbu subsystému


Obr. 2. Subsystém

Vytvorený subsystém môžeme kopírovať a upravovať, avšak ak chceme použiť kópie z rôznymi hodnotami parametrov, musíme nové kópie editovať. Tento problém je možné vyriešiť napr. maskovaním subsystému.

top

15.2. Maska subsystému

Maskovanie subsystému je dostupné po zvolení subsystému voľbou Edit->Mask Subsystem. Okno, ktoré sa následne otvorí, dovoľuje zadať:


Obr. 3. Mask editor - záložka Icon


Obr. 4. Subsystém s maskou


Obr. 5. Subsystém s maskou (Drawing commands: plot([0,1],[0,b]+[b<0]))


Obr. 6. Mask editor - záložka Initialization


Obr. 7. Mask editor - záložka Documentation


Obr. 8. Okno definovania parametrov pre subsystém

Ak chceme zadávať parametre pomocou masky t.j. cez názvy premenných musíme tieto názvy použiť v parametroch blokov subsystému. Úprava zamaskovaného subsystému je možná voľbou Edit->Look under mask. Dvojklik na zamaskovanom subsystéme totiž teraz otvorí dialógové okno (masku) t.j. v našom prípade sa objaví okno ako je ukázané na obr. 8.

Úprava masky zamaskovaného subsystému je možná voľbou Edit->Edit mask....

top

15.3. Úlohy

  1. Vytvorte schému uzavretého regulačného obvodu, ktorá sa skladá zo systému 2. rádu s prenosovou funkciou Gr(s) = 1/(s^2+2s+1) a PID regulátora. PID regulátor je poskladaný z proporcionálnej (Gain), integračnej (Integrator) a derivačnej (Derivative) zložky. PID regulátor má tvar Gr(s)=Zr+1/(Is)+Ds
  2. Vytvorte subsystém pozostávajúci z jednotlivých časti (P,I,D) regulátora
  3. Zamaskujte subsystém. Vytvorte zadávacie polia pre jednotlivé zložky PID regulátora
  4. Testujte integračnú položku (delenie nulou)
  5. Vytvorte jednoduchý opis PID regulátora v okne, v ktorom sa definujú položky P, I a D (popis zadávania, rovnicu regulátora, ...)
  6. Vytvorte "Help", ktorý podrobne opisuje funkciu regulátora a jeho nastavenie
  7. Simulujte priebeh riadenia. Výsledky zobrazte pomocou bloku Scope, ktorý má dva vstupy u a y (t.j. aj dva zobrazované priebehy)

16. S-funkcia

S-funkcia je dynamický blok v Simulinku, ktorého "opis" je definovaný vo funkcii-súbore vytvoreného v MATLABe, v jazykoch C, C++, Ada, alebo Fortran. S-funkcie vytvorené v jazykoch C, C++, Ada a Fortran sú kompilované na MEX-súbory (pozri "Building MEX-Files" v dokumentácii). My sa budeme venovať S-funkciam vytvoreným v MATLABe.

S-funkcia umožňuje užívateľovi vytvárať vlastné bloky do modelu v Simulinku. V m-súbore S-funkcie môžu byť definované vlastné diferenciálne rovnice (ordinary differential equations (ODEs)), rovnice diskrétneho systému a/alebo ľubovoľný typ algoritmu.

16.1. Použitie S-funkcie v modeloch

Blok S-function sa nachádza v knižnici Simulink->User-Defined Functions (Simulink v. 5.0, v iných verziách: Simulink->Functions & Tables). Po presunutí/skopírovaní bloku do modelu sa definuje názov S-funkcie v položke S-function name (obr. 1).


Obr. 1. Blok S-function

Do položky S-function parameters sa zadávajú parametre "prenášané" do S-funkcie. Jednotlivé parametre sa oddeľujú čiarkou. Parametrami môžu byť konštanty (vektory, matice), názvy premenných definovaných v pracovnom priestore MATLABu, alebo výrazy v MATLABe (obr. 1). Parametre t,x,u (čas, stavy, vstupy) sú Simulinkom automaticky "prenášané" do S-funkcie.

top

16.2. Ako S-funkcia pracuje

S-funkcia reprezentuje dynamický blok

  u   ->      [ x ]     ->   y

vstup    systém (stavy)    výstup 

kde výstupy sú funkciou periódy vzorkovania, vstupov a stavov. Matematické vzťahy medzi vstupmi, výstupmi a stavmi môžu byť vyjadrené nasledujúcimi rovnicami:

y = f_y(t,x,u)			(výstup)
x_s = f_s(t,x,u)			(derivácia - spojitý systém)
x_d(t+1) = f_d(t,x,u)		(diferencia - diskrétny systém)
x = {x_s, x_d}

"Spracovanie/simulácia" S-funkcie prebieha v niekoľkých etapách:

  1. flag = 0 - inicializácia (funkcia mdlInitializeSizes)
  2. flag = 4 - výpočet periódy vzorkovania (funkcia mdlGetTimeOfNextVarHit)
  3. flag = 3 - výpočet výstupu y (funkcia mdlOutputs)
  4. flag = 2 - výpočet diskrétnych stavov x_d (funkcia mdlUpdate)
  5. flag = 1 - výpočet spojitých stavov x_s (funkcia mdlDerivatives)
  6. flag = 9 - koniec (funkcia mdlTerminate)

S-funkcia v tvare m-súboru je definovaná ako obyčajná funkcia v MATLABe:

function [sys,x0,str,ts] = meno(t,x,u,flag)

V prípade, že S-funkcia vyžaduje ďalšie vstupné parametre, jej tvar je nasledujúci:

function [sys,x0,str,ts] = meno(t,x,u,flag,p1,p2,...)

kde meno je názov S-funkcie, t je aktuálny čas, x je vektor stavov daného bloku (S-funkcie), u sú vstupy do bloku, flag udáva vykonávanú úlohu a p1, p2, ... sú parametre bloku. Počas simulácie modelu, Simulink opakovane vyvoláva S-funkciu meno a na základe flagov sa vykonávajú jednotlivé etapy S-funkcie.

Poznámka: v adresári toolbox\simulink\blocks\ sa nachádzajú príklady spojitej (csfunc.m) a diskrétnej (dsfunc.m) s-funkcie

Štruktúra S-funkcie bude vysvetlená na príklade šablóny sfuntmpl.m (help sfuntmpl, type sfuntmpl):

function [sys,x0,str,ts] = sfuntmpl(t,x,u,flag)

switch flag,

  %%%%%%%%%%%%%%%%%%
  % Initialization %
  %%%%%%%%%%%%%%%%%%
  case 0,
    [sys,x0,str,ts]=mdlInitializeSizes;

  %%%%%%%%%%%%%%%
  % Derivatives %
  %%%%%%%%%%%%%%%
  case 1,
    sys=mdlDerivatives(t,x,u);

  %%%%%%%%%%
  % Update %
  %%%%%%%%%%
  case 2,
    sys=mdlUpdate(t,x,u);

  %%%%%%%%%%%
  % Outputs %
  %%%%%%%%%%%
  case 3,
    sys=mdlOutputs(t,x,u);

  %%%%%%%%%%%%%%%%%%%%%%%
  % GetTimeOfNextVarHit %
  %%%%%%%%%%%%%%%%%%%%%%%
  case 4,
    sys=mdlGetTimeOfNextVarHit(t,x,u);

  %%%%%%%%%%%%%
  % Terminate %
  %%%%%%%%%%%%%
  case 9,
    sys=mdlTerminate(t,x,u);

  %%%%%%%%%%%%%%%%%%%%
  % Unexpected flags %
  %%%%%%%%%%%%%%%%%%%%
  otherwise
    error(['Unhandled flag = ',num2str(flag)]);

end

% end sfuntmpl

%
%==========================================================================
% mdlInitializeSizes
% Return the sizes, initial conditions, and sample times for the S-function.
%==========================================================================
%
function [sys,x0,str,ts]=mdlInitializeSizes

%
% call simsizes for a sizes structure, fill it in and convert it to a
% sizes array.
%
% Note that in this example, the values are hard coded.  This is not a
% recommended practice as the characteristics of the block are typically
% defined by the S-function parameters.
%
sizes = simsizes;

sizes.NumContStates  = 0;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 0;
sizes.NumInputs      = 0;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;   % at least one sample time is needed

sys = simsizes(sizes);

%
% initialize the initial conditions
%
x0  = [];

%
% str is always an empty matrix
%
str = [];

%
% initialize the array of sample times
%
ts  = [0 0];

% end mdlInitializeSizes

%
%==========================================================================
% mdlDerivatives
% Return the derivatives for the continuous states.
%==========================================================================
%
function sys=mdlDerivatives(t,x,u)

sys = [];

% end mdlDerivatives

%
%==========================================================================
% mdlUpdate
% Handle discrete state updates, sample time hits, and major time step
% requirements.
%==========================================================================
%
function sys=mdlUpdate(t,x,u)

sys = [];

% end mdlUpdate

%
%==========================================================================
% mdlOutputs
% Return the block outputs.
%==========================================================================
%
function sys=mdlOutputs(t,x,u)

sys = [];

% end mdlOutputs

%
%==========================================================================
% mdlGetTimeOfNextVarHit
% Return the time of the next hit for this block.  Note that the result is
% absolute time.  Note that this function is only used when you specify a
% variable discrete-time sample time [-2 0] in the sample time array in
% mdlInitializeSizes.
%==========================================================================
%
function sys=mdlGetTimeOfNextVarHit(t,x,u)

sampleTime = 1;    %  Example, set the next hit to be one second later.
sys = t + sampleTime;

% end mdlGetTimeOfNextVarHit

%
%==========================================================================
% mdlTerminate
% Perform any end of simulation tasks.
%==========================================================================
%
function sys=mdlTerminate(t,x,u)

sys = [];

% end mdlTerminate

Definovanie periódy vzorkovania: (ts)

ts = [0 0]      (spojitý systém)
ts = [-1 0]     (zdedená ts, offset)
ts = [1 0]      (diskrétny systém, ts = 1)
ts = [0 0; 1 0] (hybridny systém (spojitý + diskrétny systém))

Pri zdedenej perióde vzorkovania sa perióda vzorkovania "dedí" z predchádzajúceho, alebo nasledujúceho bloku, alebo je použitá najrýchlejšia perióda vzorkovania.

Definovanie počiatočných hodnôt stavov: (x0)

x0 = []      	(systém nemá stavy)
x0 = zeros(1,n)	(systém má n stavov ( = 0))

% length(x0) = length(sizes.NumContStates) (spojitý systém)
% length(x0) = length(sizes.NumDiscStates) (diskrétny systém)

Definovanie veľkosti vstupov/výstupov: (sizes.NumOutputs, sizes.NumInputs)

sizes.NumOutputs     = 0;	(nie je výstup)
sizes.NumInputs      = 0;	(nie je vstup)

sizes.NumOutputs     = 2;	(2 výstupy)
sizes.NumInputs      = 3;	(3 vstupy)

sizes.NumOutputs     = -1;	(výstupy s dynamickou veľkosťou)
sizes.NumInputs      = -1;	(vstupy s dynamickou veľkosťou)

% veľkosť vektora vstupu (sizes.NumInputs = length(u))

Definovanie priamej väzby (Direct feedthrough): (sizes.DirFeedthrough)

sizes.DirFeedthrough = 0;
sizes.DirFeedthrough = 1;

sizes.DirFeedthrough = 1 znamená, že výstup (flag == 3) alebo premenlivá perióda vzorkovania (flag == 4) je priamo funkciou vstupu (u), inak sizes.DirFeedthrough = 0.

Definovanie sizes.NumSampleTimes:

Ak sizes.NumSampleTimes > 0, potom S-funkcia má "block-based sample times".

16.2.1. Príklad: hydraulický systém

Postup tvorby S-funkcie bude vysvetlený na príklade modelu hydraulického systému popísaného diferenciálnymi rovnicami (rovnice sú zapísané vo formáte TeX):

\dot{h}_1 = 1/F1 u - k1/F1 sqrt ( h(1) - h(2) )
\dot{h}_2 = k1/F2 sqrt ( h(1) - h(2) ) - k2/F2 sqrt ( h(2) )
Príklad 16.1: m-súbor: hyd2.m
function [sys,x0,str,ts] = hyd2(t,x,u,flag)

switch flag,
  case 0,
    [sys,x0,str,ts]=mdlInitializeSizes;
  case 1,
    sys=mdlDerivatives(t,x,u);
  case 3,
    sys=mdlOutputs(t,x,u);
  case {2, 4, 9},
    sys = [];
  otherwise
    error(['Unhandled flag = ',num2str(flag)]);
end

%==========================================================================
% mdlInitializeSizes
%==========================================================================
function [sys,x0,str,ts]=mdlInitializeSizes
h1s=1; h2s=1;		% definovanie ustálených výšok hladín
sizes = simsizes;
sizes.NumContStates  = 2;	% dva stavy (výška h1 a h2)
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 1;	% jeden výstup (výška h2)
sizes.NumInputs      = 1;	% jeden vstup (prietok)
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;   
sys = simsizes(sizes);
x0  = [h1s; h2s];
str = [];
ts  = [0 0];

%==========================================================================
% mdlDerivatives
%==========================================================================
function sys=mdlDerivatives(t,x,u)
f1=1; f2=1; k1=1; k2=1;	% definovanie parametrov zásobníkov
% Matematický model hydraulického systému v tvare diferenciálnych rovníc 
sys(1) = 1/f1*u-k1/f1*sqrt(x(1)-x(2));
sys(2) = k1/f2*sqrt(x(1)-x(2))-k2/f2*sqrt(x(2));
sys = [sys(1); sys(2)];

%==========================================================================
% mdlOutputs
%==========================================================================
function sys=mdlOutputs(t,x,u)
sys = x(2);	% Výstupom je druhý stav (výška h2)

V S-funkcii hyd2.m sú parametre f1,f2,k1,k2,h1s,h2s definované priamo.


Obr. 2. S-funkcia hyd2.m s priamo definovanými parametrami

V nasledujúcej funkcii sa parametre f1,f2,k1,k2,h1s,h2s funkcii predávajú.

Príklad 16.2: m-súbor: hyd2m.m
function [sys,x0,str,ts] = hyd2m(t,x,u,flag,ff,kk,hs)

switch flag,
  case 0,
    [sys,x0,str,ts]=mdlInitializeSizes(hs(1),hs(2));
  case 1,
    sys=mdlDerivatives(t,x,u,ff(1),ff(2),kk(1),kk(2));
  case 3,
    sys=mdlOutputs(t,x,u);
  case {2, 4, 9},
    sys = [];
  otherwise
    error(['Unhandled flag = ',num2str(flag)]);
end

%==========================================================================
% mdlInitializeSizes
%==========================================================================
function [sys,x0,str,ts]=mdlInitializeSizes(h1s,h2s)
sizes = simsizes;
sizes.NumContStates  = 2;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 1;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;  
sys = simsizes(sizes);
x0  = [h1s; h2s];
str = [];
ts  = [0 0];

%==========================================================================
% mdlDerivatives
%==========================================================================
function sys=mdlDerivatives(t,x,u,f1,f2,k1,k2)
sys(1) = 1/f1*u-k1/f1*sqrt(x(1)-x(2));
sys(2) = k1/f2*sqrt(x(1)-x(2))-k2/f2*sqrt(x(2));
sys = [sys(1); sys(2)];

%==========================================================================
% mdlOutputs
%==========================================================================
function sys=mdlOutputs(t,x,u)
sys = x(2);


Obr. 3. Nemaskovaná S-funkcia hyd2m


Obr. 4. Maskovaná S-funkcia hyd2m

16.2.2. Príklad:

Demoverzia S-funkcie, ktorej výstup je dvojnásobkom jej vstupu (y = 2 * u).

Príklad 16.3: m-súbor: timestwo.m
function [sys,x0,str,ts] = timestwo(t,x,u,flag)

switch flag,
  case 0
    [sys,x0,str,ts]=mdlInitializeSizes;
  case 3
    sys=mdlOutputs(t,x,u);
  case { 1, 2, 4, 9 }
    sys=[];
  otherwise
    error(['Unhandled flag = ',num2str(flag)]);
end

%==========================================================================
% mdlInitializeSizes
%==========================================================================
function [sys,x0,str,ts] = mdlInitializeSizes()
sizes = simsizes;
sizes.NumContStates  = 0;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = -1;  % dynamically sized
sizes.NumInputs      = -1;  % dynamically sized
sizes.DirFeedthrough = 1;   % has direct feedthrough
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
str = [];
x0  = [];
ts  = [-1 0];   % inherited sample time

%==========================================================================
% mdlOutputs
%==========================================================================
function sys = mdlOutputs(t,x,u)
sys = u * 2;


Obr. 5. Model s S-funkciou timestwo.m


Obr. 6. Priebeh simulácie s S-funkciou timestwo.m

top

16.3. Úlohy

  1. Vytvorte m-súbor S-funkcie modelu dvoch zásobníkov kvapaliny. Parametre zásobníkov kvapaliny sú [k1, k2, f1, f2, q0s] = [9.0, 8.28, 9.0, 7.83, 9.0]. Parametre sa zadávajú pomocou masky S-funkcie.

    Matematický model zásobníkov kvapaliny s interakciou
    dh1/dt = 1/F1 * q0 - k1/F1 * (h1 - h2)0.5
    dh2/dt = k1/F2 * (h1 - h2)0.5 - k2/F2 * (h2)0.5

    Matematický model zásobníkov kvapaliny bez interakcie
    dh1/dt = 1/F1 * q0 - k1/F1 * (h1)0.5
    dh2/dt = k1/F2 * (h1)0.5 - k2/F2 * (h2)0.5

    Poznámka: začiatočné hodnoty výšok hladín závisia od typu (s/bez interakcie).

  2. Výber zásobníkov s interakciou/bez interakcie urobte pomocou checkboxu
  3. V prípade, že niektorý z parametrov nie je definovaný (t.j. je definovaný prázdny vektor/matica []), použije sa jeho predvolená hodnota a vypíše sa hlásenie o uvedenej zmene
  4. Simulujte priebeh výšok hladín zásobníkov pri zmene prietoku q0 z ustálenej hodnoty q0s na hodnotu o 5% väčšiu

17. Vytváranie MEX-súborov

17.1. Úlohy