Cvičení v matlabu
Ing. Jiří Blahuta, Ph.D.
Cvičení v matlabu
Kapitola obsahuje:
1
PDF
1
Studijní text
Učitel doporučuje studovat od 25. 9. 2023 do 1. 10. 2023.
Kapitola obsahuje:
1
Studijní text
Učitel doporučuje studovat od 2. 10. 2023 do 8. 10. 2023.
Kapitola obsahuje:
1
Studijní text
Učitel doporučuje studovat od 9. 10. 2023 do 15. 10. 2023.
Kapitola obsahuje:
1
Studijní text
Učitel doporučuje studovat od 16. 10. 2023 do 22. 10. 2023.
Kapitola obsahuje:
9
Obrázek
1
Studijní text
Učitel doporučuje studovat od 23. 10. 2023 do 29. 10. 2023.
Kapitola obsahuje:
21
Obrázek
1
Studijní text
Učitel doporučuje studovat od 30. 10. 2023 do 5. 11. 2023.
Kapitola obsahuje:
1
Studijní text
Učitel doporučuje studovat od 6. 11. 2023 do 12. 11. 2023.
Kapitola obsahuje:
1
Studijní text
Učitel doporučuje studovat od 13. 11. 2023 do 19. 11. 2023.
Kapitola obsahuje:
2
Obrázek
1
Studijní text
Učitel doporučuje studovat od 20. 11. 2023 do 26. 11. 2023.
Kapitola obsahuje:
6
Obrázek
1
Studijní text
Učitel doporučuje studovat od 27. 11. 2023 do 3. 12. 2023.
Kapitola obsahuje:
1
Obrázek
1
Studijní text
Učitel doporučuje studovat od 4. 12. 2023 do 10. 12. 2023.
Kapitola obsahuje:
1
Obrázek
1
Studijní text
Učitel doporučuje studovat od 11. 12. 2023 do 17. 12. 2023.

Týden 1

Úvodní hodina předmětu: Software pro vědecké účely

Pozn. v jiných kódech předmětů název: Cvičení v Matlabu 

Cíle předmětu

Cílem předmětu je poskytnout znalosti a praktické dovednosti v programovém prostředí MATLAB jako nástroji pro numerické zpracování a vizualizaci dat. Studenti si osvojí základní syntaxe, příkazy, modelování a práci v GUI prostředí. Naučí se vytvářet skripty, funkce a vytvářet samostatně spustitelné .exe aplikace použitelné v prostředí MS Windows.

Osnova kurzu:

                   1. Úvod do MATLABU, historie, Toolboxy, syntaxe.
  • 2. Uživatelské prostředí, popis prostředí, režimy práce, editace M-souboru.
    3. Proměnné, výrazy a operátory (konstanty, řětezce, operátory, speciální znaky).
    4. Vytváření vlastních aplikací (M-soubory, skripty, uživatelské funkce, krokování fcí a skriptu, řídící příkazy IF-then, for).
    5. Matice, vektory (operace s maticemi, rozklad matice na vlastní hodnoty a vlastní vektory), po-lynomy, matematické funkce.
    6. Funkce pro práci s údaji (zobrazení průběhu funkce), práce s funkcemi.
    7. Grafické prostředí, objekt (vytváření 2D grafu, základní řídící funkce, označení a popis grafu, 3D kreslení).
    8. Kontejnerové datové typy (cell, structure), logické funkce is, subsystémy.
    9. Možnosti importu a exportu dat, konverze, dialogová okna.
    10. Základní pohled na Image Processing Toolbox. ROI based operace.
    11. Návrh GUI v GUIDE a kompilace do EXE spustitelné aplikace.
    12. Další možnosti MATLABU, Simulink, Callback funkce. S-funkce, MEX-soubory.
Literatura
  • Mathworks. Getting Started with MATLABinfo
  • Blahuta, J. Cvičení v Matlabu. Opava, 2012. Opory naleznete v souboru interaktivních osnov.
    matlab_BLAHUTA.pdf
    PDF ke stažení
  • ZAPLATÍLEK K., DOLŇAR B. Matlab pro začátečníky. Praha, 2009. ISBN 978-80-7300-175-6. inf

Web zdroje:

MATLAB Documentation (mathworks.com)

Informace též zde: Základy modelování v MATLABU (osu.cz)

Blog | HUMUSOFT

MATLAB (vscht.cz)

Scilab 


 



Týden 2

Výpočetní prostředí MATLAB

Co je MATLAB?

Matlab je výpočetní prostředí pro maticové operace, technické výpočty a vizualizaci dat. Matlab už po řadu let vyvíjí firma MathWorks a má mnoho uživatelů v běžných operačních systémech (Windows, Unix) po celém světě. Je to jak interaktivní výpočetní systém, který interpretuje příkazy zadané v interaktivním příkazovém, tak programovací jazyk vysoké úrovně, který umožňuje rychlou a jednoduchou implementaci algoritmů.

Podívejme se na manuál, odkaz zde: MATLAB Documentation (mathworks.com)

Týden 3

Režimy práce v MATLABu

Dialogový režim

  • je přístupný v okně Command Window (viz výše)
  • v tomto režimu je možno Matlab používat jako více méně inteligentní kalkulačku s funkcemi
  • napsané výrazy/příkazy se po odeslání (stiskem klávesy ENTER) ihned vyhodnocují/vykonávají
  • umožňuje práci s proměnnými pracovního prostředí (Workspace)

Programový režim

  • slouží pro editaci M-souborů (skriptů nebo uživatelských funkcí, viz lekce 3)
  • je spjat se samostatným oknem Meditoru (= editor M-souborů, kde je barevně zvýrazňována syntaxe příkazů)
  • obsahuje debugger, který umožňuje hledat chyby ve funkcích/skriptech

Grafický režim

  • slouží pro vizualizaci výsledků
  • otevírá samostatná okna s názvem Figure

Proměnná je objekt, který má svůj název, typ a obsah (hodnotu).

Název proměnné

Název proměnné může obsahovat až 31 znaků. Jsou povoleny POUZE tyto znaky: písmena anglické abecedy (a-z, A-Z), číslice (0-9) a podtržítko (_). Číslicí název začínat nesmí.

V názvech jsou rozlišována velká a malá písmena (tzv. vlastnost case-sensitive), tedy proměnná pokus může existovat současně s proměnnou Pokus i třeba poKuS - a každá z nich má svou vlastní hodnotu.

Příklady správných názvů proměnných: aAb89xu1pom4pokus_5matice_Afx.

Příklady chybných názvů proměnných (chyba bývá v tom, že se v názvu použije nepovolený znak - v MATLABu mají znaky jako mezera, čárka, tečka, pomlčka, hvězdička atd. speciální význam!):

1pom ... název nesmí začínat číslicí,
matice A ... název nesmí obsahovat mezeru (toto je velmi častá chyba!!!),
lin.rovnice ... název nesmí obsahovat tečku (toto je také častá chyba!!!),
pokus-5 ... název nesmí obsahovat pomlčku,
f(x) ... název nesmí obsahovat závorky.

Typ a hodnota proměnné

Základní pravidlo zní: KAŽDÁ PROMĚNNÁ JE MATICE. MATLAB tedy nerozlišuje různé typy proměnných. Každá matice může obsahovat jakákoli komplexní čísla. Občas se setkáme s maticemi složenými ze znaků (= texty, chybová hlášení).

Z hlediska rozměrů matic rozlišujeme proměnné na

  • matice (mxn, kde m>1, n>1)
  • vektory (mx1 nebo 1xn)
  • skaláry (1x1, tedy jen jedno číslo)

Vytvoření proměnné

Pro vytvoření proměnné se používá přiřazovací příkaz:
>> název_proměnné = výraz.

Výrazy jsou popsány níže. Ukážeme si jednoduché příklady vytvoření proměnných, kdy je použit nejjednodušší výraz - konstanta.

Příklad: vytvoření skaláru:
>> a=8
>> pom=-2.145
>> skalar8=15e-2

  • Desetinná čísla zadáváme s desetinnou tečkou (ne čárkou!) nebo pomocí zlomku: 8.14   -0.0002   13/100. Pokud je před desetinnou tečkou jenom nula, lze ji vynechat: .52
  • Čísla lze zadávat také ve vědeckém formátu (s použitím písmena e pro označení exponentu 10e): 1.6e11   6.122e-8
  • Imaginární čísla zadáváme s použitím i anebo j (viz předdefinované proměnné): 12i   -6.11j
    Např. komplexní číslo 8+0.00032i zadáme jako 8+3.2e-4i

Vytvoření vektoru nebo matice: matice mxn vytváříme pomocí hranatých závorek, v nichž uvedeme jednotlivé řádky oddělené středníkem, přičemž prvky každého řádku (tj. sloupce) oddělujeme mezerou nebo čárkou (lze použít i obě najednou).
!!! Počty prvků v každém řádku se musejí shodovat, tj. nesmí se stát, že např. některý řádek má méně prvků než ostatní !!!
!!! Čárka neslouží jako desetinná čárka (na to je tečka), ale jako oddělovač prvků !!!

Příklad: vytvoření řádkového vektoru:
>> v1=[2 0.1 -3.7 4/5 0.14]   nebo
>> u1=[2,0.1, -3.7, 4/5,0.14]

Příklad: vytvoření sloupcového vektoru:
>> v2=[2; 0.1; -3.7; 4/5; 0.14]

Příklad: vytvoření matice 3x2:
>> maticeA=[1 2; 0.1 -3; .7 1/4]

Poznámky: přiřazovací příkaz také slouží ke změně hodnoty již existující proměnné, např. >> u1=[1 -3 2].

Zobrazení hodnoty proměnné

Chceme-li zjistit obsah proměnné (= její hodnotu), můžeme použít buď okno Workspace (dvojklik), anebo v dialogovém režimu napíšeme název proměnné:
>> název_proměnné
Příklad:
>> maticeA
>> a

Smazání proměnné

Co s proměnnými, které už nechceme používat? Lze je smazat s použitím okna Workspace, resp. pomocí příkazu clear.
>> clear název_proměnné   - smaže vybranou proměnnou
>> clear název_proměnné1 název_proměnné2 název_proměnnéN   - smaže vybrané proměnné (jejich názvy od sebe oddělujeme mezerou)
>> clear   - smaže všechny proměnné z Workspace.

Příklad:
>> clear b a   (smaže proměnnou b a proměnnou a)
>> clear   (smaže všechny proměnné)

!!! Neuvedeme-li seznam proměnných, smažou se všechny! Smazané proměnné nelze obnovit (pokud nebyly uloženy na disk - viz níže) !!!

Předdefinované proměnné

Některé proměnné jsou již definované - patří mezi ně eps (malé reálné číslo, 10-16ij (komplexní jednotka) a pi (Ludolfovo číslo). Tyto proměnné lze samozřejmě použít i pro uchování jiných hodnot (tím se předdefinovaná hodnota zničí), ale po použití příkazu >>clear i (resp. >>clear) jsou vráceny do původního stavu.
Příklad:
>> i
>> i=7
>> clear i
>> i

Proměnná ans

Proměnná ans je vytvářena automaticky, pokud některý z příkazů potřebuje vypsat hodnotu, kterou jsme nepřiřadili do žádné proměnné. Proměnná ans tedy obsahuje poslední zobrazenou nepojmenovanou hodnotu.
Příklad: pokud proměnná ans neexistovala, vytvoří se po vyhodnocení příkazu >> 2*3-5. Pokud proměnná ans již existovala, tak se změní její hodnota.

Uložení proměnných (na disk)

Někdy se stane, že potřebujeme uchovat nějakou důležitou proměnnou pro použití při příštím spuštění MATLABu (např. musíme přerušit práci). Potřebujeme tedy proměnnou dostat z paměti na disk počítače. K tomu slouží příkaz save:
>> save jméno_souboru název_proměnné   - do zadaného souboru se uloží vybraná proměnná,
>> save jméno_souboru název_proměnné1 název_proměnné2 název_proměnnéN   - do zadaného souboru se uloží N vybraných proměnných (jejich názvy od sebe oddělujeme mezerou),
>> save jméno_souboru   - do zadaného souboru se uloží všechny proměnné z Workspace.

Ve všech případech je vytvořen soubor s příponou MAT (ta je přidána automaticky), který obsahuje názvy a hodnoty vybraných proměnných.

Příklad: uložení dvou proměnných a a maticeA do souboru 'pokus.mat':
>> save pokus a maticeA   (soubor 'pokus.mat' vznikne v pracovním adresáři)

Poznámka: příkaz save má širší možnosti - viz >> help save.

Nahrání proměnné (z MAT-souboru)

Je-li na disku nějaký soubor s uloženou jednou nebo více proměnnými (vznikl pomocí save), lze tyto proměnné dostat do pracovního prostředí MATLABu pomocí příkazu
>> load název_souboru
(u názvu souboru můžeme vynechat jeho příponu MAT).

Příklad:
>> clear
>> load pokus
.

Poznámka: i příkaz load má širší možnosti - viz >> help load.

Týden 4

Výraz, příkazy

Výraz

Výraz je posloupnost konstant, názvů proměnných, operátorů (včetně kulatých závorek - viz lekce 2) a volání funkcí (viz lekce 3).

Pokud je výraz smysluplný (MATLABem vyhodnotitelný), tak po jeho napsání a stisku klávesy ENTER je výraz ihned vyhodnocen. Vyhodnocením výrazu vzniká vždy nějaká hodnota.

Výslednou hodnotu výrazu můžeme odebrat (uložit do nějaké proměnné - viz přiřazovací příkaz), jinak je uložena do proměnné ans (viz výše) a zobrazena, například:

>> 3+2*0.5
ans =
        4

Pokud nepotřebujeme vypočtenou hodnotu vidět, lze její zobrazení potlačit - za výrazem napíšeme středník. Středník tedy slouží (kromě oddělení řádků matice) také k potlačení výpisu výsledku výrazu. Obvykle se při potlačeném výpisu výsledku používá přiřazení hodnoty výrazu do nějaké proměnné, protože jinak vypočtená hodnota zanikne. Proměnná vytvořená přiřazením s potlačeným výpisem samozřejmě vznikne ve Workspace. Typicky tedy píšeme:
>> proměnná=výraz;

Příklad:

výraz  odebrání hodnoty?    zobrazení výsledku?    vznik (změna) ans?  
>> b = 5*a+3anoanone
>> 5*a+3neanoano
>> b = 5*a+3;  nenene
>> 5*a+3;nenene

Poznámka: poslední případ je k ničemu, protože výraz se sice vyhodnotí, ale jeho výsledek se nikdo nedozví.

Další příklady výrazů naleznete v lekci 2 (za přehledem operátorů).


Příkaz

Pokud napíšeme a odešleme nějaký výraz ke zpracování, MATLAB ho bere v podstatě jako příkaz k nějaké činnosti (vyhodnocení výrazu). Kromě odeslání výrazů však existuje spousta "čistokrevných" příkazů, např. příkaz přiřazovací. S ostatními se seznámíme v dalších lekcích. Zde je základní přehled:

  • přiřazovací příkaz (=), jehož syntaxe je
    >> název_proměnné = výraz
  • podmíněný příkaz, větvení (if) - viz lekce 2
  • přepínač (switch)
  • cyklus neboli smyčka (forwhile)

Dále MATLAB obsahuje příkazy pro:

  • práci s adresářem (např. cddir)
  • práci s proměnnými (např. saveloadclear)
  • ...

Jeden příkaz na více řádků

Někdy se stane, že potřebujeme napsat jeden příkaz na více řádků. K tomu účelu použijeme tři tečky. Tři tečky se zvýrazňují modře a znamenají, že MATLAB má počkat s provedením příkazu, protože ještě není celý. Pokud MATLAB čeká na dokončení příkazu, tak příkazový řádek nezačíná >>.

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

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

Potlačení výpisu výsledku

Některé příkazy vypisují své výsledky (např. >> x = 215). Pokud nepotřebujeme tyto výsledky vidět, lze potlačit výpis výsledků příkazu (stejně jako u výrazů) napsáním středníku na konec příkazu (>> x = 215;).

Násilné ukončení příkazu (CTRL+C)

Příkaz, který se právě provádí, násilím ukončíme pomocí stisku CTRL+C. Většinou se CTRL+C používá, pokud jsme "vyrobili" nekonečný cyklus nebo jsme zapomněli na středník a necháváme vypisovat příliš velké matice.

Více příkazů na jednom řádku

Doposud jsme příkazy ukončovali vždy pomocí klávesy ENTER, která zároveň odeslala příkaz ke zpracování. Občas ale chceme odeslat ke zpracování více příkazů najednou. Tehdy můžeme použít buď M-soubory, anebo zápis více příkazů na jeden řádek, přičemž k odělení jednotlivých příkazů se používá čárka nebo středník (čárka jen odděluje příkazy, středník navíc potačuje výpis jejich výsledků).
Příklad:
>> m=8, n=3; vysledek=3*m+0.5*n


Komentáře (poznámky)

Komentáře slouží většinou k vysvětlení významu jednotlivých příkazů, skriptů nebo funkcí. Je velmi vhodné je používat (ať už kvůli vlastní skleróze nebo kvůli kolegům, se kterými budete případné výsledky své práce sdílet). Komentáře u uživatelských funkcí navíc slouží jako nápověda, kterou umí MATLAB zobrazovat např. příkazem >>help název.

Komenář začíná znakem % (procento) a končí spolu s koncem řádku. Text komentáře bývá označen zeleně (pokud jste si nezvolili jinou barvu).

Všechny komentáře jsou MATLABem ignorovány, tj. nejsou vyhodnocovány.

Příklad:
>> x = [125/100 0.9-9]; % vytvoreni vektoru x s hodnotami 1.25 a -8.1, bez vypisu

Týden 5

Operátory

S tím, že v MATLABu je všechno chápáno jako matice, souvisí chování operátorů. Připravme si proměnné, na kterých budeme zkoumat chování operátorů:
>> A = [1 2; 3 0; 4 -1]
>> B = [0 1 1 1; 1 0 -1 2; 0 0 1 5]
>> C = [1 2 5 0; 1 1 0 3]
>> u = [0 3 -2]
>> D = [1 0; 2 0; 3 1]
>> E = [1 0 0; 0 2 0; 0 0 3]
>> F = [1 1 1; 2 2 2; 1 2 3]
>> G = [3+i -2+i; 1.5+i -3.1-i]

V části "vyzkoušejte" jsou uvedeny ukázky, přičemž chybné výrazy jsou označené >>.

1) Aritmetické operátory

a) unární


názevsyntaxepopisvyzkoušejte 
unární plus+a1- výsledek je shodný s a1>> +u
unární minus-a1- výsledek je téhož rozměru jako a1 a obsahuje opačná čísla>> -u
transpozice a konjugovanosta1'- výsledkem je transponovaná matice, přičemž všechna komplexní čísla změní znaménko imaginární části (na opačné)
- u reálných matic funguje stejně jako .'
>> G'
>> B'
transpozicea1.'- výsledkem je transponovaná matice (oproti ' nemění komplexní prvky znaménko imaginární části)>> G.'
>> B.'

b) binární


názevsyntaxepopisvyzkoušejte 
sčítánía1+a2- provádí se po prvcích
- argumety musí mít SHODNÉ rozměry nebo alespoň jeden z nich je skalár
- prvky výsledku jsou součtem/rozdílem odpovídajících si prvků a1 a a2 (skalár je automaticky doplněn na rozměr druhého argumentu)
>> A+D
>> 25+B
>> u+A
odčítánía1-a2>> u-2.1
>> A-D
>> u-F
 
násobení matica1*a2- jedná se o algebraické násobení matic, a proto počet sloupců a1 musí být shodný s počtem řádků a2 (tj. mxp a pxn). Pak výsledek C=A*B má rozměr mxn a každý jeho prvek je >> A*E
>> u*E
>> D*A
>> D*G
- jedním z argumentů může být skalár (druhým libovolná matice, vektor či skalár). Pak se jedná o algebraické násobení matice/vektoru číslem a platí: C = A*a = a*A = a.*A = A.*a, kde >> C*5
>> 4.2*u
>> 3.*u
>> 5*37
násobení po prvcícha1.*a2
- pokud žádný z argumentů není skalár, jedná se o násobení odpovídajících si prvků matic/vektorů. Provádí se po prvcích, proto oba argumenty musí mít SHODNÉ rozměry. Výsledek obsahuje prvky >> A.*E
>> u.*E
>> D.*A
>> D.*G
 
umocnění maticea1^a2- pokud jsou oba argumenty skaláry, jde o a2-tou mocninu čísla a1 (viz níže)
- pokud je a1 matice a a2 kladné celé číslo (skalár), platí: a1^a2 = a1*a1*...*a1 (násobení matic!), tedy a1 musí být čtvercová matice
poznámka: operace neoznámí chybu, pokud alespoň jeden z argumentů je skalár (jak se počítá výsledek pro matici a1 a jakékoli číslo a2 nebo pro skalár a1 a matici a2, to naleznete v nápovědě)
>> F^2
>> G^4
>> D^3
>> A^D
>> 5^E
- jsou-li oba argumenty skaláry, je výsledkem číslo a1a2 a není rozdíl mezi a1^a2 a a1.^a2, tedy pro SKALÁRY není rozdíl mezi .^ a ^>> 2^3
>> 2.^3
>> 9^0.5
umocnění po prvcícha1.^a2
- provádí se po prvcích, a proto oba argumenty musí mít SHODNÉ rozměry nebo alespoň jeden z nich je skalár (pro právě dva skaláry je výsledek popsán výše)
- výsledek má stejný rozměr jako argument, který není skalárem. Tedy  nebo  nebo 
>> F.^2
>> G.^4
>> D.^3
>> A.^D
>> A.^E
>> 5.^E
 
dělení matica1/a2- zhruba platí, že A/B = A*inv(B) (inv značí inverzní matici), tedy druhým argumentem by měla být regulární matice odpovídajícího rozměru (či skalár). Přesně je A/B=(B'\A')'
- druhým argumentem může být i skalár - viz níže
>> u/E
>> u/F
>> A/D
- je-li druhý argument skalár, jedná se o dělení všech prvků a1 číslem a2
- jsou-li oba argumenty skaláry, jde o dělení dvou čísel
- v obou případech není rozdíl mezi / a ./
>> A/3
>> A./3
>> 2/5
>> 2./5
dělení po prvcícha1./a2
- provádí se po prvcích
- argumentem jsou matice STEJNÝCH rozměrů (nebo alespoň jeden je skalár - viz výše)
- výsledek C=A./B obsahuje prvky 
>> A./D
>> D./A
>> u./F
>> A./E
 
dělení matic zlevaa1\a2- pokud je prvním argumentem čtvercová matice, pak je výsledek A\B stejný jako inv(A)*B
- je-li argumentem čtvercová matice A a sloupcový vektor b, pak se operátor používá pro řešení soustav lineárních rovnic, kdy řešení je x=A\b (při výpočtu se používá Gaussova eliminace)
poznámka: operátor lze použít i tehdy, když a1 není čtvercovou maticí - více naleznete v nápovědě
>> b=u'
>> E\b
- je-li prvním argumentem skalár, jedná se o dělení všech prvků a2 číslem a1
- jsou-li oba argumenty skaláry, jde o dělení čísla a2 číslem a1
- v obou případech není rozdíl mezi \ a .\ a platí a1\a2 = a2/a1
>> 3\A
>> 3.\A
>> 5\2
>> 5.\2
dělení po prvcích zlevaa1.\a2
- provádí se po prvcích
- argumentem jsou matice STEJNÝCH rozměrů (nebo alespoň jeden je skalár - viz výše)
- výsledek C=A.\B obsahuje prvky 
- jsou-li oba argumenty skaláry, není rozdíl mezi .\ a \
>> D.\A
>> A.\D
>> F.\u
>> E.\A

!!! POZOR u čtvercových matic !!!
Pro čtvercové matice většina operátorů funguje, aniž by MATLAB hlásil chybné rozměry matic. Proto je potřeba dávat si u těchto matic velký pozor na to, zda chceme provést operaci maticovou, anebo po prvcích. Výsledky jsou obecně odlišné!
Porovnejte např. výsledky následujících výrazů:
>> E*F
>> E.*F
>> F^3
>> F.^3

c) dvojtečka


názevsyntaxepopisvyzkoušejte 
vytváření aritmetických posloupnostíi:k:j
i:j
- všechny argumenty musí být SKALÁRY
- vytvoří aritmetickou posloupnost od i do j s krokem k, tj. [i i+k i+2k ... j] (v případě, že (j-i)/k není celé číslo, tak poslední člen není j, ale číslo menší (maximálně o k-1))
- není-li k použito, je krok automaticky volen jako jedna, tedy i:j generuje posloupnost [i i+1 i+2 ... j]
- je-li krok zvolen chybně (nelze se od i dostat k j), pak je výsledkem prázdná matice
>> 1:3:10
>> 1:5:20
>> 1:-3:4
>> 1:20
>> -3:3
>> 2:-2


2) Relační operátory

názevsyntaxepopisvyzkoušejte 
menšía1<a2- provádějí se po prvcích
- argumenty musí mít STEJNÉ rozměry nebo alespoň jeden z nich je skalár
- výsledek má rozměr jako neskalární argument (nebo je to skalár)
- výsledek obsahuje pouze nuly (nepravda, false) a jedničky (pravda, true) podle toho, zda je příslušná relace mezi argumenty pravdivá
- pokud je jeden z argumentů skalár, porovnává se s ním každý prvek druhého argumentu
>> A<3
>> -1<3.2
>> -1>3.2
>> B<=1.5
>> A>D
>> 5<u
>> B~=1
>> A<=E
>> u<=C
menší nebo rovnoa1<=a2
většía1>a2
větší nebo rovnoa1>=a2
rovnost (je rovno?)a1==a2
nerovnost (je různé?)a1~=a2

!!! POZOR: je velký rozdíl mezi == a = !!!

  • v případě x==5 jde o výraz, jehož hodnotou je 0 nebo 1 (porovnání x s číslem 5) a x se nemění, zatímco
  • v případě x=5 jde o přiřazení (příkaz), které nevrací hodnotu, nýbrž změní obsah proměnné x!!!


3) Logické operátory

a) unární


názevsyntaxepopisvyzkoušejte 
negace~a1- aplikuje se na každý prvek a1
- výsledek má rozměr jako a1
- výsledek obsahuje pouze nuly a jedničky (viz tabulka negace)
>> ~3.125
>> ~0
>> ~-1.2
>> ~B


negace
a1  ~a1  
  nenulové  0
01

b) binární


názevsyntaxepopisvyzkoušejte 
logický součin, ANDa1&a2- provádějí se po prvcích
- argumenty musí mít STEJNÉ rozměry nebo alespoň jeden z nich je skalár
- výsledek má rozměr jako neskalární argument (nebo je to skalár)
- výsledek obsahuje pouze nuly a jedničky (viz tabulka logického součinu a součtu)
>> A&D
>> E&1
>> 2&5
>> u&F
logický součet, ORa1|a2>> A|D
>> u|1
>> -1|3.2
>> C|u


logický součin a součet
a1a2  a1&a2    a1|a2  
  nenulové    nenulové  11
  nenulové  001
0  nenulové  01
0000


Priorita operátorů

Pořadí, v jakém se budou jednotlivé části výrazu vyhodnocovat, můžeme podle potřeby zadat tím, že použijeme kulaté závorky pro ohraničení všech potřebných částí výrazu. Protože každý z výše uvedených operátorů má pevně dané pořadí vyhodnocování, není někdy závorek potřeba. Proto si nyní uvedeme pořadí vyhodnocování (prioritu) operátorů. Operátory v tabulce jsou seřazeny shora dolů podle klesající priority (tj. ty nejnižší se vyhodnocují nejpozději).

 symbolpoznámka
1.()závorky
2..' .^ ' ^transpozice, umocnění, transpozice+konjugovanost, maticové umocnění
3.+ - ~unární plus, unární minus, negace
4..* ./ .\ * / \násobení po prvcích, dělení po prvcích, dělení po prvcích zleva,
násobení matic, dělení matic, dělení matic zleva
5.+ -sčítání, odčítání
6.:dvojtečka
7.< <= > >= == ~=relační operátory
8.&logický součin, AND
9.|logický součet, OR


Příklad:
výsledky jsou uvedeny pro a=-2; b=2; c=1.5 (protože se jedná o skaláry, tak není nutné používat operátory s tečkou):

výrazzápis v MATLABuvýsledek (zaokr. na 4 des. místa)
  >> a+3*b^2/-a^3+2*c-11.5
>> (a+3*b^2)/(-a^3+2*c)-1-0.0909
>> (a+3)*b^2/(-a^3+2*c)-1-0.6364
>> (a+3*b)^2/((-a^3+2)*c)-10.0667


Týden 6

Řetězce

Řetězce neboli pole znaků, (anglicky character arrays nebo strings) jsou v podstatě vektory, které obsahují znaky anglické abecedy. Nedoporučuje se používat české znaky obsahující háčky nebo čárky, protože bývá problém s jejich správným zobrazováním.

Vytváření řetězců

Pro vytvoření řetězce slouží apostrofy, do kterých se vepíše obsah řetězce (například 'ahoj' nebo 'Toto je nejaky dlouhy text.'), přičemž takto vytvořený řetězec můžeme uložit do proměnné:
>> s1 = 'nejaky text';
>> nazev = 'Vypocetni technika 2'

Ve workspace se řetězec objeví jako proměnná typu char array (doposud jsme znali jen čísla - double array).

Poznámka: řetězce lze ukládat i do matic, ale je nutné, aby všechny řádky (= řetězce) měly stejnou délku! Doplňuje se většinou mezerami, tedy:
>> jmena=['Ivan '; 'Jana '; 'Ludva'; 'Eva '; 'Pepa '];

Výpis řetězců

Pokud máme řetězec uložený v nějaké proměnné, můžeme jej vypsat úplně stejným způsobem jako obsah kterékoli číselné proměnné, tedy zadáním jména proměnné (například >> s1).

Existují také funkce, které vypisují zadaný řetězec, a to funkce disp(p1), která má jeden parametr (je označen jako p1). Parametrem může být text nebo název proměnné:
>> disp('ahoj')
>> disp(s1)

a funkce error(p1), jejímž parametrem je chybové hlášení (vypisuje se červeně). Tato funkce navíc ukončuje provádění aktuálního příkazu (proto se používá uvnitř funkcí a skriptů).

Poznámka: práce s řetězci
Jelikož je řetězec vektor složený ze znaků, můžeme s ním pracovat znak po znaku. Jinou možností je využít knihovních funkcí MATLABu, které nabízejí porovnávání řetězců (např. funkce strcmp), převod na velká nebo malá písmena (upper a lower), konverze řetězců na čísla a naopak (např. str2num a num2str),... Více se můžete dozvědět z nápovědy k jednotlivým funkcím - jejich přehled získáte příkazem >> help strfun.



Podmíněný příkaz (větvení)

Občas potřebujeme, aby se určité příkazy vykonaly jen a pouze v případě, kdy je splněna nějaká podmínka. Bylo by tedy dobré znát nějaký příkaz, který umožňuje podmínku vyhodnotit (otestovat), a podle její pravdivosti pak vykoná (nebo nevykoná) zadanou množinu příkazů. V MATLABu máme k dispozici příkaz if. Jeho základní syntaxe je:

if podmínka
   příkazy
end

Příkaz začíná klíčovým slovem if, za nímž následuje podmínka - to je libovolný výraz s logickou hodnotou 0 nebo 1 (většinou se v podmínkách používají relační nebo binární logické operátory). Uvnitř ifu jsou jakékoli příkazy, které se mají provádět v případě splnění podmínky. Protože příkazů uvnitř ifu může být více, tak za posledním z nich musíme uvést klíčové slovo end, které označuje konec celého příkazu.

Činnost příkazu if: nejprve se testuje podmínka (tj. vypočítá se hodnota výrazu) a v případě, že podmínka platí (je pravdivá; tj. výraz má logickou hodnotu 1, neboli je nenulový), jsou provedeny příkazy uvnitř ifu. V opačném případě, kdy podmínka neplatí (není splněna, tj. výraz má logickou hodnotu 0, tj.je nulový), příkazy uvnitř ifu jsou ignorovány a pokračuje se až za koncem příkazu if (pokud jsou za ním nějaké další příkazy). Činnost příkazu demonstruje vývojový diagram:

if podmínka
   příkazy
end

Poznámky:

  • V případě, že součástí podmínky je matice typu mxn, je podmínka pravdivá jen tehdy, pokud je pravdivá pro všechny prvky této matice.
  • V případě, že v nějaké podmínce použijeme binární logický operátor (& nebo |) a po vyhodnocení prvního argumentu je už zřejmý výsledek (kdy se to může stát?), tak se druhý argument nevyhodnocuje. Tato vlastnost se nazývá zkrácené vyhodnocování.
  • Jednotlivé příkazy if se mohou vnořovat, tj. uvnitř ifu může být další příkaz if.

  • Příklad 1 - chtěli bychom vypsat gratulaci jen v tom případě, kdy žák bude mít jedničku. Vyzkoušíme si to nejprve pro trojku, tedy v Command Window zadáváme:
    >> znamka=3;
    >> if znamka==1
    zprava='Gratuluji! Lepsi to byt nemohlo!'
    end

    Všimněte si:
    - po zadání části příkazu if MATLAB čeká na jeho dokončení (nevypisují se znaky >>)
    - protože proměnná znamka neobsahovala číslo 1, tak podmínka neplatí - proto se proměnná zprava nevytvořila.
    Nevýhoda:
    pokud bychom chtěli vyzkoušet stejný příkaz pro jinou známku, musíme všechno napsat znovu, přičemž první příkaz opravíme na >> znamka=1;. Je vidět, že práce v Command Window se v případě složených příkazů stává neefektivní. Máme sice možnost napsat celý if na jeden řádek (příkazy od sebe musíme oddělit - čárkou nebo středníkem), ale tím si celou situaci znepřehledníme:
    >> znamka=1; if znamka==1; zprava='Gratuluji! Lepsi to byt nemohlo!', end
    Proto se v dnešní lekci naučíme vytvářet skripty (soubory s posloupností příkazů) a funkce (soubory se specifickou strukturou, které mohou zpracovávat vstupní parametry). Následující příklady budou psány tak, jako kdyby se vyskytovaly uvnitř skriptu nebo funkce.


    Příklad 2 - v případě, že proměnná a je menší než pět, vypíšeme zprávu, jinak se nic neprovede:

    if a < 5
       disp('cislo 'a' je mensi nez 5')
    end
    


    Pro případ, kdy potřebujeme provést nějaké příkazy v případě platnosti podmínky, ale jiné příkazy v případě její neplatnosti, můžeme použít větev else:

    if podmínka1
       příkazy1
    else
       příkazy2
    end
    
    Činnost příkazu if-else: nejprve se testuje podmínka - je-li pravdivá, provedou se příkazy1, je-li nepravdivá, provedou se příkazy2. Vždycky se tedy provede jedna skupina příkazů.


    Příklad 3 - v případě, že proměnná a je menší než pět, vypíšeme zprávu " a="" je="" mensi",="" jinak="" se="" vypise="" "a="" vetsi="" nebo="" rovno":

    if a < 5
       disp('cislo 'a' je mensi nez 5')
    else
       disp('cislo 'a' je vetsi nebo rovno 5')
    end
    


    Z příkladu 3 je vidět, že někdy by bylo vhodné v případě neplatnosti podmínky testovat také jiné možnosti. Ke splnění tohoto cíle stačí vnořit další příkaz if do větve else, ale existuje pohodlnější prostředek - rozšířená syntaxe příkazu if:

    if podmínka1
       příkazy1
    elseif podmínka2
       příkazy2
    else
       příkazy3
    end
    
         
    • větev if musí být právě jedna
    • větev elseif nemusí být vůbec, případně jich může být více
    • větev else může být nanejvýš jedna
    Činnost příkazu if obecně: nejprve se testuje pravdivost podmínky1. Pokud platí, provedou se příkazy1 a ostatní větve příkazu jsou ignorovány. Pokud podmínka1 neplatila, začne se testovat podmínka2 - když platí, provedou se příkazy2 a zbylé větve jsou ignorovány; neplatí-li, pokračuje se další větví elseif (je-li ještě nějaká)... V případě, že ani jedna z podmínek neplatila, jsou provedeny příkazy ve větvi else (je-li přítomna).
    Činnost příkazu demonstruje vývojový diagram:
    činnost></center><p></p><p><b>Příklad 4</b><span> </span>- chceme rozhodovat o poloze hodnoty proměnné<span> </span><code>a</code><span> </span>vzhledem k číslu 5:<br></p><pre>if a < 8
   disp('a je mensi nez 5')
elseif a > 8
   disp('a je vetsi nez 5')
elseif a == 8
   disp('a je rovno 5')
else
   error('Nedefinovaná situace!')
end
</pre><p></p><br><a name=

    M-soubory

    M-soubory slouží k ukládání posloupností příkazů (skripty) nebo k ukládání uživatelských funkcí (funkce).

    Poznámka: M-soubory jsou obyčejné textové soubory, a proto je lze psát i v libovolném textovém editoru. Z důvodu vyššího komfortu (zvýraznění syntaxe, možnost krokování) je však součástí MATLABu také M-editor/Debugger, který se otevírá v samostatném okně po otevření nebo vytvoření M-souboru (skriptu či funkce).

    M-editor

    M-editor/Debugger je spuštěn v samostatném okně po otevření (File--Open) nebo vytvoření (File--New--M-file) M-souboru. Slouží k pohodlné editaci M-souborů. Navíc umožňuje krokovat obsah M-souborů (tj. kontrolovat provádění jejich jednotlivých příkazů).

    M-editor/Debugger
    Obr.1: okno M-editoru

    Skripty

    Skript je posloupnost příkazů uložených do souboru. Každý skript pracuje s proměnnými pracovního prostředí, takže může vytvářet nové nebo mazat či měnit vybrané. Výsledky skriptu tedy zůstávají v pracovním prostředí i po jeho skončení. Skripty samozřejmě mohou volat jiné skripty nebo funkce, vytvářet grafická okna, vypisovat do Command Window,...

    Poznámka: V době psaní skriptu se jeho příkazy samozřejmě neprovádějí - k tomu potřebujeme spustit skript v Command Window (viz Spuštění skriptu).

    Vytvoření skriptu

    1. Nejprve si v MATLABu nastavíme pracovní adresář (na lokálním disku).
    2. Vytvoření nového nebo otevření existujícího skriptu
      M-soubor, který bude obsahovat skript, vytvoříme například pomocí menu File--New--M-file, čímž se také otevře okno M-editoru/Debuggeru. Pokud chceme opravit již existující skript, musíme jej otevřít (například pomocí menu File--Open).
    3. Zápis skriptu
      Do prázdného M-souboru zapíšeme všechny příkazy, které má skript provést - příkazy píšeme stejně jako v Command Window, jen s tím rozdílem, že se po napsání neprovádějí. Takto vytvoříme kód skriptu (posloupnost příkazů).
    4. Uložení skriptu
      Máme-li napsaný kód skriptu, musíme celý M-soubor uložit pod nějakým jménem na disk (do pracovního adresáře). Uložení provedeme pomocí menu File--Save, kde zkontrolujeme pracovní adresář a zadáme jméno skriptu:
      jméno skriptu musí splňovat stejná pravidla jako název proměnné, přestože se jedná o jméno souboru. Je to z toho důvodu, aby MATLAB mohl skript spustit (viz níže). Jméno M-souboru se skriptem tedy může obsahovat POUZE písmena anglické abecedy, podtržítko a číslice (číslicí nesmí začínat)!!!

    Spuštění skriptu

    Spuštění skriptu dává MATLABu pokyn k vykonání jeho příkazů. Před spuštěním musí být skript uložen! Skript můžeme spustit buď

    1. v Command Window - stačí zadat jméno M-souboru bez přípony (>> jméno, tj. skript graf1.m spustíme příkazem >> graf1), anebo
    2. v M-editoru/Debuggeru pomocí menu Debug--Run (klávesa F5).

    Příklad - vytvoříme skript parabola.m, který kreslí graf funkce x2:

    parabola.m
    % GRAF1 - vykresleni paraboly
    x = -3:0.1:3; % vektor hodnot z intervalu [-3;3] s krokem 0,1
    y = x.^2; % zavisle promenna
    plot(x,y) % graf (parabola)
    ...uložíme jej a spustíme příkazem
    >> parabola
    ...pokud je vše v pořádku, objeví se okno s grafem. V opačném případě musíme najít a opravit chybu, uložit soubor a znovu jej spustit.


    Zobrazení obsahu skriptu v Command Window

    Obsah skriptu (M-souboru) vidíme v M-editoru/Debuggeru, ale můžeme jej zobrazit také v Command Window příkazem >> type název, kde název je jméno skriptu (název M-souboru bez přípony).


    Uživatelské funkce

    Máme-li používat jeden určitý postup (algoritmus) pro vícero různých situací (např. pro různé hodnoty proměnných), není zrovna praktické používat skripty, neboť pokaždé musíme opravit hodnoty proměnných ve skriptu, uložit příslušný M-soubor a skript spustit. Řešení nabízejí funkce.

    Funkce jsou M-soubory, které mají přesně definovanou strukturu (viz Vytvoření funkce). Funkce akceptují vstupní parametry, které mohou mít při každém spuštění jinou hodnotu.

    Každá funkce má své vlastní pracovní prostředí, které je odděleno od pracovního prostředí Command Window. Všechny proměnné ve funkci jsou lokální (existují jen po dobu spuštění funkce)! To znamená, že:

    • nemůžeme použít žádné jiné proměnné než ty, které funkci předáváme (pomocí vstupních parametrů), nebo ty, které si funkce sama vytvoří,
    • všechny proměnné (i ty, které obsahují vypočtené výsledky) po skončení funkce zaniknou.
    Naštěstí existuje způsob, kterým funkce může své výsledky předat "ven": výstupní proměnné. Počet vstupních i výstupních parametrů funkce se určuje při jejím vytváření. Pokud funkce nemá žádné vstupní parametry, můžeme její příkazy napsat také jako skript.

    Vytvoření funkce

    1. Nejprve si v MATLABu nastavíme pracovní adresář (na lokálním disku).
    2. Otevření M-souboru
      Funkce je M-soubor, a proto si nejprve musíme otevřít nový soubor: například pomocí menu File--New--M-file. Tím se otevře okno M-editoru/Debuggeru s prázdným souborem.
      Poznámka: pokud chceme nějakou existující funkci opravit, použijeme menu File--Open.
    3. Zápis funkce (struktura M-souboru obsahujícího funkci)
      První řádek obsahuje definici funkce, po něm mohou následovat řádky s nápovědou k funkci (komentáře) a zbytek souboru tvoří příkazy (kód funkce, algoritmus) potřebné k výpočtu výstupů funkce za použití jejích vstupů.
      • Definice funkce

        tvoří první řádek M-souboru. Má tvar:
        function[výstupy]=jmeno_funkce(vstupy)
        ||||
        klíčové slovovýstupy
        funkce
        název
        funkce
        vstupní
        parametry
        funkce
        výstupy:
        • je-li jich víc, oddělují se čárkou
        • je-li jen jeden, závorky nejsou nutné
        • funkce nemusí mít žádný výstup
        jmeno_funkce:
        • název funkce by měl vystihovat její činnost
        • musí splnit pravidla pro název proměnné, jinak se funkci nepodaří spustit!
        • název funkce se nesmí shodovat s žádným názvem její proměnné!
        vstupy:
        • je-li jich víc, oddělují se čárkou
        • funkce nemusí mít žádný vstup (pak se podobá skriptu, ale má své lokální workspace!)

        Příklady definic funkcí:
        function [s]=soucet(a,b) - funkce s jedním výstupem a dvěma vstupy
        function[podil,zbytek]=deleni(delenec,delitel) - funkce se dvěma vstupy i výstupy
        function f=faktorial(n) - funkce s jedním výstupem i vstupem
        function graf(x,y) - funkce bez výstupu, s jedním vstupem

      • Nápověda k funkci

        není povinnou součástí funkce, ale měla by být vytvořena, protože usnadňuje používání dané funkce. Nápověda k funkci začíná druhým řádkem, pokud je tento řádek komentářem. Nápověda k funkci končí jakýmkoli řádkem, který již není komentářem (tj. i třeba prázdným řádkem).
        Pokud je v M-souboru funkce obsažena nápověda, zobrazíme ji příkazem >> help jméno_funkce, stejně jako nápovědu ke knihovním funkcím MATLABu.

        První řádek nápovědy (anglicky zvaný H1 line) by měl obsahovat jméno funkce a vystihovat její činnost, protože je vypisován příkazem >> lookfor slovo (slouží pro výpis všech funkcí obsahujících dané slovo) nebo při výpisu nápovědy k funkcím nějakého adresáře >> help adresář (například >> help C:\temp\matlab).
        Další řádky nápovědy by měly obsahovat popis vstupů a výstupů funkce a také příklad jejího použití (volání).
      • Kód funkce

        (algoritmus; příkazy) začíná hned za nápovědou a obsahuje posloupnost příkazů, pomocí nichž funkce vypočítá své výstupy. Všechny výstupy funkce musí být jejím kódem vytvořeny, jinak je po spuštění funkce ohlášena chyba! Všechny přiřazovací příkazy unvitř funkce by měly být ukončeny středníkem (aby funkce neobtěžovala okolí výpisem pomocných proměnných).
        Poznámky:
        • pro výpis chyby a ukončení funkce lze použít funkci error, jejímž parametrem je text chybového hlášení (např. error('Chyba: mnoho vstupních parametrů!'))
        • kromě vytvoření nápovědy k funkci je vhodné používat také komentáře v kódu funkce (u jednotlivých příkazů), protože až funkci ukážete kolegům nebo ji budete studovat za půl roku, už si nevzpomenete, co znamenal "tenhle divnej řádek"
          "Program bez komentářů je jako velbloud bez hrbů - nedá se na něj dlouho dívat."
        • pro složité problémy je vhodné použít rozklad problému na podproblémy - složitou funkci rozdělíme na několik jednoduchých, které se vzájemně volají


        Příklad 1: funkce, která vypočítá součet dvou čísel:
        function [s]=soucet(a,b)
        % SOUCET - soucet dvou cisel
        % s=soucet(a,b)
        % a,b ... scitance
        % s ... vysledek (soucet)
        % priklad volani: s=soucet(10,-2.5)

        s = a+b;
        Všimněte si:
        - nápověda k funkci obsahuje vše potřebné pro správné použití funkce
        - kód funkce zabere sice jen jediný řádek, ale to k vypočítání výstupu s stačí
        - přiřazovací příkaz uvnitř funkce je ukončen středníkem, aby funkce neobtěžovala okolí svými pomocnými výpočty

        Příklad 2: funkce, která vypočítá délku přepony pravoúhlého trojúhelníku. Funkce obsahuje jen minimální nápovědu:
        function [prep]=prepona(odvesna1,odvesna2)
        % PREPONA - vypocet prepony pravouhleho trojuhelniku
        prep = (odvesna1^2 + odvesna2^2)^(1/2); % pouziti Pythagorovy vety
    4. Uložení funkce
      Napsanou funkci musíme uložit disk jako M-soubor. Použijeme např. menu File--Save, kde:
      • zkontrolujeme pracovní adresář
      • jako název souboru zadáme jméno funkce, protože název M-souboru se musí shodovat s názvem dané funkce, jinak by funkce nešla spustit!

      zatím border=
      Obr. 2: zatím neuložená funkce v M-editoru
      uložená border=
      Obr. 3: uložená funkce v M-editoru

      Všimněte si: po uložení M-souboru zmizí hvězdička za jeho názvem v titulkovém pruhu okna M-editoru/Debuggeru.

    Spuštění funkce

    Pokud jsme vytvořili vlastní funkci, můžeme ji spustit z Command Window (anebo z jiných funkcí či skriptů). Příkaz pro spuštění funkce vypadá obecně takto:
    >> [vystupy]=jmenofce(vstupy), pokud chceme uložit výsledky do nějakých proměnných (na konci lze uvést středník, aby se výsledky nevypisovaly), nebo takto:
    >> jmenofce(vstupy), pokud nechceme výsledky ukládat do proměnných.

    Poznámky:

    • počet vstupních argumentů se musí shodovat s její definicí (výjimkou jsou funkce obsahující nargin)
    • pořadí vstupních argumentů při volání je zavazující - jsou zpracovávány v pořadí daném definicí funkce
    • výstupy z funkce nejsme povinni odebírat (pokud nenapíšeme za voláním funkce středník, první z výstupů se vypíše pomocí ans)
    • pokud odebíráme výstupy funkce, měl by být dodržen jejich počet (funkce obsahující nargout mohou vracet různé výsledky v závislosti na počtu právě odebíraných výstupů)
    • neznáme-li počet vstupů ani výstupů, necháme si zobrazit nápovědu k funkci (>> help jmenofce)
    • pokud je po spuštění funkce hlášena chyba, ověřte:
      - je správně zadáno jméno funkce?
      - souhlasí počet vstupních parametrů?
      - je funkce uložena? (pokud jsme ji opravovali)
      - jsme ve správném pracovním adresáři?
      Poznámka: někdy pomůže k odstranění "divné" chyby smazání všech proměnných i funkcí z pracovního prostředí (>> clear all)
    • pokud není po spuštění funkce hlášena chyba, ale funkce nevrací správné výsledky, musíme krokovat

    Příklady:
    >> s=soucet(7,14);   s odebráním výstupu a bez jeho výpisu
    >> vysledek=soucet(7,14)   s odebráním výstupu i jeho vypsáním
    >> x=7; y=14; soucet(x,y)   bez odebrání výstupu, ale vypsáním výsledku (pomocí ans)
    >> soucet(3.1,8.14)   bez odebrání výstupu, bez vypsání výsledku (v podstatě zbytečná akce)

    Zobrazení nápovědy k funkci

    Pokud chceme vědět, jak funkci spustit nebo jak pracuje (a funkce byla vyvtořena s nápovědou), můžeme použít příkaz >> help jmenofce, kde jmenofce je název M-souboru bez přípony.
    Jinou možností je pak napsat jméno funkce (v Command Window nebo v M-editoru/Debuggeru), označit ho (třeba dvojklikem myši) a pomocí pravého tlačítka myši zobrazit kontextové menu, kde zvolíme položku "Help on selection" (otevře se Help Browser s nápovědou k funkci; tato nápověda vypadá u knihovních funkcí lépe než při použití příkazu help).

    Zobrazení kódu funkce

    Kód funkce (tj. obsah M-souboru) vidíme v M-editoru/Debuggeru, ale můžeme jej zobrazit také v Command Window příkazem >> type jmenofce, kde jmenofce je název funkce (název M-souboru bez přípony).


    Zjišťování počtu skutečných vstupních a výstupních argumentů

    Pokud chceme, aby naše funkce reagovala na různý počet vstupních parametrů, můžeme v jejím kódu použít nargin. Funkce nargin nemá žádné vstupy, ale vrací skutečný počet parametrů, s nimiž byla funkce spuštěna. Pokud tedy někdo zavolá naši funkci s menším počtem vstupních argumentů, můžeme je zpracovat jinak než v případě plného počtu vstupů.
    Pozor: pořadí vstupních parametrů v definici funkce je zavazující (tedy pokud si myslíme, že vynecháme druhý ze čtyř vstupů, funkce to pochopí tak, že jsme vynechali ten čtvrtý!).

    Pro zjištění skutečného počtu výstupních parametrů máme funkci nargout. Pracuje se s ní podobně jako s funkcí nargin.

    Příklad - vylepšíme funkci soucet, aby sama hlásila chybu, když ji někdo zavolá pro méně než dva parametry:

    soucet.m
    function [s]=soucet(a,b)
    % SOUCET - soucet dvou cisel
    % s=soucet(a,b)
    % a,b ... scitance
    % s ... vysledek (soucet)
    % priklad volani: s=soucet(10,-2.5)
    if nargin~=2 % nespravny pocet vstupu?
       error('CHYBA: k vypoctu potrebuji DVA vstupy!') % vypis chyby a konec funkce
    end % konec if
    s = a+b; % vypocet vysledku
    

    Krokování (ladění) funkcí/skriptů

    Pokud jsou ve funkci chyby (např. nedává správné výsledky) a nemůžeme jejich příčinu najít pouhým přečtením jejího kódu, použijeme Debugger ("odvšivovač"), který nám nabízí možnost krokování:

    • v M-editoru nastavíme breakpoint (F12) na nějakém řádku s příkazem
    • spustíme funkci s jejími parametry (z Command window) - v Command Window se objeví K>> a v M-editoru svítí zelená šipka před řádkem, který bude následně zpracován
    • pomocí F10 a F11 v M-editoru krokujeme (spouštíme jednotlivé příkazy) - výsledky kontrolujeme pomocí myši (pohyb nad názvem proměnné, jejíž obsah nás zajímá) nebo pomocí okna Workspace (kde by měl být nastaven Stack pro krokovanou funkci)
    • výsledkem celého snažení je nalezení chyby, její oprava a uložení opravené funkce

    Hesla semestru:

    • Kdo nekrokuje s námi, krokuje proti sobě.
    • Pokud funkce musí fungovat, ale přesto nefunguje, krokuj.
    • Pokud funkce vypadá jako zcela nefunkční, ale přesto funguje, krokuj.

    krokování><br>Obr. 4: krokování funkce</center><br class=

Týden 7

Speciální znaky

Protože jsme se v předchozích lekcích setkali s různým významem některých nealfanumerických znaků, můžeme si nyní udělat jejich přehled. V tabulce nejsou zahrnuty ty znaky, které jsou jen a pouze součástí operátorů nebo názvů proměnných. V příkladech jsou použity některé knihovní funkce.

[ ]   (hranaté závorky)
  • slouží pro vytváření vektorů a matic (např. [9/2,-6,9.64,sqrt(36)] pro čtyřprvkový vektor)
  • uzavírají výstupy funkcí (např. [m,n]=size(A))
  • lze je použít pro vymazání řádku nebo sloupce matice (zatím neprobráno)
( )   (kulaté závorky)
  • mění prioritu operátorů
  • uzavírají vstupní argumenty funkcí (např. J=ones(5,3))
  • umožňují indexaci (přístup k prvkům) matice/vektoru (např. J(2,3) pro třetí prvek na druhém řádku matice J - zatím neprobráno)
{ }   (složené závorky)
  • vytvářejí pole buněk a přistupují k jeho prvkům (nebudeme probírat)
Poznámka< > neslouží jako lomené závorky, ale jen a pouze jako relační operátory
    (mezera)
  • odděluje od sebe prvky na každém řádku matice (viz vytváření matic a vektorů, např. [-1 2.1 8])
  • odděluje od sebe parametry některých příkazů (saveclear)
  • lze ji použít jako "bílé místo" pro zpřehledňování příkazů (např. a = 1.8 + 2/5 - 1)
,   (čárka)
  • odděluje od sebe prvky na každém řádku matice (viz vytváření matic a vektorů, např. [-1,2.1,8] pro tříprvkový vektor)
  • odděluje vstupní argumenty funkcí (např. ones(3,5))
  • odděluje výstupy funkcí (např. [m,n]=size(J))
  • odděluje od sebe více příkazů na jednom řádku, přičemž výpis jejich výsledků není potlačen
    (např. if a==8, a, text='a je rovno 8', end)
;   (středník)
  • odděluje od sebe řádky matice (viz vytváření matic a vektorů, např. [9/2;-6;9.64;sqrt(36)])
  • odděluje od sebe více příkazů na jednom řádku, přičemž potlačuje výpis jejich výsledků
    (např. if a==8; a; text='a je rovno 8'; end - srovnejte s čárkou)
.   (tečka)
  • desetinná tečka (15.218)
  • je součástí některých aritmetických operátorů (.*./.\.^)
  • slouží pro přístup k prvkům struktury (nebudeme probírat)
  • dvě tečky: cd ..   slouží pro změnu pracovního adresáře na adresář o úroveň výš
  • tři tečky (pokračování): ...   umožňují rozdělit jeden příkaz na více řádků
=   (rovnítko)
'   (apostrof)
%   (procento)
  • komentář - vše až do konce řádku bude MATLABem ignorováno
:   (dvojtečka)
  • slouží pro vytváření aritmetických posloupností (např. p=10:-1:0)
  • submatice (zatím neprobráno, např. J(2:4,1:2)=2.3 nebo A=J(1:3,1:2))
  • součást cyklu for (zatím neprobráno)



Knihovní funkce

V lekci 3 jsme se seznámili s vytvářením uživatelských funkcí, pomocí nichž můžeme zefektivnit svou práci. Systém MATLAB je rozsáhlý a obsahuje mnoho již hotových funkcí, takže je nemusíme vytvářet sami (pokud známe jejich jméno). Hotové funkce jsou sdruženy do tzv. knihoven nebo toolboxů (knihovnu si lze představit jako adresář plný M-souborů, obsahujících funkce s podobnou činností).

Hledání funkcí

Všechny knihovní funkce mají nápovědu (v angličtině). Pokud tedy potřebujeme zjistit, zda pro nějakou činnost existuje v MATLABu již hotová funkce, můžeme hledat pomocí Help Browseru (záložka Search) nebo použít příkaz >> lookfor hledane_slovo, který hledá v popisech funkcí a vypisuje H1 line (první řádek nápovědy) všech nalezených funkcí. Hledání pomocí lookfor může trvat delší dobu (nechcete-li čekat, stiskněte CTRL+C).

Nápověda k funkcím

Známe-li název funkce, kterou potřebujeme použít, dozvíme se o jejích možnostech a o tom, jak ji spustit, z její nápovědy. Nápovědu k vybrané funkci zobrazí příkaz >> help nazevfce nebo přímo Help Browser, pokud klikneme pravým tlačítkem myši na název funkce a vybereme "Help on selection".

Výpis kódu funkce

Pokud je knihovní funkce uložená v M-souboru, lze si prohlédnout její kód stejným způsobem, jako kdyby byla vytvořená uživatelem (tedy např. >> type jmenofce). Některé knihovní funkce jsou tzv. built-in (vestavěné, optimalizované), takže jejich kód není přístupný (např. sin).

Typy funkcí

V následujícím textu jsou uvedeny názvy některých základních knihovních funkcí.

Funkce podle jejich chování k maticím

Jak již bylo řečeno v lekci 1, každá proměnná v MATLABu je matice typu mxn, přičemž m,n>0. Některé funkce vyžadují vstupní argumenty pouze určitého typu (např. jen skaláry), jiným na typu vstupních parametrů "nezáleží" a ke svým vstupním proměnným typu mxn se chovají třemi základními způsoby: skalárně (tj. po prvcích), vektorově (tj. po sloupcích) nebo maticově (podle pravidel lineární algebry). Lze je tedy rozdělit na:

  1. skalární funkce

    • vstupem může být skalár, vektor nebo matice
    • funkce je aplikována na každý prvek svého vstupu
    • výsledek má stejné rozměry jako vstup
    • přehled těchto funkcí: >> help elfun

      význam funkcenázev v MATLABu  příklady
      goniometrické funkcesincostan...>> y1=cos(pi/2)
      >> e1=exp(1)
      >> y2=log(e1)
      >> y3=log(y1)
      >> y4=sqrt(289)
      >> y5=abs(-3+5i)
      exponenciální funkce exexp
      přirozený logaritmus ln(x)log
      dekadický logaritmus log(x)  log10
      odmocninasqrt
      absolutní hodnotaabs

       
  2. vektorové funkce

    • vstupem je vektor nebo matice
    • funkce je aplikována na každý sloupec matice nebo na celý vektor
    • výsledkem je řádkový vektor typu 1xn
    • přehled těchto funkcí: >> help datafun

      význam funkcenázev v MATLABu  příklady
      suma (součet prvků vektoru)  sum>> u=1:0.5:3;
      >> p=mean(u)
      >> V=[1,2;5,3;-3,0.8]
      >> m1=min(V)
      >> m=min(min(V)) % m=min(m1)
      >> s=sum(V)
      minimummin
      maximummax
      průměrmean
      mediánmedian

       
  3. maticové funkce

    • vstupem je většinou algebraická matice, někdy vektor
    • funkce jsou aplikovány na celou matici
    • výsledkem je skalár, vektor nebo matice (podle pravidel lineární algebry)
    • přehled těchto funkcí: >> help matfun

      význam funkcenázev v MATLABu  příklady
      determinantdet>> M=[1,2,3;-3,4,1;0,8,4]
      >> d=det(M)
      >> I=inv(M)
      >> h=rank(M)
      >> a=1:7; b=5:11;
      >> dot(a,b) % SROVNEJTE: a'*b
      inverzní maticeinv
      pseudoinverzepinv
      hodnost maticerank
      skalární součin vektorů  dot

      Poznámka: k řešení soustavy lineárních rovnic, která je převedena do maticového tvaru, lze použít inverzní matici nebo operátor \.


Funkce pro vytváření matic

Mezi užitečné funkce patří také ty, které vytvářejí matice/vektory. Mohou nám tak usnadnit práci se zadáváním matic/vektorů. Tyto funkce mají většinou dva vstupní parametry: [matice] = nazevfce(m,n), ale pokud chceme získat čtvercovou matici (typu mxm), stačí zadat jen jeden vstup. Přehled těchto funkcí zobrazí příkaz >> help elmat.

význam funkcenázev v MATLABu  příklady
matice obsahující nulyzeros>> N=zeros(5,2)
>> E=eye(7)
>> R=rand(4,3)
>> G=magic(4)
>> sloupce=sum(G)
>> radky=sum(G')
>> diagonala=sum(diag(G))
matice obsahující jedničky  ones
jednotková maticeeye
matice náhodných čísel od 0 do 1rand
magický čtverec
(má shodné součty řádků, sloupců a diagonál)
magic


Funkce pro zjišťování rozměrů proměnných

význam funkcenázev v MATLABu  příklady
počet řádků a sloupců
(funkci lze volat s jedním vstupem a dvěma výstupy nebo  
dvěma vstupy (druhý vstup je skalár) a jedním výstupem)  
size>> [radky,sloupce]=size(N)
>> % srovnejte:
>> radky2=size(N,1)
>> sloupce2=size(N,2)
délka vektorulength>> l=length(u)


Funkce pro výpis řetězců

význam funkcenázev v MATLABu  příklady
výpis textu do Command Windowdisp>> disp('ahoj')
>> chyba='Spatne zadani!';
>> error(chyba)
výpis chybového hlášení do Command Window  
(je-li použita uvnitř funkce, tak ji navíc ukončí)
error

Poznámka: přehled názvů funkcí pro práci s řetězci vypíše příkaz >> help strfun


Funkce pro 2D grafiku

Budou předmětem další lekce.


Další funkce...

... hledejte v nápovědě podle potřeby.



Řešení soustav lineárních rovnic

Soustavu rovnic
Ax=b
řešíme pomocí operátoru \ nebo pomocí inverzní matice (funkce inv). V každém případě je potřeba nejprve ověřit řešitelnost soustavy, například pomocí výpočtu determinantu (funkce det):

soustava.m
function x=soustava(A,b)
% SOUSTAVA - reseni soustavy linearnich rovnic 
% A ... matice soustavy
% b ... vektor pravych stran
% x ... reseni soustavy
if det(A)==0
   error('Soustava nema reseni!')
end
x = A\b; % vypocet reseni; DRUHA MOZNOST: x=inv(A)*b; 

Spuštění funkce a ověření výsledků:

>> M=[3 2 -1; 1 0 1; 2 1 -1]; v=[5;4;2]; % zadani soustavy v maticovem tvaru>> reseni=soustava(M,v) % spusteni funkcereseni =
    1.5000
    1.5000
    2.5000>> M*reseni % overeni spravnosti resenians =
     5
     4
     2


Týden 8

2D grafika

MATLAB umožňuje snadnou vizualizaci dat. Jeho možnosti pro tvorbu dvourozměrných grafů jsou rozsáhlé - v této lekci si ukážeme část funkcí, které budeme používat při kreslení 2D grafů.

Při práci s 2D grafikou využíváme grafický režim MATLABu, který má svá vlastní grafická okna (Figure No.4, Figure No.12 apod.)

Postup:

  1. příprava dat (nezávisle proměnná, závisle proměnná/é)
  2. výběr grafického okna, případně podokna
  3. vykreslení grafu
  4. popis grafu
  5. nastavení osmřížky a případné další úpravy grafu
  6. uložení grafu do souboru (obrázek)


Následuje popis funkcí a příkazů, které lze pro uvedené účely použít.

Výběr grafického okna - funkce figure

Grafické funkce automaticky otevřou nové grafické okno, pokud zatím žádné neexistuje (Figure No. 1). V případě, že je již nějaké grafické okno otevřeno, je použito pro vykreslování to, které "je aktivní" (jedná se o poslední okno, které bylo otevřeno nebo na které bylo kliknuto). Chceme-li vykreslovat do úplně nového okna, přestože jiná již existují, nebo do vykreslovat do okna se zvoleným číslem, použijeme funkci figure s jedním nebo žádným parametrem:
figure - otevře úplně nové grafické okno a učiní jej aktivním:

Týden 9

Cykly

Cyklus slouží pro zápis příkazů, které mají být prováděny opakovaně (několikrát za sebou). Počet opakování těchto příkazů závisí na nějaké podmínce nebo může být předem známý. Proto existují dva základní typy cyklů:

  • cyklus řízený podmínkou (zvaný též indukční cyklus; v MATLABu realizovaný pomocí while)
  • cyklus s předem známým počtem opakování (zvaný též iterační cyklus nebo cyklus s výčtem hodnot; v MATLABu realizovaný pomocí for)

Příkazy uvnitř cyklu se nazývají tělo cyklu.

Cyklus řízený podmínkou - while

Cyklus řízený podmínkou používáme, pokud chceme několikrát provést určité příkazy, ale předem neznáme počet opakování, nicméně známe podmínky, za kterých se příkazy provádět mají. Tato podmínka se nazývá řídící podmínka cyklu. V MATLABu je tento druh cyklu realizován příkazem while.

Syntaxe

Cyklus while začíná klíčovým slovem while a končí klíčovým slovem end:

while podmínka
  příkazy
end
  • podmínka (řídicí podmínka cyklu) je libovolný výraz s logickou hodnotou 0 nebo 1 (většinou se v podmínkách používají relační nebo binární logické operátory)
  • příkazy v těle cyklu jsou jakékoli příkazy, které se mají provádět opakovaně v případě splnění podmínky

Poznámky:

  • V případě, že součástí podmínky je matice typu mxn, je podmínka pravdivá jen tehdy, pokud je pravdivá pro všechny prvky této matice.
  • V případě, že v nějaké podmínce použijeme binární logický operátor (& nebo |) a po vyhodnocení prvního argumentu je už zřejmý výsledek (kdy se to může stát?), tak se druhý argument nevyhodnocuje. Tato vlastnost se nazývá zkrácené vyhodnocování.
  • Cyklus while může být vnořen do libovolného jiného složeného příkazu (např. do ifu nebo do jiného cyklu).
  • Mezi příkazy těla cyklu můžeme napsat jakýkoli jiný složený příkaz, např. if nebo další cyklus.

Činnost (průběh provádění cyklu)

provádění align=Činnost cyklu lze vyjádřit větou: dokud platí podmínka, prováděj příkazy.
Na začátku se testuje platnost řídicí podmínky (tj. je vyhodnocena). Pokud podmínka platí (tj. výraz má nenulovou hodnotu), provedou se všechny příkazy těla cyklu. Poté se ZNOVU testuje podmínka a pokud platí, provedou se znovu všechny příkazy těla cyklu atd. atd., dokud se při testování podmínky nezjistí, že podmínka neplatí (tj. hodnota výrazu je nulová). Tehdy cyklus skončí, tzn. pokračuje se prováděním příkazů za jeho koncem (který je označen klíčovým slovem end), pokud tam nějaké jsou.

Konec cyklu může nastat i při prvním testu podmínky (je-li nulová), takže se může stát, že příkazy v těle cyklu se neprovedou ani jednou.

Protože se podmínka testuje opakovaně a závisí na ní ukončení cyklu, měli bychom dodržovat následující doporučení:
řídicí podmínka cyklu by měla být ovlivňována prováděním příkazů v těle cyklu tak, aby jednou přestala platit. Jinak totiž cyklus nikdy neskončí (tzv. nekonečný cyklus) - poznáme to tím, že v Command Window se neobjeví >> a zpravidla se také neustále něco vypisuje. Pokud chceme ukončit provádění nekonečného cyklu, stiskneme CTRL+C.

Příklad nekonečného cyklu:

while 1 % podmínka je vždy pravdivá, má totiž pořád hodnotu 1
  disp('jedu...')
end

Použití cyklu řízeného podmínkou

Cyklus while používáme vždy, když potřebujeme opakovat nějakou činnost závislou na pravdivosti dané podmínky, ale předem neznáme počet těchto opakování.

Příklad 1 - vytvoříme funkci, která počítá zbytek po dělení a celočíselný podíl ze dvou zadaných čísel:

deleni.m
function [p,z]=deleni(d1,d2)
% DELENI - celociselny podil a zbytek po deleni
% d1 ... delenec (cele cislo)
% d2 ... delitel (cele cislo)
% p ... celociselny podil
% z ... zbytek po delenip = 0; % priprava podilu
while d1>=d2 % dokud je delenec vetsi nebo roven deliteli
  d1 = d1-d2; % nicime puvodni delenec postupnym odecitanim delitele, tj. d1-d2-d2-d2...
  p = p+1; % hlidame si pocet odecteni, tj. postupne nam narusta podil
end
z = d1; % nakonec nam z delence zustala pouze cast mensi nez delitel (zbytek)


Všimněte si, že funkce nic NEVYPISUJE, pouze vyrobí výstupy ze zadaných vstupů.
Na první pohled bude funkce fungovat správně: vyzkoušejme ji např. pro 10 a 3, 25 a 25, 17 a 21 nebo 0 a 6 (doporučení: chcete-li činnost funkce prozkoumat, v některém případě i krokujte - breakpoint nastavte třeba na řádek p=0;):
>> [podil,zbytek]=deleni(10,3)
>> [podil,zbytek]=deleni(25,25)
>> [podil,zbytek]=deleni(17,21)
>> [podil,zbytek]=deleni(0,6)

Když ale zadáme třeba 5 a 0 nebo 6 a -3 (>> [podil,zbytek]=deleni(6,-3)), tak cyklus nikdy neskončí, protože d1 v podmínce stále narůstá!
Vylepšíme tedy naši funkci o test nezápornosti dělitele (a test kladnosti dělence):

deleni.m
function [p,z]=deleni(d1,d2)
% DELENI - celociselny podil a zbytek po deleni
% [p,z]=deleni(d1,d2)
% d1 ... delenec (cele cislo)
% d2 ... delitel (cele cislo)
% p ... celociselny podil
% z ... zbytek po deleniif d1<0 | d2<=0 % delenec je zaporny nebo delitel je nula ci zaporny
  error('chybne zadane vstupy') % KONEC, nic nepocitame
end
p = 0; % priprava podilu
while d1>=d2 % dokud je delenec vetsi nebo roven deliteli
  d1 = d1-d2; % nicime puvodni delenec postupnym odecitanim delitele, tj. d1-d2-d2-d2...
  p = p+1; % hlidame si pocet odecteni, tj. postupne nam narusta podil
end
z = d1; % nakonec nam z delence zustala pouze cast mensi nez delitel (zbytek)


Příklad 2 - funkce pro výpočet faktoriálu zadaného čísla (na principu: n!=n(n-1)(n-2)...1):

fakt1.m
function f=fakt1(n)
% FAKT1 - vypocet faktorialu celeho cisla
% f=fakt1(n)
% n ... cislo
% f ... faktorial (f=n!)if n<0 % kontrola vstupu
  error('faktorial neexistuje') % KONEC, nic nepocitame
end
f = 1; % priprava vysledku
while n>1 % dokud je co pridat do vysledku
  f = f*n; % pridavame do vysledku
  n = n-1; % postupne snizujeme 'n'
end
% nakonec je 'n' rovno jedne a 'f' obsahuje jeho faktorial


Cyklus s předem známým počtem opakování (iterační cyklus) - for

Tento cyklus používáme, když předem víme, kolikrát se mají provést určité příkazy. Počet opakování je většinou daný vektorem, ze kterého si v každé iteraci (tj. v každém průchodu cyklem) vezmeme jednu hodnotu - tato hodnota je uložena v tzv. řídicí proměnné cyklu. V MATLABu je tento druh cyklu realizován příkazem for.

Syntaxe

Cyklus for začíná klíčovým slovem for a končí klíčovým slovem end:

for proměnná=výraz
  příkazy
end
  • proměnná (řídicí proměnná cyklu) je libovolný název proměnné
  • výraz je jakýkoli výraz, jehož délka (velikost) udává počet opakování. Většinou se jedná o vektor, který bývá generován pomocí operátoru dvojtečka
  • příkazy v těle cyklu jsou jakékoli příkazy, které se mají provádět opakovaně v případě splnění podmínky

Poznámky:

  • V případě, že výsledkem výrazu (nebo výrazem samotným) je matice, bude řídicí proměnná obsahovat postupně každý její sloupec.
  • Cyklus for může být vnořen do libovolného jiného složeného příkazu (např. do ifu nebo do jiného cyklu).
  • Mezi příkazy těla cyklu můžeme napsat jakýkoli jiný složený příkaz, např. if nebo další cyklus.

Činnost (průběh provádění cyklu)

provádění align=Činnost cyklu lze vyjádřit větou: n-krát proveď příkazy (n je délka výrazu, tj. počet prvků vektoru nebo počet sloupců matice).
Na začátku se zjistí délka (n) výrazu a pokud je nenulová, n-krát se provede tělo cyklu (příkazy). V každé iteraci je řídicí proměnná cyklu rovna jednomu prvku vektoru (začíná se prvním prvkem a pokračuje se po řadě). Po vyčerpání všech hodnot vektoru cyklus skončí, tzn. pokračuje se prováděním příkazů za jeho koncem (který je označen klíčovým slovem end), pokud tam nějaké jsou.

Konec cyklu může nastat předčasně, pokud je v těle cyklu obsažen příkaz break nebo return (budeme probírat příště).

Použití iteračního cyklu

Cyklus for používáme vždy, když známe počet opakování určité činnosti.
Iterační cyklus se často využívá pro tvorbu matic (jejichž prvky jsou generovány podle nějakého vzorce) a také je používán při zpracovávání matice prvek po prvku.

Příklad 1 - skript, který vykreslí graf funkce sinus do tří různých grafických oken (není sice příliš praktický, ale pro demonstraci činnosti cyklu si jej vytvoříme):

sin3krat.m
% SIN3KRAT - vykresleni grafu sinu do tri grafickych oken
x = 0:pi/100:4*pi; % nezavisle promenna
for i=1:3 % postupne bude i=1, i=2 a i=3
  figure(i) % nove okno (resp. aktivace existujiciho) s cislem 1 nebo 2 nebo 3
  plot(x,sin(x),'k') % vykresleni grafu
  xlabel() % popis osy x
  ylabel() % popis osy y
  title() % nazev grafu
end


Doporučení: chcete-li činnost skriptu prozkoumat, krokujte - breakpoint nastavte třeba na řádek x=0:pi/100"4*pi;). Skript spustíte jménem M-souboru bez přípony, tj. >> sin3krat


Příklad 2 - funkce pro výpočet faktoriálu zadaného čísla (na principu: n!=1*2*...*(n-1)*n):

fakt2.m
function f=fakt2(n)
% FAKT2 - vypocet faktorialu celeho cisla
% f=fakt2(n)
% n ... cislo
% f ... faktorial (f=n!)if n<0 % kontrola vstupu
  error('faktorial neexistuje') % KONEC, nic nepocitame
end
f = 1; % priprava vysledku
for i=1:n % n-krat, anebo: i=2:n (usetrime jedno nasobeni jednickou)
  f = f*i; % pridavame do vysledku
end
% nakonec je 'i' rovno 'n' a 'f' obsahuje jeho faktorial 'n'

Doporučení: chcete-li činnost funkce prozkoumat, krokujte např. pro >> vysledek=fakt2(5) (breakpoint nastavte třeba na řádek s příkazem if).
Porovnejte funkci fakt2 s funkcí fakt1 - zjistíte podobnost (a rozdíly) mezi oběma druhy cyklů.

Týden 10

Funkce feval

Funkce feval se používá v případě, kdy potřebujeme vyhodnotit (zavolat) existující funkci, ale předem nevíme, jak se volaná funkce bude jmenovat. Nejčastěji je to v případě, kdy vytváříme nějaký univerzální nástroj, např. pro hledání kořenů nějaké funkce nebo pro výpočet určitého integrálu nějaké funkce v daném intervalu.

Syntaxe:

  1. [y1,y2,...] = feval(fhandle,x1,...,xn) nebo
  2. [y1,y2,...] = feval(funkce,x1,...,xn)

- doporučený způsob je volání pomocí 1), kde handle je "ukazatel" na funkci
- způsob volání pomocí 2) je zachován z důvodu kompatibility se staršími verzemi MATLABu; funkce je řetězec obsahující název volané funkce
x1,...,xn jsou všechny vstupní parametry volané funkce
y1,y2,... jsou odebírané výstupy


Následujících 5 zápisů je ekvivalentních:

  • y = sin(x)
  • y = feval(@sin,x)
  • y = feval('sin',x)
  • nazev='sin'; y = feval(nazev,x)
  • fhand=@sin; y = feval(fhand,x)

Poznámka: funkce volaná pomocí feval musí být buď knihovní funkcí MATLABu, anebo uživatelskou funkcí uloženou v M-souboru (nejlépe v aktuálním adresáři).

Příklad:
máme funkci polynom1 uloženou v souboru polynom1.m, která má jeden vstup a jeden výstup:

polynom1.m
function v=polynom1(u)
% polynom1 - funkcni hodnoty polynomu 3. stupnev = 2*u.^3 - u.^2 + 15*u -8; % funguje i pro vektory nebo matice (po prvcích) 


Tuto funkci můžeme volat pro různé hodnoty nezávisle proměnné např. těmito způsoby:

  • y = polynom1(30.2)
  • y = feval(@polynom1,-13)
  • y = feval('polynom1',-4.5)
  • nazev='polynom1'; x=5.21; y = feval(nazev,x)
  • fhand=@polynom1; x=7/4-0.5; y = feval(fhand,x)

Další příklady použití funkce feval naleznete níže.


Numerická integrace

Potřebujeme-li vypočítat určitý integrál, ale:

  • funkci máme zadanou tabulkou a neznáme její předpis,
  • máme analyticky zadanou funkci, avšak neumíme ji symbolicky zintegrovat (například Gaussův integrál),
  • máme analyticky zadanou funkci, existuje symbolický integrál, avšak jeho nalezení je obtížné a zdlouhavé

pak nezbývá, než hodnotu určitého integrálu odhadnout. Metod pro numerickou integraci existuje více (jistě znáte obdélníkové pravidlo, lichoběžníkové pravidlo nebo Simpsonovu metodu).

My si uvedeme dvě možnosti realizace obdélníkového pravidla (použijeme náhradu určitého integrálu součtem obdelnikove>):<br>- pro funkci zadanou tabulkou (využijeme všechny zadané body [<em>x<sub>i</sub></em>,<em>y<sub>i</sub></em>]) a<br>- pro funkci, jejíž analytické vyjáření známe (zde si vybereme<span> </span><em>N</em><span> </span>uzlových bodů).</p><code class=integ_obd.m

Symbolická integrace

Pokud máme k dispozici tzv. symbolický toolbox, můžeme MATLAB využít pro přesné výpočty určitých integrálů (pokud existují) nebo pro nalezení primitivní funkce (existuje-li).

Postup je jednoduchý:

  1. zavedeme symbolické proměnné (někdy stačí jen jedna) - příkaz syms proměnná1 proměnná2 proměnná3
  2. necháme spočítat určitý integrál od a do b - symbolická funkce int(výraz,a,b), kde výraz musí obsahovat některou existující symbolickou proměnnou. Funkce int vrací jeden výstup, který můžeme uložit do nějaké proměnné
    • chceme-li najít primitivní funkci, použijeme symbolickou funkci int s jedním parametrem:
      int(výraz)
    • pro vylepšení vzhledu výsledku můžeme použít funkci pretty(symb_výraz)

Příklad 1 - určité integrály polynomů:
>> syms x   ... všimněte si, jak se zobrazuje symbolická proměnná v okénku Workspace
>> int(x^2+3*x-5,0,2)   ... ve výrazech se symbolickou proměnnou lze použít všechny známé aritmetické operátory
ans =
-4/3
   ... všimněte si, že výsledkem je zase symbolická proměnná
>> int(polynom1(x),0,2)   ... symbolickou proměnnou lze poslat do existující funkce
ans =
58/3

Příklad 2 - primitivní funkce:
>> syms x
>> int(x^2+3*x-5)
ans =
1/3*x^3+3/2*x^2-5*x

>> int(polynom1(x))
ans =
1/2*x^4-1/3*x^3+15/2*x^2-8*x

>> pretty(int(polynom1(x)))   ... hezké zobrazení výsledku (totéž jako pretty(ans))

               4        3         2
          1/2 x  - 1/3 x  + 15/2 x  - 8 x

V případě, že určitý integrál existuje, můžeme symbolickou matematiku použít při ověřování výsledků získaných numericky.

VÝPOČET URČ. INTEGRÁLU OBĚMA ZPŮSOBY - pracuje se na tom...



Numerická derivace

Častou úlohou je odhadnout derivaci funkce f v bodě c, tj. hodnotu f'(c), na základě znalosti funkčních hodnot v konečně mnoha bodech. Tyto body si buď můžeme zvolit, anebo jsou zadány (např. tabulkou).

Většinou nic nebrání tomu, abychom aproximovali f nějakou vhodnou funkcí, tuto funkci zderivovali a výsledek považovali za aproximaci derivace původní funkce.
Provést odhad derivace je žádoucí, pokud je analytický výpočet derivace příliš pracný nebo popis funkce je tak složitý, že bychom se do jeho derivování nechtěli pouštet (třeba kvůli riziku chyby).
Numerická derivace však může být také nežádoucí - chyba derivace nesouvisí s chybou, která vznikla při aproximaci dané funkce, a může být tedy libovolně velká.

Základní metody

Při odhadu derivace funkce f můžeme vyjít z definice: f'(x) = limh0 (f(x+h) - f(x))/h, kde h je z prstencového okolí nuly. Zvolíme-li "malé" h, dostaneme odhad derivace v bodě x.
Tento postup nelze použít u funkcí zadaných tabulkou (kdy neznáme analytické vyjádření funkce).

Dále můžeme pro výpočet numerické derivace použít následujících aproximací funkcí: interpolačního spline, aproximace pomocí Čebyševových polynomů, aproximace metodou nejmenších čtverců (u derivací funkce dané naměřenými hodnotami), interpolační polynom.

Pokud je funkce zadaná tabulkou, přičemž vzdálenosti hodnot x1,...,xn jsou ekvidistantní, můžeme použít interpolaci polynomem 2. stupně a získáme vztahy pro výpočet derivace v daných bodech - derivaci (tj. směrnici tečny ke grafu funkce) ve vnitřních bodech x2,...,xn-1 určíme podle symetrického vzorce a okraje dopočítáme z bodů uvnitř:
numerická><br><em>Poznámka:</em><span> </span>abychom docílili malou chybu metody, potřebujeme volit malý krok. V tom případe však v čitateli vzorce dostáváme malý rozdíl čísel, který poté dělíme malým jmenovatelem. Takto může pro malý krok vzniknout velká zaokrouhlovací chyba. Proto není vhodné volit krok příliš malý.</p><p>Následující funkce vrací vektor hodnot derivace funkce zadané tabulkou.</p><table border=derivace.m

function dy=derivace(x,y)
% DERIVACE - numericka derivace funkce dane tabulkou
% dy=derivace(x,y)
% x ... vektor hodnot nezavisle promenne, ekvidistantni (delka N)
% y ... vektor funkcnich hodnot (delka N)
% dy ... vektor pribliznych hodnot derivace v bodech [xi,yi] (delka N)N = length(x);
if N~=length(y)
    error('Vstupni vektory nejsou stejne dlouhe!')
end
if N<3
    error('Zadali jste malo bodu - potrebuji alespon TRI hodnoty!')
end
h = (x(2)-x(1)); % krok
%...melo by se oTESTovat, ze krok je vsude stejny!...dy = y;  % priprava, 'dy' je stejne velke jako 'y'
% zmena hodnot 'dy' na spravne:
dy(1) = (-3*y(1)+4*y(2)-y(3))/(2*h); % pocatek
for i=2:N-1
    dy(i) = (y(i+1)-y(i-1))/(2*h); % vnitrni body
end
dy(N) = (y(N-2)-4*y(N-1)+3*y(N))/(2*h); % konec


Příklad:
Funkci vyzkoušíme pro parabolu (tam by se numerická derivace měla shodovat s analytickou), přičemž zvolíme krok 1/5 a necháme vykreslit graf původní funkce (černě), její derivace (zeleně) a numericky spočítané derivace (červené křížky):
>> x=-2:0.2:2; y=x.^2; dy=derivace(x,y); plot(x,y,'k',x,2*x,'g',x,dy,'rx')
a také vyzkoušíme pro "polynom1" (barvy grafů jsou stejné jako v předešlém případě, grafy nejsou popsány!):
>> x=-2:0.2:2; dy=derivace(x,polynom1(x)); % numericka derivace
>> ady = 6*x.^2-2*x+15; % analyticka derivace
>> plot(x,y,'k',x,ady,'g',x,dy,'rx')



Symbolická derivace

Pokud máme k dispozici tzv. symbolický toolbox, můžeme MATLAB využít pro výpočet derivace dané funkce (výrazu).

Postup je jednoduchý:

  1. zavedeme symbolickou proměnnou - příkaz syms proměnná
  2. necháme spočítat derivaci - symbolická funkce diff(výraz), kde výraz musí obsahovat symbolickou proměnnou. Výstup funkce je jeden - hledaná derivace (můžeme ji uložit do proměnné)
    • chceme-li vypočítat derivace vyšších řádů, použijeme funkci diff se dvěma parametry, tj. diff(výraz,n, kde n>1 je řád derivace
    • chceme-li vykreslit graf (symbolické) funkce a její derivace, použijeme symbolickou funkci
      ezplot(x,y), kde x je symbolická proměnná a y je původní funkce nebo její derivace
    • pro vylepšení vzhledu výsledku můžeme použít funkci pretty(symb_výraz)
    • do vypočtené derivace můžeme dosazovat pomocí funkce subs(symb_výraz,stare,nove), kde stare je výraz (proměnná), za který dosazujeme a nove je výraz (proměnná), kterým nahrazujeme

Příklad 1 - derivace polynomu a vykreslení dvou grafů do jednoho obrázku:
>> syms x
>> y = x^2+3*x-5;
>> dy = diff(y)
>> ezplot(x,y) graf fce
>> hold on % prikreslujeme
>> ezplot(x,dy) graf derivace

Poznámka: graf by se měl také správně popsat (xlabeltitlelegend)!

Příklad 2 - první, druhá a třetí derivace funkce sin(x2):
>> syms x
>> diff(sin(x^2)) % 1. derivace
ans =
2*cos(x^2)*x
>> diff(sin(x^2),2) % 2. derivace
ans =
-4*sin(x^2)*x^2+2*cos(x^2)
>> diff(sin(x^2),3) % 3. derivace
ans =
-8*cos(x^2)*x^3-12*sin(x^2)*x
>> pretty(diff(sin(x^2),3)) % hezky vypis

                         2   3           2
                 -8 cos(x ) x  - 12 sin(x ) x

Symbolicky určenou derivaci lze použít k ověření výsledků nalezených numericky, pokud známe analytické vyjádření původní funkce.

Příklad 3 - ověření numerického výpočtu derivace funkce "polynom1" pomocí symb. matematiky:
>> x=-2:0.2:2; dy=derivace(x,polynom1(x)); % numericka derivace
>> syms z; ady = subs(diff(polynom1(z)),z,x); % symb. derivace + dosazeni hodnot 'x' za 'z'
>> plot(x,y,'k',x,ady,'g',x,dy,'rx')



Import dat z Excelu

Postup je následující:

  1. Otevřít příslušný soubor v Excelu.
  2. Zkontrolovat, zda desetinná čísla jsou psána s desetinnou TEČKOU (čárka je totiž pro MATLAB oddělovačem sloupců v maticích).
    Pokud není zobrazována desetinná tečka, v menu Excelu ji nastavíme jako oddělovač (menu Nástroje---Možnosti, karta Mezinárodní). Není-li v menu Excelu tato možnost, musíme změnit desetinnou čárku na tečku pro všechny aplikace (Start---Nastavení---Ovládací panely, kde na kartě Čísla změníme oddělovač).
  3. V MATLABu vytvoříme spojení s Excelem (funkce ddeinit)
    Např. >> spojeni=ddeinit('excel','data1.xls')
    POZOR: pokud je hodnota spojeni přesně nula, spojení se nepovedlo (pravděpodobně není otevřen soubor uvedeného názvu).
  4. Importujeme data z Excelu do MATLABu (funkce ddereq)
    Např. >> x=ddereq(spojeni,'r1c1:r21c1'), kde 'r1c1:r21c1' znamená, že bereme data od buňky v 1. řádku a 1. sloupci do buňky v 21. řádku a 1. sloupci (tedy od A1 do A21).


Týden 11

lekci 5 jsme se seznámili s 2D grafikou (grafy funkcí jedné proměnné). MATLAB umožňuje vizualizovat také funkce dvou proměnných. Používáme podobný postup:

  1. příprava dat (nezávisle proměnné, závisle proměnná)
  2. výběr grafického okna, případně podokna (lekce 5!)
  3. vykreslení 3D grafu
  4. úpravy grafu
  5. uložení grafu do souboru (lekce 5!)

Příprava dat

Potřebujeme mít dvě matice (např. X,Y), jejichž prvky X(i,j),Y(i,j) budou obsahovat souřadnice bodů v rovině. Ke snadnému generování těchto matic slouží funkce meshgrid:
[X,Y]=meshgrid(v1,v2)
- vektor v1 určuje interval na ose x s daným krokem a vektor v2 určuje interval na ose y s daným krokem
[X,Y]=meshgrid(v)
- vektor v určuje interval na ose x i na ose y

Ukázka:

>> [X,Y]=meshgrid([-3:1],[-1:2:7])X =
    -3    -2    -1     0     1
    -3    -2    -1     0     1
    -3    -2    -1     0     1
    -3    -2    -1     0     1
    -3    -2    -1     0     1Y =
    -1    -1    -1    -1    -1
     1     1     1     1     1
     3     3     3     3     3
     5     5     5     5     5
     7     7     7     7     7

Kromě nezávisle proměnných potřebujeme vytvořit také matici funkčních hodnot.
Např. pro funkci f(x,y)=cos(x2)-sin(y3) vytvoříme matici Z:
>> Z=cos(X.^2)-sin(Y.^3);   (uvědomte si, proč je nezbytné používat operátory "s tečkou"...)

Vykreslení grafu funkce dvou proměnných

Při vykreslení grafů funkce dvou proměnných máme na výběr:

  • plot3(X,Y,Z), případně plot3(X,Y,Z,řetězec) ... vykreslí graf jako jednotlivé čáry, pomocí řetězce můžeme nastavit barvu, značky a typ čar
  • mesh(X,Y,Z) ... vykreslí 3D graf, body spojuje navzájem ve směru obou os (výsledkem je "drátěný model" nebo "síť")
  • surf(X,Y,Z) ... vykreslí 3D graf, body spojuje navzájem ve směru obou os a vzniklé plošky vyplní barvou
  • contour(Z) ... vykreslí vrstevnice funkce dvou proměnných (2D graf)
    contour(Z,n) ... vykreslí vrstevnice v n rovinách, např. contour(Z,5)
    contour(Z,v) ... vykreslí vrstevnice v rovinách zadaných vektorem v, např. contour(Z,[-2 0 .5 .8 1])
  • meshc(X,Y,Z) ... vykreslí 3D "síťový" graf a navíc i vrstevnice
  • surfc(X,Y,Z) ... vykreslí 3D "ploškový" graf a navíc i vrstevnice


Příklad - ukázka skriptu, který vykreslí funkci dvou proměnných (funkce peaks je knihovní funkce MATLABu):

[X,Y] = meshgrid(-3:.125:3);
Z = peaks(X,Y);
meshc(X,Y,Z);
axis([-3 3 -3 3 -10 5])


Týden 12

Aproximace dat polynomem n-tého stupně

V zimním semestru jsme se naučili používat funkci LINREGRESE (resp. LINEST v anglické verzi Excelu), která pomocí metody nejmenších čtverců vypočítala koeficienty přímky (y = m1x1 + m2x2 + ... + b), která nejlépe odpovídala zadaným datům (y, x1, x2...). Kromě vypočtených koeficientů funkce uměla vracet i další regresní statistiky. V MATLABu lze samozřejmě data aproximovat také. V případě, že chceme zadaná (naměřená) data aproximovat polynomem n-tého stupně, můžeme to jednoduše provést pomocí funkce polyfit, která používá metodu nejmenších čtverců:
p=polyfit(x,y,n), kde
x je vektor hodnot nezávisle proměnné,
y je vektor hodnot závisle proměnné,
n je stupeň polynomu, jímž chceme aproximovat body [xi,yi] a
p je vektor koeficientů výsledného polynomu P(x), přičemž P(x)=p(1)xn + p(2)xn-1 + ... + p(n)x + p(n+1)

Poznámky:

  • volba stupně polynomu většinou závisí na fyzikální podstatě prolému
  • pokud pro data délky N použijeme polynom stupně N-1, provádíme aproximaci interpolací (tj. polynom bude procházet všemi body [xi,yi])
  • pro polynom stupně N (a vyšších) úloha samozřejmě nemá jednoznačné řešení a funkce polyfit hlásí "Warning"
  • pokud potřebujeme aproximovat jinou funkcí než polynomem, lze si M-soubor funkce polyfit upravit (a uložit pod jiným názvem) nebo použít metodu nejmenších čtverců, která vede k řešení soustavy lineárních rovnic. Uvedené postupy lze samozřejmě použít pouze pro modely, které jsou lineární v parametrech!

Protože nás kromě koeficientů aproximačního polynomu většinou zajímají také hodnoty polynomu P(x) ve všech prvcích vektoru x (např. kvůli grafickému znázornění), existuje také funkce polyval:
y_aprox=polyval(p,x), kde
p je vektor koeficientů aproximačního polynomu,
x je vektor hodnot nezávisle proměnné a
y_aprox je vektor hodnot aproximačního polynomu.

Součet čtverců odchylek pak vypočteme snadno - buď pomocí cyklu for (přes všechny prvky y_aprox a y), anebo jednoduše s využitím toho, že nás zajímá součet prvků vektoru, který vznikl umocněním každého prvku vektoru rozdílů mezi y_aprox a y:
S=sum((y_aprox-y).^2)

Příklad - chceme aproximovat 8 naměřených hodnot u a v polynomem 2. stupně:

>> u=[1 1.5 2.1 2.5 3 3.1 3.2 3.5]; % namerena data, nezav. prom.
>> v=[7.8 8.15 8.3 8.25 8.1 8.3 8.35 8.2]; % namerena data, zav. prom.
>> p=polyfit(u,v,2) % koeficienty polynomu 2. stupne pro 'u' a 'v'
p =
   -0.1684    0.8977    7.1150>> v_aprox=polyval(p,u); % hodnoty polynomu v 'u'
>> S=sum((v_aprox-v).^2) % soucet ctvercu odchylek
S =
    0.0345>> plot(u,v,'r+') % graf, puvodni data jako cervene krizky
>> hold on % prikreslime dalsi
>> plot(u,v_aprox,'k.-') % graf polynomu jako cerne body spojene carou
>> axis([0.8 3.7 7.7 8.4]) % uprava os
>> title('Data a jejich aproximace parabolou')% nazev grafu
>> legend('data','aproximacni polynom',4) % zobrazime legendu (4 = vpravo dole)

A výsledek:
graf

Samozřejmě by bylo lepší napsat tyto příkazy jako skript nebo ještě lépe jako funkci (aby se stupeň aproximačního polynomu dal snadno měnit).

Návrh na vylepšení:
namísto příkazu >> plot(u,v_aprox,'k.-') by se graf polynomu mohl vykreslit s menším krokem (bude vypadat lépe), například:
>> plot(min(u):0.05:max(u),polyval(p,min(u):0.05:max(u)),'k',u,v_aprox,'k.')
Pokud chceme data aproximovat jinou funkcí než polynomem (např. f(x)=C1.sin(x)+C2.1/x), řešíme danou úlohu pomocí metody nejmenších čtverců (pouze pro modely, které jsou lineární v parametrech!), kdy pro neznámé koeficienty (C1, C2) získáme soustavu lineárních rovnic.