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í.
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.
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).
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ť.
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í:
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 |
Knižnica | Opis |
---|---|
general | operátory a špeciálne znaky |
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 | 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 |
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.>> 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. ....
>> 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.
>> 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
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
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.
% Povolenie výstupu A = eye(3) A = 1 0 0 0 1 0 0 0 1 % Zakázanie výstupu A = eye(3);
šipka hore | ctrl+p | presunie sa na predchádzajúci riadok |
---|---|---|
šipka dole | ctrl+n | presunie sa na nasledujúci riadok |
Klávesa | Význam |
---|---|
enter | odošle riadok na spracovanie |
esc | zmaže celý riadok |
home | presun kurzoru na začiatok riadku |
end | presun kurzoru na koniec riadku |
Funkcia | Opis |
---|---|
clc | vymazanie príkazového riadku |
echo on/off | povolenie/zakázanie výpisu vykonávajúcich sa príkazov |
format | nastavenie výstupného formátu |
home | nastavenie kurzora na začiatok (ľavý horný roh) |
more on/off/(n) | kontrola výstupu stránok v príkazovom okne, q - ukončenie výstupu |
% priklad1.m echo off % predvolené nastavenie % poznámka A = [1 2;7 4]; B = [1;3]; C = A\B % priklad2.m echo on % poznámka A = [1 2;7 4]; B = [1;3]; C = A\B
>> priklad1 C = 0.2000 0.4000
>> priklad2 % poznámka A = [1 2;7 4]; B = [1;3]; C = A\B C = 0.2000 0.4000
>> x = [4/3 1.2345e-6] >> format short 1.3333 0.0000 >> format short e 1.3333e+000 1.2345e-006 >> format short g 1.3333 1.2345e-006 >> format long 1.33333333333333 0.00000123450000 >> format bank 1.33 0.00 >> format rat 4/3 1/810045 >> format % nastavenie pôvodného nastavenia => format short
>> format % štandardný výstup >> x = [4/3 1.2345e-6] x = 1.3333 0.0000 >> >> format compact % okolo výsledkov nebudú prázdne riadky >> x = [4/3 1.2345e-6] x = 1.3333 0.0000 >>
Nasleduje niekoľko príkladov na kontrolu výstupu stránok v príkazovom okne pri výpise obsahu súboru ss2tf pomocou príkazu type
>> more on >> type ss2tf function [num, den] = ss2tf(a,b,c,d,iu) %SS2TF State-space to transfer function conversion. % [NUM,DEN] = SS2TF(A,B,C,D,iu) calculates the transfer function: ... [mc,nu] = size(d); if nargin==4, --more--
Stlačením klávesy "medzerník = space" sa zobrazí ďalšia stránka, ktorá v tomto prípade znamená aj koniec súboru ss2tf.
if (nu<=1) iu = 1; else error('IU must be specified for systems with more than one input.'); end end ... nc = length(a); num = ones(mc, nc+1); for i=1:mc num(i,:) = poly(a-b*c(i,:)) + (d(i) - 1) * den; end
>> more(2) >> type ss2tf function [num, den] = ss2tf(a,b,c,d,iu) --more--
Stlačením klávesy "medzerník = space" sa zobrazia ďalšie dva riadky súboru ss2tf.
function [num, den] = ss2tf(a,b,c,d,iu) %SS2TF State-space to transfer function conversion. % [NUM,DEN] = SS2TF(A,B,C,D,iu) calculates the transfer function: --more--
Ďalším stlačením klávesy "medzerník = space" sa zobrazia ďalšie dva riadky súboru ss2tf.
function [num, den] = ss2tf(a,b,c,d,iu) %SS2TF State-space to transfer function conversion. % [NUM,DEN] = SS2TF(A,B,C,D,iu) calculates the transfer function: % % NUM(s) -1 --more--
>> more off >> type ss2tf function [num, den] = ss2tf(a,b,c,d,iu) %SS2TF State-space to transfer function conversion. % [NUM,DEN] = SS2TF(A,B,C,D,iu) calculates the transfer function: ... nc = length(a); num = ones(mc, nc+1); for i=1:mc num(i,:) = poly(a-b*c(i,:)) + (d(i) - 1) * den; end
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 |
>> clear >> clear C % vymaže C >> clear all % vymaže aj globálne premenné
>> disp('zobrazenie textu t_1') zobrazenie textu t_1 >> disp(A) 1 2 7 4
>> length(B) ans = 2
>> size(B) ans = 2 1 >> size(A) ans = 2 2
>> who Your variables are: A B C a ans
>> 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
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 |
cd c:\MATLAB6p5\work >> pwd % zobrazenie aktuálneho prac. adresára ans = C:\MATLAB6p5\work
>> 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
>> 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
>> 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
>> 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
>> type subor a=1; b=3; c=[1 2] c = 1 2 diary off d=[1,2,3] d = 1 2 3 diary off
>> !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)?
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
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:
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.
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 |
>> 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. ...
>> 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 ...
>> what M-files in the current directory C:\MATLAB6p5\work priklad subor MDL-files in the current directory C:\MATLAB6p5\work schema
>> which type type is a built-in function. >> which type.m C:\MATLAB6p5\toolbox\matlab\general\type.m
Premenná je objekt, ktorý má svoj názov, typ a obsah (hodnotu).
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ď.)
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:
Na vytvorenie premennej sa používa príkaz:
>> názov_premennej = výraz.
>> 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)!
>> v1=[2 0.1 -3.7 4/5 0.14]; % alebo >> u1=[2,.1, -3.7, 4/5,0.14];
>> v2=[2; 0.1; -3.7; 4/5; 0.14];
>> 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.
>> u1 u1 = 2.0000 0.1000 -3.7000 0.8000 0.1400 >> u1=[1 -3 2]; >> u1 u1 = 1 -3 2
>> A A = 1.0000 2.0000 0.1000 -3.0000 0.7000 0.2500
Premenné, ktoré už nie sú potrebné, možno vymazať s použitím okna Workspace, resp. pomocou príkazu clear.
>> 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.
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.
>> i ans = 0 + 1.0000i >> i=7 i = 7 >> clear i >> i ans = 0 + 1.0000i
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.
>> 2*3-5 ans = 1 >> 2*3+5; >> ans ans = 11
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.
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 |
% 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
% 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
% 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
Premenná | Opis |
---|---|
ans | automatická premenná na odpoveď |
computer | premenná počítačového typu |
eps | relatívna presnosť (2.2204e-016) |
i,j | imaginárne operátory |
inf | výsledok je infinitív |
NaN | nie je číslo, neexistuje daná operácia (Not-a-Number) |
nargin | vstupné číslo do funkcie |
nargout | výstupné číslo z funkcie |
why | úspešná odpoveď |
version | číslo verzie MATLABu |
pi | pi = 3.1415926... |
realmax | najväčšie reálne číslo 1.7977e+308 |
realmin | najmenšie reálne číslo 2.2251e-308 |
>> 12/0 Warning: Divide by zero. ans = Inf
>> computer ans = PCWIN
>> 0/0 ans = NaN
>> 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.
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.
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 >>.
>> 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];
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.
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).
>> m=8, n=3; vysledok=3*m+0.5*n m = 8 vysledok = 25.5000
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.
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:
>> 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.
>> mena = ['Ivan '; 'Jana '; 'Peter'; 'Eva '; 'Ivan '] mena = Ivan Jana Peter Eva Ivan
>> mena = ['Eva'; 'Ivan']
??? Error using ==> vertcat
All rows in the bracketed expression must have the same
number of columns.
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.
>> 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).
>> 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).
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é.
>> x = 10; % Vytvorenie premennej x, bez výpisu
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 |
Názov | Syntax | Opis |
---|---|---|
unárny plus | +a1 | |
unárny mínus | -a1 | |
transpozícia a konjugovanosť | a1' | |
transpozícia | a1.' |
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 |
Názov | Syntax | Opis |
---|---|---|
vytváranie aritmetických postupností | i:k:j i:j |
|
Názov | Syntax | Opis |
---|---|---|
menší | < |
|
menší alebo rovný | <= | |
väčší | > | |
väčší alebo rovný | >= | |
rovnajúci sa | == | |
nerovnajúci sa | ~= |
Upozornenie: je veľký rozdiel medzi == (porovnanie) a = (priradenie).
>> 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).
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
Názov | Syntax | Opis |
---|---|---|
negácia | ~a1 |
|
Nasledujúca tabuľka zobrazuje možné stavy dosiahnuté negáciou.
Negácia | |
---|---|
a1 | ~a1 |
nenulové | 0 |
0 | 1 |
Názov | Syntax | Opis |
---|---|---|
logický súčin | a1&a2 |
|
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 | |||
---|---|---|---|
a1 | a2 | a1&a2 | a1|a2 |
nenulové | nenulové | 1 | 1 |
nenulové | 0 | 0 | 1 |
0 | nenulové | 0 | 1 |
0 | 0 | 0 | 0 |
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
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.
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 |
% 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
% Delenie prvkov vektorov y a x nastane,
% ak všetky prvky vektora x sú nenulové
if all(x)
d = y./x
end
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).
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).
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, ...
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ď
% 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)
>> 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.
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.
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
function | [výstupy]= | názov_funkcie | (vstupy) |
---|---|---|---|
kľúčové slovo | výstupy funkcie | názov funkcie | vstupné parametre funkcie |
výstupy:
názov_funkcie:
vstupy:
function [s]=sucet(a,b) % funkcia s jedným výstupom a dvoma vstupmi function [podiel,zvysok] = delenie(delenec,delitel) % funkcia s dvoma vstupmi a výstupmi function f = faktorial(n) % funkcia s jedným výstupom a vstupom function graf(x,y) % funkcia bez výstupu a dvoma vstupmi
Prvý riadok nápovedy by mal obsahovať názov funkcie a vystihovať jej činnosť, pretože je
vypisovaný príkazom lookfor slovo (slúží na výpis všetkých funkcií obsahujúcich dané
slovo) alebo pri výpise nápovedy k funkciám adresára help adresár
(napríklad help C:\temp\matlab).
Ďalšie riadky nápovedy by mali obsahovať opis vstupu a výstupu funkcie a tiež príklad jej použitia.
Poznámka: na výpis chyby a ukončenie funkcie možno použiť funkciu error, jej parametrom je text chybového hlásenia (napr. error('Chyba: veľa vstupných parametrov!')). Okrem vytvorenia nápovedy k funkcii je vhodné používať tiež komentáre v kóde funkcie (pri jednotlivých príkazoch).
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)
s = a+b;
function [prep] = prepona(odvesna1,odvesna2) % PREPONA - vypočet prepony pravouhleho trojuholnika prep = (odvesna1^2 + odvesna2^2)^(1/2); % pouzitie Pythagorovej vety
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
>> s = sucet(7,14); >> vysledok = sucet(7,14) vysledok = 21 >> x=7; y=14; sucet(x,y) ans = 21
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).
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:
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.
% 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
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.
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;
>> [x,y] = kontrola(1,2); počet zadanych vstupnych argumentov: 2 počet vystupnych argumentov: 2
>> [x] = kontrola(1); počet zadanych vstupnych argumentov: 1 počet vystupnych argumentov: 1
>> kontrola(1); počet zadanych vstupnych argumentov: 1 počet vystupnych argumentov: 0
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
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 |
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:
>> znamka = 3; >> if znamka == 1 zobraz = 'Gratulujeme! Lepsie to byt nemohlo!' end
Poznámka:
>> znamka = 1; if znamka == 1; zobraz = 'Gratulujeme! Lepsie to byt nemohlo!', end zobraz = Gratulujeme! Lepsie to byt nemohlo!
if a < 5 disp('hodnota premennej ''a'' je mensia ako cislo 5') end
>> a = 3; >> priklad hodnota premennej 'a' je mensia ako cislo 5V 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.
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
>> 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á).
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
>> 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 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á).
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
>> 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
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 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.
while 1 % podmienka je vždy pravdivá, má stále hodnotu 1
disp('opakujem...')
end
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
>> f = fakt1(5)
f =
120.00
>> fakt1(0)
ans =
1.00
>> f = fakt1(-5)
??? Error using ==> fakt1
faktorial neexistuje
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.
k = 1; for i=1:5 k = k*i; sprintf('%d! = %d',i,k) end
>> fakt2 ans = 1! = 1 ans = 2! = 2 ans = 3! = 6 ans = 4! = 24 ans = 5! = 120
n = 3; % Pocet stlpcov m = 2; % Pocet riadkov for i=1:m for j=1:n A(i,j) = i*j end end
>> 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
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 |
>> dlzka = input('Zadaj velkost vektora: ') Zadaj velkost vektora: 4 dlzka = 4
disp('Zaciatok') keyboard disp('Koniec')
>> klavesnica Zaciatok K>> c = 1 c = 1.00 K>> b = 2 b = 2.00 K>> return Koniec >>
k = menu('Vyber krivky','Priamka','Parabola','Exponenciala')
k = 2.00
V názve matice, ktorý môže obsahovať až 31 znakov, sú povolené iba nasledujúce znaky:
Názov nesmie začínať číslicou.
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)!
Rôzne spôsoby zadávania matice si ukážeme na príkladoch. Majme maticu
>> A = [1 2 3;4 5 6;7 8 9] A = 1 2 3 4 5 6 7 8 9
>> A = [1,2,3;4,5,6;7,8,9] A = 1 2 3 4 5 6 7 8 9
>> A = [1,2,3 4,5,6 7,8,9] A = 1 2 3 4 5 6 7 8 9
>> A = [1 2 3;4,5,6 7 8 9] A = 1 2 3 4 5 6 7 8 9
>> A(1,2) = 0 A = 1 0 3 4 5 6 7 8 9
>> 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
Rôzne spôsoby manipulácie matice si opäť ukážeme na príkladoch. Majme maticu
>> B = A(2,2) B = 5 >> A(1,3) ans = 3
>> 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
>> 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
>> 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
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
>> d = diag(A) d = 1 5 9
>> d = diag(A,-1) d = 4 8
>> d = diag(A,1) d = 2 6 >> d = diag(A,2) d = 3
>> 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
>> B = fliplr(A) B = 3 2 1 6 5 4 9 8 7
>> B = flipud(A) B = 7 8 9 4 5 6 1 2 3
>> size(A) ans = 3 3 >> [riadky, stlpce] = size(A) riadky = 3 stlpce = 3
>> B = rot90(A) % Rotácia matice o 90º
B =
3 6 9
2 5 8
1 4 7
>> 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
>> 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
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 |
|
odčítanie | a1-a2 | |
násobenie matíc | a1*a2 |
|
umocnenie matice | a1^a2 |
|
delenie matíc | a1/a2 |
|
delenie matíc zľava | a1\a2 |
|
transpozícia a konjugovanosť | a1' |
|
>> C = [1 2;7 8]; >> D = [3 -5;-1 4]; >> C+D ans = 4 -3 6 12 >> 3+D ans = 6 -2 2 7
>> C-D ans = -2 7 8 4 >> D-2 1 -7 -3 2
>> 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
>> A = [1 2;7 8]; >> B = [3 -5;-1 4]; >> x = B/A x = -9.8333 1.8333 6.0000 -1.0000
>> x = A\B x = -4.3333 8.0000 3.6667 -6.5000
>> C' ans = 1 7 2 8
C^2
ans =
15 18
63 78
% Rovnaký výsledok dosiahneme aj výrazom
C*C
ans =
15 18
63 78
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 |
>> C.*D ans = 3 -10 -7 32
>> C./D ans = 0.3333 -0.4000 -7.0000 2.0000
>> C.^2 ans = 1 4 49 64 >> C.*C ans = 1 4 49 64
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):
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;
>> 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
% 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
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 |
>> C = eye(3) % alebo C = eye(3,3)
C =
1 0 0
0 1 0
0 0 1
>> C = zeros(2,3) C = 0 0 0 0 0 0
>> C = ones(3,2) C = 1 1 1 1 1 1
>> rand(2,3) ans = 0.4447 0.7919 0.7382 0.6154 0.9218 0.1763
>> randn(2,3) ans = -0.5883 -0.1364 1.0668 2.1832 0.1139 0.0593
>> 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
>> 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
% 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
>> [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
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
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.
>> b = [1 4 5 2]; a = [2 5 3]; >> conv(a,b) ans = 2 13 33 41 25 6
>> [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
>> p = [2 3 4 1]; >> polyval(p,1) ans = 10
>> polyval(p,[0 2 3]) ans = 1 37 94
>> roots([1 2 -9 -18]) ans = 3.0000 -3.0000 -2.0000
>> roots([1 -2 3 5]) ans = 1.4473 + 1.8694i 1.4473 - 1.8694i -0.8946
>> A = [1.2 3 -0.9;5 1.75 6;9 0 1]; >> poly(A) ans = 1.0000 -3.9500 -1.8500 -163.2750
>> 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
>> a = [2 1 3]; >> polyder(a) ans = 4 1 >> b = [3 1 5 4]; >> polyder(b) ans = 9 2 5
>> polyder(a,b) ans = 30 20 60 32 19
>> [q,d] = polyder(b,a) q = 6 6 18 -10 11 d = 4 4 13 6 9
B/A = R(1)/(s-P(1)) + R(2)/(s-P(2)) + ... R(n)/(s-P(n)) + K
>> 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 = []
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:
y_aprox = polyval(p,x)
kde
% 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
>> 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
>> 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)
Základné vlastnosti maticových funkcií sú:
Prehľad týchto funkcií zobrazí príkaz help matfun.
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 |
>> A = [4 -2 1;-1 5 6;2 0 5]; det(A) ans = 56
>> B = [1 0 2;2 3 4;4 6 8]; trace(B) ans = 12
>> rank(B) ans = 2
Príkazom null(A) je možné získať takú maticu Q, pre ktorú platí:
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í:
>> 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
>> B = [1 2;3 5]; >> Q = null(B) Q = Empty matrix: 2-by-0
>> 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
>> 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
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í:
>> 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
>> 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
>> 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
Príkaz | Opis |
---|---|
eig | rozklad matice na vlastné hodnoty a vlastné vektory |
svd | singulárny rozklad |
>> A = [1 5 2;4 -2 1;-3 3 2]; >> eig(A) ans = -5.0766 3.0383 + 0.7859i 3.0383 - 0.7859i
>> [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
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.
>> 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
>> svd(A) ans = 7.0082 4.6389 1.5380
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 |
>> data3 = [3 2 5]; >> cumsum(data3) ans = 3 5 10
>> 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
>> cumprod(data3) ans = 3 6 30
>> cumprod(data4) ans = 4 3 2 12 21 8 -24 21 40
>> data1 = [2 4 7]; >> sum(data1) ans = 13
>> 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
>> prod(data1) ans = 56
>> 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
>> max([4 2 15]) ans = 15
>> 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
>> mean([1 4 2 2 1]) ans = 2
>> mean([1 3 2;5 2 1;2 2 1;4 2 2]) ans = 3.0000 2.2500 1.5000
>> sort([4 8 5 1]) ans = 1 4 5 8
>> sort([5 8 4;2 1 3;9 7 1]) ans = 2 1 1 5 7 3 9 8 4
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.
>> X = [1 2 3.5 5 7]; >> Y = [3 2 6 7 4]; >> trapz(X,Y) ans = 29.2500
>> trapz(Y) ans = 18.5000
Funkcia | Opis |
---|---|
diff | diferencia |
gradient | aproximovaný gradient |
Funkcia diff vypočítava diferenciu, t.j. rozdiel medzi dvoma alebo viacerými bodmi podľa toho aký stupeň diferencie sa zvolí:
>> x = [4 7 3.5 -1 5 3 6]; >> diff(x) ans = 3.0000 -3.5000 -4.5000 6.0000 -2.0000 3.0000
>> diff(x,2) ans = -6.5000 -1.0000 10.5000 -8.0000 5.0000
>> A=[1 2 3;1 4 5;7 8 9] >> diff(A) ans = 0 2 2 6 4 4
>> diff(A,2) ans = 6 2 2
>> 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 ...
>> 2*cos(x.^2).*x ans = 0 0.0200 0.0400 0.0600 0.0800 0.1000 ...
>> 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
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 |
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.
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;
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;
>> 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).
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;
>> 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
>> 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
Pomocu funkcie fplot(fmeno,limit) sa zobrazuje priebeh funkcie s názvom fmeno v zadanom rozsahu limit.
>> fplot('jedno_par',[-3,3])
>> fplot('[sin(x), cos(x)]',[0 4*pi])
Na riešenie diferenciálnych rovníc je možné použiť funkcie ode23, ode45 a ďalšie.
[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:
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];
>> [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);
>> [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
Zápis funkcie pre výpočet určitého integrálu funkcie funkcia s hranicami a, b, toleranciou tol:
[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].
>> 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
>> quad('sin',0,pi,1e-5,0) ans = 2.0000
function f = funkcia(t) f = sqrt(4*cos(2*t).^2 + sin(t).^2 + 1);
>> quad('funkcia',0,3*pi) ans = 17.2220
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 |
>> 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
Funkcia | Opis |
---|---|
exp | exponenciála so základom e (e=2.71828182845905 - Eulerovo číslo) |
log | prirodzený logaritmus |
log10 | dekadický logaritmus |
sqrt | odmocnina |
>> exp(2) ans = 7.3891 >> exp(2+3i) ans = -7.3151 + 1.0427i
>> log(7.3891) ans = 2.0000 >> log10(100) ans = 2
>> sqrt(25) ans = 5 >> sqrt([1 4;16 81]) ans = 1 2 4 9
>> 5^0.25 ans = 1.4953 >> 2.^[1 2 3 4 5] ans = 2 4 8 16 32
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 |
>> b = 6+8i; >> velkost = abs(b) velkost = 10 >> uhol = angle(b) uhol = 0.9273
>> 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
>> conj(2+7i) ans = 2.0000 - 7.0000i
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 |
>> rem(10,3) ans = 1 >> rem([45 12 37],7) ans = 3 5 2
sign(-5) ans = -1 sign([12 0 -3 4]) ans = 1 0 -1 1
>> fix(2.7) ans = 2
>> ceil(2.3) ans = 3
>> floor(2.7) ans = 2
>> round(2.3) ans = 2
MATLAB umožňuje zobrazovať údaje v 2 a 3-rozmerných grafoch.
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:
% 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
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 |
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.
>> 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
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) |
>> x = [-5:5]; >> y = x.^2; >> plot(x,y,'r-*',x,y/2,'m-.') % obrázok
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.
>> x = 0:0.01:4; >> y = sin(0:0.01:4); >> z = x.^2;
>> figure >> loglog(x,y) % obrázok
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.
>> figure >> fill([0,1,0.5],[0,0,1],'r') % obrázok
>> figure >> plotyy(x,y,x,z) % obrázok
>> [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
>> plot(w,amp_db) % obrázok
>> semilogx(w,amp_db) % obrázok
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á |
Funkciou axes je možné vytvoriť osi a umiestniť ich na ľubovoľné miesto v grafickom okne
% 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
% 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
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.
>> plot(x,y,'r') % obrázok >> hold on >> plot(x,z,'b') % obrázok
>> 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
>> subplot(3,4,7) % obrázok
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
>> subplot(1,2,1) >> plot(x,y,'r') >> subplot(1,2,2) >> plot(x,z,'b') % obrázok
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).
>> h = plot(w,amp_db);
>> 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
% pôvodné: LineStyle = -
% zmeniť na: LineStyle = x
>> set(h,'LineStyle','x') % obrázok
% 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
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 |
>> 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
>> 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
>> 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
>> 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).
Znak | Zápis | Znak | Zápis | Znak | Zá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} |
Špeciálne grafy sú využívané najmä v oblastiach:
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 |
>> 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
>> t = 0:0.01:2*pi; >> polar(t,abs(sin(2*t).*cos(2*t))); % obrázok
Funkcia | Opis |
---|---|
stem | dvojrozmerné kmeňové zobrazenie |
stem3 | trojrozmerné kmeňové zobrazenie |
stairs | schodové zobrazenie |
>> x = 0:0.25:10; >> stairs(x,sin(x)); % obrázok
>> x = 0:0.1:4; >> y = sin(x.^2).*exp(-x); >> stem(x,y); % obrázok
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 |
>> 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
>> uhol = 90:-10:0; >> velkost = 5*ones(size(uhol)); >> [u,v] = pol2cart(uhol*pi/180,velkost); >> feather(u,v); % obrázok
>> 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
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 |
>> z = peaks(25); >> pcolor(z) >> colormap(hsv) % obrázok
>> [C,h] = contour(z,10); >> clabel(C,h); % obrázok
>> [C,h] = contourf(z,10); >> caxis([-10 10]); % obrázok
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
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) |
>> t = 0:pi/50:10*pi; >> plot3(sin(t),cos(t),t); % obrázok
>> [x,y] = meshgrid([-2:0.1:2]); >> z = x.*exp(-x.^2-y.^2); >> plot3(x,y,z); % obrázok
>> 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
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é) |
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 |
>> 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
>> 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
>> z = peaks(25); % vytvorí maticu 25x25 >> waterfall(z); % zobrazenie povrchu vlnami - obrázok >> colormap(pink); % zmena farby (pink) - obrázok
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í |
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ý |
>> 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
>> X = magic(6); % Vytvorenie matice X, matice farebnej palety map >> image(X) % Zobrazenie farebného obrazu % obrázok
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.
[X,MAP] = imread('penguin','bmp');
image(X); % obrázok
axis image; % obrázok
imwrite(X,'penguin.jpg') % Uloženie farebného obrazu
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ť.
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);
>> faktorial(5) 5! = 120
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.
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.
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.
>> C = cell(2,3,2) C(:,:,1) = [] [] [] [] [] [] C(:,:,2) = [] [] [] [] [] []
>> 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]
>> C(1,2,1) ans = [3] >> C(:,2,1) ans = [3] [4] >> C(:,2,2) ans = [ 9] [10]
>> CC = {pi 'Ahoj' magic(3); 5 C 7} CC = [3.1416] 'Ahoj' [3x3 double] [ 5] {2x3x2 cell} [ 7]
>> 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
>> cellplot(CC)
>> 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]
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.
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.
>> student = struct('meno',{'Ján','Jozef','Milan'},'priezvisko', ... {'Novak','Sovak','Liska'},'rocnik',{1,2,5}) student = 1x3 struct array with fields: meno priezvisko rocnik
>> 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
>> student(4).meno = 'Michal'; student = 1x4 struct array with fields: meno priezvisko rocnik >> student(4) ans = meno: 'Michal' priezvisko: [] rocnik: []
% 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
>> 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
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
Ú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.
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));
>> [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
1 vstup = f(čas) |
2 výstup = f(čas) |
3 vstup, výstup = f(čas) |
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:
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).
Označenie jedného objektu:
Označenie viacerých objektov:
Označenie všetkých objektov:
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.
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.
Bloky je možné upravovať aj prostredníctvom menu Format:
Parametre blokov nastavujeme v dialógovom okne, ktoré sa otvorí dvojitým kliknutím (2׼K) na blok.
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
V tejto záložke je možné:
Obr. 2.3. Priebeh stavu a oblasti
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
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
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
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
Spustenie je možné:
Ukončenie je možné:
Prerušenie je možné:
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').
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" ... }
% 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));
>> 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'
Príkazom set_param sa nastavujú parametre simulácie modelu a jeho blokov.
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:
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.
get_param('sys', 'SimulationStatus')
Simulink vráti: 'stopped', 'initializing', 'running', 'paused', 'updating', 'terminating' a 'external' (Real-Time Workshop).
>> 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
>> set_param('sys', 'Solver', 'ode15s', 'StopTime', '3000')
>> set_param('sys/Zosilnenie', 'Gain', '1000')
>> set_param('sys/Zero-Pole','Zeros','[2 4]','Poles','[1 2 3]')
% 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.
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
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.
G1=tf(1,1); G2=tf(1,1); G3=tf(1,1);
disp('koniec predstavenia')
Aby sme mohli uvedené nastavenia aplikovať, musíme nastaviť parametre (callback funkcie) modelu ap11.mdl príkazom set_param.
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í
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.
num = 1 den = [10 1] pocet = 0
Chceme, aby model pri otvorení načítal údaje zo súbora start.m
>> 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.
pocet = pocet + 1; sprintf('Blok bol posunutý %d. krát',pocet)
>> 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.
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".
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.
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....
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.
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.
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:
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".
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) )
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ú.
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
Demoverzia S-funkcie, ktorej výstup je dvojnásobkom jej vstupu (y = 2 * u).
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
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).