1 Seznámení s MATLABem - elementární funkce MATLABu Osnova: 1.1 MATLAB.........................................................................................................................1 1.1.1 Hlavní kategorie MATLABovských funkcí ..............................................................3 1.1.2 Aritmetické operátory a některé speciální znaky.......................................................3 1.1.3 Základní elementární funkce MATLABu..................................................................4 1.1.4 Výpočty funkčních hodnot.........................................................................................7 1.1.5 Zápisy funkcí a operátorů ........................................................................................11 1.1.6 Exponenciální funkce ..............................................................................................15 1.1.7 Trigonometrické funkce...........................................................................................16 1.1.8 Převod radiánů na stupně, minuty a vteřiny ............................................................19 V této kapitole se dozvíte základní informace o matematickém programu MATLAB. Naučíte se používat některé operace a předdefinované funkce MATLABu k výpočtu funkčních hodnot. Napíšete si svůj první „program“, který při zadání hodnoty kosinu nějakého úhlu vypočítá a vypíše na monitor hodnotu tohoto úhlu ve stupních, minutách a vteřinách. ▲ Předpokládám, že víte, co je to určitý integrál, umíte ho vypočítat a znáte jeho geometrický význam. Dále předpokládám, že víte, co je polynom, a jak se počítá jeho funkční hodnota, že znáte mocniny s racionálním exponentem, že znáte a umíte počítat hodnoty funkcí logaritmických, exponenciálních a goniometrických. Také předpokládám, že umíte převádět radiány na stupně a naopak. Za samozřejmost považuji, že umíte psát libovolné znaky na klávesnici popř. přepnout mezi anglickou a českou klávesnicí. ▲ Kontaktní cvičení trvá přesně 100 minut. Vám by prostudování této kapitoly mělo trvat přibližně 120 minut. Pokud ale nemáte zažité výše uvedené potřebné znalosti, tak raději počítejte s tím, že budete potřebovat času více. Doporučuji se posilnit, tj. najíst se a napít, vypnout mobil, nachystat si tužku, papír, tato skripta, spustit MATLAB, (ve kterém máte otevřené pouze okno Command Window), vyhradit si asi 180 minut, popř. dát na dveře cedulku "NERUŠIT" a pustit se do práce. ▲ Nejprve budu stručně charakterizovat matematický program MATLAB a uvedu hlavní kategorie MATLABovských funkcí. Protože tato část nepatří mezi základní učivo, tak stačí, když si přečtete pouze první odstavec, a pak můžete přeskočit až na dalšího Průvodce studiem. ▲
1.1 MATLAB MATLAB poskytuje svým uživatelům nejen mocné grafické a výpočetní nástroje, ale i rozsáhlé knihovny funkcí spolu s výkonným programovacím jazykem čtvrté generace. Knihovny jsou svým rozsahem využitelné prakticky ve všech oblastech lidské činnosti. Za nejsilnější stránku MATLABu je považováno mimořádně rychlé výpočetní jádro s optimálními algoritmy, které jsou prověřeny léty provozu na špičkových pracovištích po celém světě. MATLAB byl implementován na všech významnějších platformách. ▲ MATLAB dále nabízí podporu vícerozměrných polí a uživatelsky definovaných datových struktur, otevřený a rozšiřitelný systém, působivou 2D a 3D grafiku, množství aplikačních knihoven, objektové programování, interaktivní nástroje pro tvorbu grafického uživatelského rozhraní (GUI builder), rozšířenou podporu řídkých matic, pohodlnou práci se soubory různých formátů, integrované prostředí pro ladění programů (debugger), zvukový vstup a 1
výstup, animaci, výpočetní jádro pro programy psané ve Fortranu a jazyce C a rozsáhlou tištěnou i hypertextovou on-line dokumentaci. Struktury Jádrem programu jsou algoritmy pro operace s maticemi komplexních čísel. MATLAB umožňuje provádět všechny běžné operace jako násobení, inverze, determinant atd. a v nejjednodušší podobě je možno jej použít jako maticový kalkulátor, protože všechny tyto operace se zapisují téměř tak, jak byste je psali na papíře. Kromě datových typů jednodušších než tradiční matice podporuje MATLAB také typy složitější, jako jsou např. vícerozměrná pole reálných nebo komplexních čísel. Dalším datovým typem jsou tzv. pole buněk, tedy struktury podobné maticím, ve kterých ovšem každý prvek může být jiného typu. Podobně lze tvořit datové struktury, kde jsou prvky rozlišeny ne souřadnicemi, ale jménem, takže připomínají struktury známé z běžných programovacích jazyků. Skládáním těchto datových typů je pak možné vytvořit libovolně složité datové struktury. MATLAB ukládá všechna čísla v tzv. dvojité přesnosti, ovšem na přání uživatele je možné zvolit úspornější formu. Vektor reálných čísel může v MATLABu reprezentovat i polynom a operace s polynomy jsou v programu rovněž obsaženy. Vektory mohou také reprezentovat časové řady nebo signály a MATLAB obsahuje funkce pro jejich analýzu, jako hledání extrémů, výpočet střední hodnoty, směrodatné odchylky a korelačních koeficientů nebo rychlou Fourierovu transformaci. MATLAB také podporuje speciální formát uložení tzv. řídkých matic, které jsou rozměrem velké, ale obsahují většinu nulových prvků. MATLAB přidává možnost definovat k datovým strukturám funkce, které s nimi pracují. Tyto objekty obohacují výpočetní prostředí MATLABu o prostředky obecných programovacích jazyků a posouvají tak jeho možnosti na úroveň například C++. Spojení objektově orientovaného jazyka s ověřenou matematickou a grafickou silou vytváří z MATLABu bezkonkurenčně ucelený výpočetní systém. Grafika
Grafika v MATLABu umožňuje snadné zobrazení a prezentaci získaných výsledků. Je možné vykreslit různé druhy grafů: dvourozměrné, třírozměrné, histogramy, apod. MATLAB také umožňuje otevřít více oken pro zobrazení grafů najednou nebo zobrazit více grafů v jednom okně. Pro pokročilé uživatele je určeno stínování třírozměrných grafů s určením zdroje dopadajícího světla, animace třírozměrných grafů, zobrazení kontur a mnoho dalších grafických funkcí. Většinu těchto efektů je možné docílit jedním nebo několika málo příkazy a jejich vykreslení je rychlé díky použitému algoritmu Z-buffer. Obrázky v grafických oknech MATLABu navíc nejsou statické – každý již nakreslený objekt má přiřazen identifikátor, jehož prostřednictvím je možné měnit vlastnosti objektu a tím i jeho vzhled. Tento grafický systém, nazvaný Handle Graphics, umožňuje vytvořit v okně také ovládací prvky (tlačítka apod.) a vytvořit tak graficky ovládané uživatelské rozhraní. Samozřejmě je k dispozici nástroj pro vytvoření uživatelského rozhraní interaktivně, bez nutnosti programování. MATLAB dále podstatně rozšiřuje možnosti práce s trojrozměrnými objekty včetně nových technik násvitu, stínování a perspektivních zobrazení objektů. Vysoká kvalita zobrazení je zajištěna použitím 24-bitových barev.
Otevřenost Vlastností, která patrně nejvíce přispěla k rozšíření MATLABu, je jeho otevřená architektura. MATLAB je úplný programovací jazyk, to znamená, že uživatelé v něm mohou vytvářet funkce „šité na míru“ pro jejich aplikace. Tyto funkce se způsobem volání nijak neliší od vestavěných funkcí a jsou uloženy v souborech v čitelné formě. Dokonce většina funkcí s MATLABem dodávaných je takto vytvořena a opravdu vestavěné jsou jen funkce základní. To má dvě velké výhody: jazyk MATLABu je téměř neomezeně rozšiřitelný a kromě toho se uživatel může při psaní vlastních funkcí poučit z algoritmů s programem dodávaných. Navíc jsou takto koncipované funkce snadno přenosné mezi různými platformami, na kterých je MATLAB implementován. Kategorie MATLAB 6.1 (R12.1) z června 2001 poskytuje 24 hlavních kategorií funkcí. Některé MATLABovské funkce jsou obsaženy uvnitř interpreteru, zatímco jiné jsou ve formě m-souborů. M-soubory obsahují pouze pomocný text, jsou organizovány do 24 adresářů, z nichž každý obsahuje soubory sdružené s kategorií. ▲ 2
1.1.1 Hlavní kategorie MATLABovských funkcí audio podpora zvuku datafun analýza dat a Fourierova transformace datatypes datové typy a struktury demos příklady a demonstrace elfun elementární matematické funkce elmat elementární matice a manipulace s maticemi funfun funkce pro práci s funkcemi a ODE řešení general funkce k obecnému použití graph2d dvoudimenzionální (2D) grafika graph3d třídimenzionální (3D) grafika graphics ovládání grafiky iofun soubory vstupu/výstupu lang konstrukce programovacího jazyka matfun maticové funkce – numerická lineární algebra ops operátory a speciální znaky polyfun interpolace a polynomy sparfun řídké matice specfun speciální matematické funkce specgraph speciální grafy strfun znakové řetězce timefun čas a datum uitools nástroje grafického uživatelského rozhraní řízení verze verctrl winfun soubory rozhraní operačního systému Windows (DDE/ActiveX) ▲ V adresáři Matlab6p1\Toolbox\Matlab je uloženo 24 hlavních adresářů, ve kterých jsou jednotlivé příkazy a funkce programu MATLAB. Po spuštění například příkazu help audio, získáte všechny příkazy a funkce sdružené v adresáři audio. Abyste získali podrobný popis jednotlivého příkazu (například colormap), nebo funkce, pak spustíte příkaz help colormap. Jestliže chcete průvodce MATLABem, pak spustíte příkaz intro, a jestliže si chcete prohlédnout demonstrační příklady, pak zadáte příkaz demo. V novější verzi MATLABu (MATLAB R2009b) Vám funguje příkaz help colormap úplně stejně jako ve staré verzi MATLABu. Příkaz intro Vám však poskytne přehled o aktuálně nastavených proměnných a příkaz help audio je nefunkční. Příkaz demo Vám zobrazí celou obrazovku, kde si můžete vybrat, které video, nebo skript si chcete pustit. V nejnovější verzi MATLABu (MATLAB R2014b) Vám příkaz help colormap zobrazí příklady běžného použití a pokud chcete vědět více, tak si musíte spustit Reference page for colormap. Příkazy intro, help audio a demo fungují jako v novější verzi. Co je stará, novější a nejnovější verze MATLABu je podrobněji vysvětleno v úvodu k tomuto učebnímu textu. ▲ 1.1.2 Aritmetické operátory a některé speciální znaky + plus, unární plus – minus, unární minus * násobení matic .* násobení polí; tj. prvků matic ^ umocnění matic .^ umocnění polí \ zpětné lomítko nebo dělení matic zleva / lomítko nebo dělení matic zprava 3
.\ ./ : ( ) [ ] { } . , ; % = '
dělení polí zleva dělení polí zprava dvojtečka kulaté závorky a indexování hranaté závorky složené závorky a indexování desetinná tečka čárka, separátor středník poznámka přiřazení uvozovky
atd. ▲ Nebudeme probírat všechny MATLABovské příkazy a funkce, ale zaměříme se jen na ty nejzákladnější a ty, které souvisí s výukou předmětu Matematika I a II. Přitom text, který je psán v programu MATLAB a výstupy z tohoto programu, budou psány písmem Courier New, názvy m-souborů budou psány tučně a kursivou. V následujících čtyřech tabulkách jsou základní předdefinované funkce trigonometrické, exponenciální, pro komplexní čísla a numerické. Pro Vás jsou povinné pouze ty, které znáte z předmětů Matematika I a II. ▲ 1.1.3 Základní elementární funkce MATLABu Tab. 1.1: Trigonometrické funkce
Funkce
Název funkce
sin sinh asin asinh cos cosh acos acosh tan tanh atan atan2 atanh sec sech asec asech csc csch acsc acsch cot coth acot acoth
sinus hyperbolický sinus arkussinus argument hyperbolického sinu kosinus hyperbolický kosinus arkuskosinus argument hyperbolického kosinu tangens hyperbolický tangens arkustangens čtyř-kvadrantový arkustangens argument hyperbolické tangenty sekans hyperbolický sekans arkussekans argument hyperbolické sekanty kosekans hyperbolický kosekans arkuskosekans argument hyperbolické kosekanty kotangens hyperbolický kotangens arkuskotangens argument hyperbolické kotangenty 4
Příkaz MATLABU sin(3) sinh(3) asin(0.9) asinh(0.4) cos(3) cosh(3) acos(0.4) acosh(2) tan(3) tanh(3) atan(4) atan2(1.1,1) atanh(0.7) sec(3) sech(3) asec(5) asech(0.5) csc(3) csch(3) acsc(5) acsch(4) cot(3) coth(3) acot(3) acoth(7)
Výstup MATLABU 0.1411 10.0179 1.1198 0.3900 -0.9900 10.0677 1.1593 1.3170 -0.1425 0.9951 1.3258 0.8330 0.8673 -1.0101 0.0993 1.3694 1.3170 7.0862 0.0998 0.2014 0.2475 -7.0153 1.0050 0.3218 0.1438
Tab. 1.2: Exponenciální funkce
Funkce
Název funkce
exp log log10 log2 pow2 sqrt atd.
exponenciální funkce přirozený logaritmus dekadický logaritmus logaritmus o základu dvě mocnina o základu dvě druhá odmocnina
Příkaz MATLABU exp(2.7)
Výstup MATLABU
14.8797
log(9.8)
2.2824
log10(10)
1
log2(16)
4
pow2(3)
8
sqrt(16)
4
Příkaz MATLABU abs(-2+3i)
Výstup MATLABU 3.6056
Tab. 1.3: Funkce pro komplexní čísla
Funkce
Název funkce
abs
absolutní hodnota argument komplexního čísla (fázový úhel) sestrojí komplexní číslo z reálné a imaginární části komplexně sdružené číslo imaginární část komplexního čísla reálná část komplexního čísla
angle complex conj imag real atd.
angle(-2+3i)
2.1588
complex(-2,3)
-2.0000+3.0000i
conj(-2+3i) imag(-2+3i) real(-2+3i)
-2.0000–3.0000i 3 -2
Tab. 1.4: Numerické funkce
Funkce fix floor ceil round mod rem sign ▲
Příkaz Výstup MATLABU MATLABU -5 převede na celé číslo tak, že odřízne desetinnou část fix(-5.16) floor(-5.16) -6 zaokrouhlí dolů na nejbližší nižší celé číslo ceil(-5.16) -5 zaokrouhlí nahoru na nejbližší vyšší celé číslo round(-5.16) -5 zaokrouhlí na celé číslo běžným způsobem mod(7,-2) -1 modul (znaménko zbytku po celočíselném dělení) rem(7,2) 1 zbytek po celočíselném dělení sign(-5.16) -1 funkce signum (znaménko funkce)
Název funkce
A nyní Vám konečně ukáži jeden příklad a jeho řešení pomocí MATLABu, abyste si udělali alespoň maličkou představu o tom, co od MATLABu můžete očekávat a co se v něm budete učit. ▲ Motivační příklad Nalezněte obsah plochy, která je ohraničená grafem funkce f : y = x 2 − 5 x + 6 , osou y a úsečkou s krajními body AB, kde A = (0; 0) a B = (3; 0). Výsledek znázorněte graficky. ▲ Řešení Nejprve je vhodné si načrtnout, jak vypadá plocha, jejíž obsah máte vypočítat.
5
Obr.1.1: Náčrtek k řešení motivačního příkladu
Sice špatně, ale vidíte, že musíte vypočítat dva určité integrály, protože jinak byste získali rozdíl plochy ležící nad osou x a ležící pod osou x a ne skutečný obsah. Pro grafické znázornění by bylo dobré barevně vyznačit příslušnou plochu, přímo zapsat výsledek, popř. ještě popsat osy a úsečku AB. Výsledek v MATLABu by pak mohl vypadat například tak, jak vidíte na následujícím obrázku. Protože celý učební text, který právě čtete, je psán proporcionálním patkovým písmem Times New Roman a velikost je 12, tak i v MATLABu bylo použito totéž patkové písmo Times New Roman. ▲ Pokud Vás již nyní zajímá, jak lze takovýto obrázek v MATLABu vytvořit, tak si přečtěte text Pro zájemce, který je uveden pod obrázkem. V příští kapitole se začneme věnovat funkcím systematicky. Podobné grafy a výpočty pak začnete vytvářet sami. Nejprve bez popisů a později i s popisy. Ačkoliv MATLAB není program, který by byl speciálně určen k popisům grafů, tak v něm můžete cokoliv popsat tak, jak potřebujete a není pravda, že nelze v MATLABu psát českou diakritiku, řecká písmena, kursivní znaky, měnit velikost a font písma atd. Vše lze, ale samozřejmě jen tehdy, když se ví jak. ▲ Výsledek
Obr.1.2: Řešení motivačního příkladu ▲
6
Nejprve byla naprogramována nová funkce mot.m. mot.m function[y]=mot(x); y=x.*x-5.*x+6;
Pak byla vypočítána číselná hodnota hledaného plošného obsahu pomocí dvou určitých integrálů P=quad('mot',0,2)-quad('mot',2,3) P = 4.8333
Nakonec byl napsán příslušný m-soubor motivace2.m, ve kterém byla bledě modrou barvou znázorněna příslušná plocha. motivace2.m x1=0:0.01:3; y1=x1.*x1-5.*x1+6; patch([x1 0],[y1 0],'c'); hold on; plot([-1,7],[0,0],'k'); plot([0,0],[-1,7],'b'); x=-1:0.01:7; y=x.*x-5.*x+6; plot(x,y,'b'); plot([0,3],[0,0],'b'); axis square;box off; axis([-1 7 -1 7]); title('\fontname{times new roman ce}Obsah plochy'); text(0.75,6,'\fontname{times new roman ce}Plocha měří přibližně'); text(1,05.5,'\fontname{times new roman ce}4,83 příslušných'); text(1,5,'\fontname{times new roman ce}plošných jednotek.'); text(6.75,0.25,'\fontname{times new roman ce}\itx'); text(0.25,6.75,'\fontname{times new roman ce}\ity'); text(0.25,-0.25,'\fontname{times new roman ce}A'); text(3.25,-0.25,'\fontname{times new roman ce}B'); ▲
Jak již bylo řečeno výše, takovéto obrázky a výpočty budete za chvíli vytvářet sami a zanedlouho všem výše uvedeným příkazům porozumíte. Nejprve ale začneme tím, že si ukážeme, jak se v MATLABu počítají funkční hodnoty elementárních funkcí, tj. ukážeme si, jak používat MATLAB jako výpočetní prostředek, jako takovou „kalkulačku“. ▲ 1.1.4 Výpočty funkčních hodnot Příklad 1.1: Výpočet funkční hodnoty polynomu Vypočítejte funkční hodnotu polynomu x 7 + 3 x 4 + 2 x 2 − 7 pro x = 2 . ▲ Řešení a) Na str. 3-4 jsou uvedeny aritmetické operátory, které lze v MATLABu použít. Můžete tedy postupovat tak, jako na obyčejné kalkulačce a napsat do příkazového řádku MATLABu tj. do Command Window za symbol >> toto: 2*2*2*2*2*2*2+3*2*2*2*2+2*2*2-7
obdržíte výsledek: ans = 177
což budu dále zapisovat do jednoho řádku jako ans = 177
7
b) Můžete také použít symbol pro umocňování, který znáte z Excelu, tj. symbol ^ a napsat: 2^7+3*2^4+2^3-7
obdržíte stejný výsledek: ans = 177
c) Oba výše uvedené příkazy můžete také zadat takto: 2.*2.*2.*2.*2.*2.*2+3.*2.*2.*2.*2+2.*2.*2-7 2.^7+3.*2.^4+2.^3-7
protože nenásobíte matice, ale pole. d) Pokud byste potřebovali vypočítat funkční hodnotu nejen pro x = 2 , ale pro mnohem více různých hodnot x, pak by byl tento postup velice nepraktický a pomalý. V tomto případě zadáte do MATLABu polynom obecně příkazem: p=[1,0,0,3,0,2,0,-7];
To znamená, že do hranaté závorky napíšete koeficienty daného polynomu od nejvyšší mocniny po nejnižší. Samozřejmě, že pokud některá mocnina chybí, tak je koeficient 0 a nesmíte ho zapomenout napsat. Výpočet pak provedete příkazem: polyval(p,2)
opět obdržíte výsledek: ans = 177
Funkční hodnotu například pro x = 5 byste pak získali příkazem: polyval(p,5)
výsledek je
▲
ans = 80043
Výsledek Funkční hodnota polynomu x 7 + 3 x 4 + 2 x 2 − 7 pro x = 2 je 177. ▲ Tip 1.1: Klávesové zkratky Pokud píšete odbornou práci česky, tak je velice nepraktické „přepínat“ neustále klávesnici českou na anglickou a obráceně pouze proto, abyste napsali hranaté závorky, nebo zpětné lomítko atd. V následující tab. 1.5 jsou uvedeny klávesové zkratky, které se velice dobře pamatují a velice Vám usnadní práci. Navíc, ve specializované učebně výpočetní techniky je implicitně nastavena klávesnice česká. Tab. 1.5: Klávesové zkratky
Znak \ @ ~ ^ [ ] { } < >
Název znaku zpětné lomítko zavináč velká tilda stříška levá hranatá závorka pravá hranatá závorka levá složená závorka pravá složená závorka menší než větší než
Klávesová zkratka pravé Alt + q pravé Alt + v pravé Alt + + (pod 1) pravé Alt + š (pod 3) pravé Alt + f pravé Alt + g pravé Alt + b pravé Alt + n pravé Alt + < pravé Alt + >
8
Kód levé Alt + 092 levé Alt + 92 levé Alt + 064 levé Alt + 64 levé Alt + 0126 levé Alt +126 levé Alt + 094 levé Alt + 94 levé Alt + 091 levé Alt + 91 levé Alt + 093 levé Alt + 93 levé Alt + 0123 levé Alt +123 levé Alt + 0125 levé Alt +125 levé Alt + 060 levé Alt + 60 levé Alt + 062 levé Alt + 62 ▲
Jistě Vás nyní napadlo, zda by nešla podobným způsobem provést tabelace funkce například pro hodnoty x = 1, 2, 3, … 20 . Samozřejmě, že odpověď je ano, lze, například pomocí tzv. FOR cyklu, což si ukážeme v jiné kapitole. Nyní, pro zvídavé studující, uvedu pouze příslušný m-soubor tabelace.m. tabelace.m p=[1,0,0,3,0,2,0,-7]; for i=1:20, x(i)=polyval(p,i); end;
V indexované proměnné x jsou, po spuštění tohoto m-souboru, uloženy všechny vypočtené hodnoty. Chcete-li si na monitoru zobrazit například funkční hodnotu pro x = 3 , tak do příkazové řádky MATLABu napište: tabelace; x(3)
a obdržíte výsledek:
▲
ans = 2441
Poznámka 1.1: Použití ovladače „doskey“ V MATLABu funguje ovladač „doskey“, který si pamatuje Vámi napsaný příkaz a lze jej vyvolat kurzorovou šipkou (směr nahoru). Toho s výhodou používejte v případě, že jste udělali nějakou chybu a potřebujete ji opravit, nebo k obměně příkazu, nebo k opětovnému spuštění příkazu atd. ▲ Tip 1.2: Ukončení příkazu čárkou a středníkem Pokud za příkazem v MATLABu není žádný znak (dosud jste tak psali téměř všechny příkazy), tak se výsledek příkazu vypíše na monitor. Pokud byste za příkazem napsali středník, tj. napsali: 2*2*2*2*2*2*2+3*2*2*2*2+2*2*2-7;
tak se Vám výpočet provede, ale výsledek se na monitoru nezobrazí (pouze se uloží do proměnné ans). Pokud za příkazem napíšete čárku, tj. napíšete: 2*2*2*2*2*2*2+3*2*2*2*2+2*2*2-7,
tak se výsledek na monitoru opět objeví. ▲
Tip 1.3: Uložení výsledku do proměnné Pokud v MATLABu napíšte příkaz: y=2*2*2*2*2*2*2+3*2*2*2*2+2*2*2-7
tak se výsledek nejen zobrazí na monitoru, ale zároveň se uloží do proměnné y. Na monitoru uvidíte: y = 177
a po zadání příkazu: y
se vám opět zobrazí:
▲
y = 177
Varování 1.1: 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í. MATLAB rozlišuje velká a malá písmena. ▲ 9
K zamyšlení 1.1 Co se stane, když napíšete y=2*2*2*2*2*2*2+3*2*2*2*2+2*2*2-7;
▲
Řešení Výsledek se na monitoru nezobrazí, ale zůstane uložený v proměnné y a pokud napíšete příkaz: y
tak se Vám na monitoru zobrazí: y = 177
Vyzkoušejte si to! ▲ Upozornění 1.1: Psaní mezer Pokud to nebude výslovně uvedeno, tak nevpisujte do příkazového řádku MATLABu mezery. Mezera ve většině příkazů slouží jako oddělovač a nejčastěji se píše místo čárky. Pokud napíšete například příkaz: 2*2.212 3
tak ve staré verzi MATLABu obdržíte červené chybové hlášení: ??? 2*2.212 3 | Error: Missing operator, comma, or semicolon.
v novější a nejnovější verzi MATLABu pak červené chybové hlášení: ?? 2*2.212 3 | Error: Unexpected MATLAB expression.
pokud ale napíšete příkazy: p=[1 0 0 3 0 2 0 -7]; polyval(p,2)
tak obdržíte správný výsledek: 177 Vy budete mezeru používat většinou pouze u příkazu axis, ale to si povíme později. ▲ Upozornění 1.2: Násobení matic a polí MATLAB rozlišuje násobení matic, pro které má znak * a násobení polí (také se říká násobení po prvcích resp. po složkách), pro které má znak .*. Obdobně rozlišuje / a ./, ^ a .^ atd. Vy jste doposud pracovali s reálnými čísly, které můžete chápat jako matici typu 1× 1 i jako pole délky 1. Nezáleželo tedy na tom, zda napíšete *, nebo .*, protože násobení matic typu 1× 1 se provádí stejně jako násobení polí délky 1. ▲ Varování 1.2: Nezaměňujte násobení matic a polí Při symbolických výpočtech, které budete později provádět NIKDY nesmíte psát .* (tečka hvězdička). Napíšete-li například příkaz: f=sym('x.*x+7')
uvidíte na monitoru, ve všech verzích MATLABu, místo výsledku, červené chybové hlášení. Toto hlášení je v každé verzi poněkud jiné. Ve staré verzi vypadá takto: ??? Error using ==> sym/sym (char2sym) x.*x+7 is not a valid symbolic expression. Error in ==> C:\MATLAB6p1\toolbox\symbolic\@sym\sym.m On line 92 ==> S = char2sym(x);
10
Napíšete-li příkaz: f=sym('x*x+7')
uvidíte na monitoru výsledek: f = x*x+7
Při kreslení grafů naopak VŽDY musíte psát .* (tečka hvězdička). Napíšete-li například posloupnost příkazů: x=0:0.01:2;y=x*x+7;plot(x,y,'b');
zobrazí se Vám, ve všech verzích MATLABu, na monitoru, červené chybové hlášení ??? Error using ==> * Inner matrix dimensions must agree.
Napíšete-li posloupnost příkazů: x=0:0.01:2;y=x.*x+7;plot(x,y,'b');
otevře se Vám nové okno s obrázkem, kde uvidíte toto:
Obr. 1.3: Demonstrace správného použití operátoru .*
Vyzkoušejte si to! ▲ 1.1.5 Zápisy funkcí a operátorů Příklad 1.2: Jednoduché odmocniny a mocniny Vypočítejte a1 = 7 , a 2 = 2 8 , a3 = 4 7 . ▲ Řešení Když se podíváte do tab. 1.2 na str. 5, tak uvidíte předdefinované funkce MATLABu, které Vám úlohu pomohou vyřešit. Můžete postupovat například takto: a) Do příkazové řádky MATLABu napište příkaz: a1=sqrt(7)
na monitoru se zobrazí výsledek: a1 = 2.6458
b) Do příkazové řádky MATLABu napište příkaz: a2=2^8
na monitoru se zobrazí výsledek: a2 = 256
11
c) Protože čtvrtou odmocninu můžete napsat také jako mocninu s exponentem
1 , tak do 4
MATLABu napište příkaz: a3=7^(1/4)
na monitoru se zobrazí výsledek:
▲
a3 = 1.6266
Výsledek Hledané hodnoty jsou: a1 = 7 ≈ 2,645 8 , a 2 = 2 8 = 256 , a3 = 4 7 ≈ 1,626 6 . ▲ Upozornění 1.3: Desetinná tečka MATLAB používá desetinnou tečku a ne desetinnou čárku. ▲ K zamyšlení 1.2 Jakým jiným příkazem lze vypočítat a 2 ? ▲ Řešení Stačí zadat příkaz: ▲
a2=pow2(8)
Příklad 1.3: Algebraické výrazy s mocninami a odmocninami Vypočítejte funkční hodnotu následujících výrazů: z1 = 3 2 3 + 5 4 ; z 2 = 5 7 5 + 2 3 ;
z3 = 7 25 + 34 . ▲
Řešení Stačí do MATLABu zadat příkaz: z1=(2^3+5^4)^(1/3)
na monitoru se zobrazí výsledek: z1 = 8.5862
pak zadejte příkaz: z2=(7^5+2^3)^(1/5)
výsledek je: z2 = 7.0007
a nakonec zadejte příkaz: z3=(2^5+3^4)^(1/7)
výsledek je:
▲
z3 = 1.9647
Výsledek Funkční hodnoty jsou: z1 = 3 2 3 + 5 4 ≈ 8,586 2 ; z 2 = 5 7 5 + 2 3 ≈ 7,000 7 ; z 3 = 7 2 5 + 3 4 ≈ 1,964 7 . ▲
K zamyšlení 1.3 Jakým jiným příkazem lze vypočítat z1 ? ▲ Řešení Můžete napsat příkaz: z1=(2.^3+5.^4).^(1/3)
12
a obdržíte shodný výsledek: ▲
z1 = 8.5862
Tip 1.4: Tabulka hodnot Pokud byste měli obdobných příkladů vypočítat mnohem více, nebo dokonce vygenerovat celou tabulku, tak můžete postupovat mnohem elegantněji a efektivněji. Struktura všech výrazů je vlastně takováto: a x b + y c . Stačí tedy zadat hodnoty proměnných a, b, c, x a y a pak stále stejný příkaz z=(x.^b+y.^c).^(1/a). Například: a=3;b=3;c=4;x=2;y=5;z1=(x.^b+y.^c).^(1/a)
výsledek je: z1 = 8.5862
Zadání všech hodnot a, b, c, x a y lze provést pomocí matice, která bude mít tolik řádků, kolik hodnot z budete chtít vypočítat a sloupců bude mít 5, protože vždy zadáváte 5 hodnot. Výsledky můžete zobrazit na monitor a zároveň uložit pomocí cyklu do indexovaných proměnných. Použití jednoduchého cyklu si ukážeme v dalším cvičení. ▲ Jednoduchý „program“, tzv. m-soubor, který by vyřešil předchozí úlohu a vypočítal 10 hodnot z by mohl vypadat například takto: tabulka.m m=[3,3,4,2,5;5,5,3,7,2;7,5,4,2,3;3,3,5,4,5;5,5,5,5,5;4,4,4,4,4;3,3,3 ,3,3;3,3,4,4,5;4,4,5,6,6;5,5,6,3,3]; for i=1:10, z(i)=(m(i,4)^m(i,2)+m(i,5)^m(i,3))^(1/m(i,1)); end;
V příkazovém řádku MATLABu pak stačí napsat: tabulka; z
a obdržíte výsledek: z = 8.5862 7.0007 9.7595 3.9585
1.9647
14.7192
5.7435
4.7568
3.7798
8.8323
▲
Upozornění 1.4: Lichá odmocnina ze záporného čísla V matematice je definována lichá odmocnina ze záporného čísla pomocí inverzní funkce k funkci lichá mocnina, která je definována pro libovolné reálné číslo a 3 − 8 = −2 , 5 − 243 = −3 atd. V MATLABu pokud zadáte: (-8)^(1/3)
tak obdržíte výsledek ans = 1.0000 + 1.7321i
pokud ale zadáte příkaz: -8^(1/3)
tak obdržíte správný výsledek: ans = -2
protože tento příkaz je identický (při výpočtu) s příkazem: -(8^(1/3))
vypočítá tedy třetí odmocninu z 8 a pak změní znaménko na mínus. Jestliže chcete vypočítat 5 − 243 = −3 , tak stačí zadat příkaz: 13
-(243^(1/5))
a obdržíte správný výsledek: ▲
-3
Příklad 1.4: Výrazy obsahující logaritmy Vypočítejte funkční hodnoty následujících výrazů: b1 = lg 24,589 ; b2 = ln 4,875 ; b3 = log 5 3,457 ; b4 = log 1 3,564 . ▲ 3
Řešení Dekadický logaritmus se počítá pomocí předdefinované funkce log10, a proto stačí napsat příkaz: b1=log10(24.589)
a obdržíte výsledek: b1 = 1.3907
Přirozený logaritmus se počítá pomocí předdefinované funkce log, a proto stačí napsat příkaz: b2=log(4.875)
a obdržíte výsledek: b2 = 1.5841
Protože platí matematický vztah log b a =
ln a , tak lze zbývající dvě hodnoty vypočítat ln b
například takto: b3=log(3.457)/log(5)
a dostanete výsledek: b3 = 0.7707
napíšete-li příkaz: b4=log(3.564)/log(1/3)
dostanete výsledek:
▲
b4 = -1.1568
Výsledek Funkční hodnoty jsou tyto: b1 = log 24,589 ≈ 1,390 7 ; b2 = ln 4,875 ≈ 1,584 1 ; b3 = log 5 3,457 ≈ 0,770 7 ; b4 = log 1 3,564 ≈ −1,156 8 . ▲ 3
Upozornění 1.5: Dekadický a přirozený logaritmus Nepleťte si v MATLABu symboly pro jednotlivé logaritmy. V matematice je přirozený logaritmus ln v MATLABu log. Dekadický logaritmus je v matematice lg (na některých školách se ještě používá log), v MATLABu je log10. V matematice je binární (logaritmus o základu 2) lb, v MATLABu je log2. Symbol ln MATLAB nezná. ▲ Pokud se Vám nelíbí, jak je nutné zadávat příkaz pro výpočet například b3 = log 5 3,457 , tak si v MATLABu můžete vytvořit vlastní funkci, do které zadáte například nejprve hodnotu proměnné x a pak základ z a výsledkem bude logaritmus o základu z. Jak se to udělá? Napíšete například níže uvedený m-soubor logz.m a pak stačí zadat příkaz: b3=logz(3.457,5)
14
a obdržíte výsledek: b3 = 0.7707
logz.m function[y]=logz(x,z); y=log(x)./log(z);
▲
1.1.6 Exponenciální funkce Příklad 1.5: Výrazy obsahující exponenciální funkci o základu e
1
1
3+ 3 Vypočítejte funkční hodnoty následujících výrazů: c1 = 3 ; c 2 = e 8 + e 4 ; c3 = e 7 . ▲ e
Řešení Stačí zadat příkaz: c1=3/exp(3)
a obdržíte výsledek: c1 = 0.1494
po zadání příkazu: c2=exp(8)+exp(1/4)
obdržíte výsledek: c2 = 2.9822e+003
což je semilogaritmický tvar 2,982 2 ⋅ 10 3 desetinného čísla 2 982,2 a nakonec po zadání příkazu: c3=exp(3+1/7)
obdržíte výsledek:
▲
c3 = 23.1700
Výsledek 1
1
3+ 3 Funkční hodnoty jsou: c1 = 3 ≈ 0,149 4 ; c 2 = e 8 + e 4 ≈ 2 982,2 , c3 = e 7 ≈ 23,170 0 . ▲ e
Poznámka 1.2: Zobrazení dalších desetinných míst Pokud byste potřebovali číslo c 2 na více desetinných míst, tak stačí zadat například příkaz: c2=num2str(c2,10)
a dostanete výsledek: c2 = 2982.242012
Můžete pak psát, že c2 ≈ 2 982,242 012 . ▲ Výše uvedený příkaz num2str není jediná možnost, jak můžete vypočítané číslo zobrazit v jiném formátu. Jestliže si zadáte příkaz: help format
tak získáte přehled o všech možnostech ve Vaší verzi MATLABu. Zadáte-li například příkaz: format long, c2
tak se Vám číslo c 2 zobrazí ve stejném semilogaritmickém tvaru, jako bez zadání příkazu format, ale vypíše se Vám, ve všech verzích MATLABu, 15 desetinných míst:
15
c2 = 2.982242012458416e+003
což je 2,982 242 012 458 416 ⋅ 10 3 = 2 982,242 012 458 416 . ▲ 1.1.7 Trigonometrické funkce Příklad 1.6: Hodnoty goniometrických a cyklometrických funkcí Vypočítejte u1 = cos 3 , u 2 = arcsin 0,584 , u 3 = sin 37° . ▲ Řešení První dvě hodnoty vypočítáte snadno. Zadejte nejprve příkaz: u1=cos(3)
a obdržíte výsledek: u1 = -0.9900
po zadání příkazu: u2=asin(0.584)
obdržíte výsledek: u2 = 0.6236
Ve třetím případě musíte nejprve 37 stupňů převést na radiány, protože MATLAB implicitně počítá pouze s radiány. Protože 180° ……….. π radiánů, 37° ……… x radiánů, 37 tak x = π ⋅ v radiánech a stačí tedy napsat příkaz: 180 u3=sin(37*pi/180)
a obdržíte výsledek: ▲
u3 = 0.6018
Výsledek Funkční hodnoty jsou tyto: u1 = cos 3 ≈ −0,990 0 ; u 2 = arcsin 0,584 ≈ 0,623 6 ; u 3 = sin 37° ≈ 0,601 8 . ▲ Varování 1.3: Funkční hodnoty arkuskotangens Z matematiky znáte funkci f −1 : y = arccot x jako inverzní funkci k funkci f : y = cot x , kde
( ) = (0; π ) a H ( f ) = D( f ) = R . Jestliže ale v MATLABu zadáte příkaz:
D( f ) = H f
−1
−1
acot(0)
tak se ve staré verzi MATLABu objeví hlášení: Warning: Divide by zero. In C:\MATLAB6p1\toolbox\matlab\elfun\acot.m at line 8 ans = 1.5708
zatímco v novější a nejnovější verzi MATLABu získáte správný výsledek: ans = 1.5708
víte totiž, že arccot 0 =
π π ≈ 1,570 8 , protože cot = 0 . 2 2
Pokud zadáte příkaz: h=acot(-5)
tak ve všech třech verzích MATLABu získáte výsledek:
16
h = -0.1974
( ) = (0; π ) .
což ale víte, že je chybně, protože D( f ) = H f kontrolu“, tj. zadáte příkaz:
−1
Jestliže si uděláte „jakoby
cot(h)
tak opět ve všech třech verzích MATLABu získáte výsledek: ans = -5
Jak je to možné? Pokud se pokusíte v MATLABu vykreslit funkci y = arccot x pomocí příkazu acot(x), tak ve všech třech verzích MATLABu dostanete nesmysl, který je na obr. 1.4, protože to není vůbec graf funkce (pro x = 0 máte více funkčních hodnot). V novém MATLABu se neobjeví žádné hlášení, takže studující, kteří tuto funkci neznají si myslí, že mají správný graf.
Obr. 1.4: První pokus o graf funkce arkuskotangens Ve starém MATLABu obdržíte hlášení: Warning: Divide by zero. In C:\MATLAB6p1\toolbox\matlab\elfun\acot.m at line 8 In C:\MATLAB6p1\work\ark1.m at line 5
ale protože toto hlášení je „černé“ a MATLAB „něco kreslí“, tak studující, kteří tuto funkci neznají, mají tendenci chybu ignorovat a opět si chybně myslí, že mají správný graf. Chyba upozorňuje pouze na dělení nulou a bohužel, ani po jejím odstranění, nedostanete správný graf. Takový graf by vypadal tak, jak je zobrazen na obr. 1.5. Novější i nejnovější verze MATLABu Vám v příkazové řádce nehlásí žádnou chybu a tak si téměř všichni studující, kteří tuto funkci neznají, myslí, že mají správný graf, což bohužel není pravda.
17
Obr. 1.5: Druhý pokus o graf funkce arkuskotangens Správný graf je až na následujícím obrázku:
Obr. 1.6: Graf funkce arkuskotangens Vidíte tedy, že hodnota arccot (− 5) musí být téměř 3. A jak je to s funkcí kotangens? Její graf vypadá takto:
18
Obr. 1.7: Graf funkce kotangens Vidíte tedy, že funkční hodnota cot(h) , kde h ≈ −0,197 4 je přibližně –5, ale správnou funkční hodnotu arccot (− 5) musíte vypočítat pomocí příkazu: acot(-5)+pi
a konečně obdržíte správný výsledek:
▲
ans = 2.9442
Pokud by vás zajímalo, jak se výše uvedené grafy nakreslí, tak si prostudujte m-soubory ark1.m, ark2.m, ark3.m a ark4.m. Pokud byste si chtěli vytvořit vlastní funkci, která bude „počítat“ i „kreslit“ správně funkci arccot x , tak si stačí napsat níže uvedený m-soubor arccot.m, a pak stačí zadat příkaz: h=arccot(-5)
a obdržíte výsledek: h = 2.9442
arccot.m function[y]=arccot(x) y=pi/2-atan(x);
π − arctan x . Z tohoto důvodu se také 2 v praxi s funkcí arccot x téměř nesetkáte, zato s funkcí arctan x se setkáte velice často. Protože definiční obor funkce arctan x je celé R, tak je to nejčastěji používaná cyklometrická funkce. ▲ protože pro libovolné reálné číslo platí, že arccot x =
1.1.8 Převod radiánů na stupně, minuty a vteřiny Příklad 1.7: Převod radiánů na stupně, minuty a vteřiny Víte, že cos ϕ = x , jaký je úhel ϕ ∈ (0; π ) v radiánech a ve stupních, minutách a vteřinách, jestliže x je postupně −
3 ; 0,245 8; – 0,687 4 ? ▲ 2
19
Řešení Nejprve zadejte do MATLABu první hodnotu x, tj. napište příkaz: x=-sqrt(3)/2
zobrazí se Vám: x = -0.8660
pak vypočítejte úhel z v radiánech, tj. napište příkaz: z=acos(x)
získáte výsledek: z = 2.6180
který je samozřejmě v radiánech. Protože 180° ……….. π radiánů, x° ………. 2, 618 0 radiánů, 2,618 0 ve stupních. Když zadáte příkaz: tak x ≈ 180 ⋅ π y=180*z/pi
nebo: y=180*acos(x)/pi
tak dostanete výsledek: y = 150.0000
který je již ve stupních. Podobně zadejte příkaz: x=0.2458
zobrazí se Vám: x = 0.2458
po zadání příkazu: z=acos(x)
dostanete: z = 1.3225
což je v radiánech. Po zadání příkazu: z=180*z/pi
dostanete: z = 75.7709
ve stupních, ale výsledek je nutné ještě převést na minuty a vteřiny. Protože 1° ………………. 60 minut, 0,770 9°………… x minut, tak x ≈ 60 ⋅
0,770 9 minut. Když zadáte příkaz: 1
0.7709*60
dostanete: ans = 46.2540
minut, ale tím jste se dopustili dosti velké nepřesnosti, protože jste použili pouze čtyři
20
desetinná místa, která vidíte, tedy číslo zaokrouhlené na čtyři desetinná místa. Vhodnější a přesnější je proto použít příkaz: m=(z-75)*60
a obdržíte výsledek: m = 46.2530
minut a analogicky pak provedete převod na vteřiny. Zadáte příkaz: (m-46)*60
dostanete: ans = 15.1818
vteřin. Podobně pro poslední hodnotu x, ale již rychleji. Zadejte nejprve příkazy: x=-0.6874;z=acos(x),
a obdržíte hledaný výsledek v radiánech: z = 2.3287
nyní zadejte příkaz: z=180*z/pi
a dostanete výsledek ve stupních z = 133.4246
nyní zadejte příkaz: m=(z-133)*60
a dostanete počet minut: m = 25.4788
po zadání příkazu: (m-25)*60
získáte, po zaokrouhlení na celky, příslušný počet vteřin ▲
28.7295
Výsledek 3 , tak úhel ϕ ≈ 2,618 0 radiánů, což je 150°0´0˝. 2 Jestliže x = 0,245 8 , pak úhel ϕ ≈ 1,322 5 radiánů, což je přibližně 75°46´15˝. Jestliže x = –0,687 4 , pak úhel ϕ ≈ 2,328 7 radiánů, což je přibližně 133°25´29˝. ▲
Jestliže x = −
Na svých kalkulačkách máte většinou možnost přepnout klávesnici tak, abyste mohli argumenty goniometrických funkcí (úhly) zadávat přímo ve stupních a také tak, abyste hodnoty inverzních funkcí (cyklometrických) získali rovnou ve stupních, minutách a vteřinách. Nemusíte tedy myslit na převodní vztahy a nemusíte s nimi vůbec pracovat. V MATLABu tomu tak není, musíte s převodními vztahy pracovat, a to se většině z Vás nelíbí. Určitě byste přivítali nějaké „tlačítko“, které by fungovalo podobně, jako Vaše kalkulačka. Bohužel, o takovém „tlačítku“ nevím, ale můžete si vytvořit nové goniometrické funkce, do kterých lze zadávat úhel přímo ve stupních a nové cyklometrické funkce, ze kterých získáte hledaný úhel přímo ve stupních, minutách a vteřinách. Než Vám ale vytvoření těchto nových funkcí ukáži, tak si vytvoříte jednoduchý m-soubor, který, po zadání hodnoty x = cos ϕ , Vám na monitor vypíše velikost úhlu ϕ přímo ve stupních, minutách a vteřinách. ▲
21
K zamyšlení 1.4 K čemu Vám to bude? Použijete to někdy? ▲ Řešení
u⋅v . Když jste u⋅v u⋅v počítali vnitřní úhel v trojúhelníku, tak jste používali stejný vzorec cos ϕ = . Když jste u⋅v počítali úhel dvou přímek, tak jste nalezli směrové vektory u, v, obou přímek a použili vztah u⋅v cos ϕ = . Když jste hledali úhel dvou rovin, tak jste nalezli normálové vektory obou u⋅v
Když jste počítali úhel dvou vektorů u, v, tak jste používali vzorec cos ϕ =
rovin u, v a použili vztah cos ϕ =
u⋅v
. Když jste hledali úhel, který svírá přímka s rovinou, u⋅v tak jste nalezli směrový vektor přímky u, normálový vektor roviny v a použili vztah u⋅v u⋅v π sin ϕ = , nebo jste vypočítali cosψ = a hledaný úhel ϕ = − ψ . Vidíte tedy, že u⋅v u⋅v 2 ve všech výše uvedených případech jste nejprve získali hodnotu cos ϕ a Vašim úkolem bylo nalézt úhel ϕ ve stupních, minutách a vteřinách. Ve všech výše uvedených případech byste tedy s výhodou použili tento m-soubor a v PC ho použijete k vytvoření některých nových funkcí, v řešení DU1 a ve cvičení věnovaném vektorům. ▲ Příklad 1.8: Program prevodx.m Napište „program“ (m-soubor, skript), který při zadání hodnoty x = cos ϕ vypíše na monitor velikost úhlu ϕ ∈ (0; π ) ve stupních, minutách a vteřinách. ▲ Řešení V otevřeném okně staré verze MATLABu zvolte na nástrojové liště nabídku File, podnabídku New a zde nabídku M-file. Otevře se Vám nové okno, do kterého budete psát níže uvedené příkazy. V otevřeném okně novější verze MATLABu zvolte na nástrojové liště nabídku File, podnabídku New a zde nabídku Black M-File. Opět se Vám otevře nové okno, do kterého budete psát níže uvedené příkazy. U nejnovější verze MATLABu máte na nástrojové liště přímo nabídku New, vyberete podnabídku Skript a napíšete následující příkazy: z=acos(x); z=180*z/pi; stupnu=fix(z); p=(z-stupnu)*60; minut=fix(p); vterin=round((p-minut)*60); stupnu,minut,vterin,
Těchto sedm řádků uložte pod názvem prevodx (File, Save As, do Název souboru napíšete prevodx a Uložit). Pokud máte MATLAB nainstalován pod operačním systémem Windows XP, tak ve staré verzi MATLABu se Vám soubor implicitně uloží na Váš disk do adresáře Matlab6p1/work. Novější i nejnovější verze MATLABu vytvoří na Vaší ploše (Document and Settings/uživatel) v implicitním adresáři Dokumenty adresář MATLAB a soubor se uloží do něho. Z těchto adresářů se také všechny m-soubory implicitně spouštějí. Pokud si budete chtít m-soubory ukládat na jiné místo, tak je to možné, ale musíte si pak nastavit například Current Directory (na nástrojové liště otevřeného okna MATLABu) do tohoto adresáře. Chcete-li tedy nalézt velikost úhlu ϕ , pro který platí, že cos ϕ = 0,245 8 , tak stačí do příkazového řádku MATLABu napsat:
22
x=0.2458;prevodx
a obdržíte hledaný výsledek: stupnu = 75 minut = 46 vterin = 15
Co znamenají jednotlivé řádky m-souboru a jednotlivé příkazy? V prvním řádku do proměnné z uložíte vypočítaný úhel z v radiánech pomocí funkce acos. Ve druhém řádku převádíte radiány na stupně, které jsou ale vyjádřeny desetinným číslem z. Funkce fix(z) odtrhne, bez zaokrouhlení, celou část desetinného čísla a toto celé číslo, které představuje celé stupně, uloží do proměnné stupnu. Ve čtvrtém řádku odečtete od z (stupně vyjádřené desetinným číslem) stupně, takže máte pouze číslice za desetinnou čárkou, a abyste dostali minuty, tak je vynásobíte 60. Desetinné číslo, které představuje minuty, uložíte do proměnné p. V pátém řádku funkcí fix(p) odtrhnete celou část desetinného čísla p, které představuje minuty a uložíte ho do proměnné minut, máte tedy v proměnné minut celé minuty. V předposledním řádku od desetinného čísla, představujícího minuty, odečtete celé minuty, vynásobíte 60, čímž dostanete vteřiny. Abyste nedostali vteřiny jako desetinné číslo, tak zároveň funkcí round zaokrouhlíte, běžným matematickým způsobem, toto číslo a uložíte do proměnné vterin. V prvním až šestém řádku jste na konci napsali středník, což znamená, že se tyto pomocné výpočty nebudou zobrazovat na monitoru. V posledním řádku jste za všechny proměnné napsali čárku, takže se na monitor jejich hodnoty vypíší. V příkazovém řádku MATLABu musíte nejprve do proměnné x uložit hodnotu funkce kosinus, což jste učinili příkazem x=0.2458 a pak jste spustili m-soubor prevodx.m. Název jsem volila tak, aby i za půl roku bylo zřejmé, že tento m-soubor něco převádí, a že to, co převádí, je v proměnné x. ▲ Výsledek Výsledkem je m-soubor prevodx.m, který při zadání hodnoty x = cos ϕ zobrazí na monitoru velikost tohoto úhlu ϕ ve stupních, minutách a vteřinách. ▲ K zamyšlení 1.5 Co se stane, pokud byste místo příkazu x=0.2458;prevodx napsali pouze příkaz 0.2458;prevodx? ▲ Řešení S velkou pravděpodobností by Vám vyšlo, že hledaný úhel ϕ je přibližně 133°25´29˝. Proč? Protože jste do proměnné x neuložili číslo 0,245 8, tak MATLAB použil to, co mu zůstalo v x uloženo. Protože naposledy jste napsali x=-0.6874, tak v proměnné x máte uloženo číslo –0,687 4. Váš program prevodx tedy nalezne hodnotu úhlu, jehož kosinus je roven –0,687 4 a ne 0,245 8. Pokud se Vám tedy v MATLABu stane, že nedostáváte odpovídající výsledky, tak je dobré nejprve smazat všechny proměnné. U obrázků je zase vhodné, zavřít všechny obrázky atd. Tyto jednoduché, ale důležité příkazy jsou uvedeny v tab. 1.6. Tab. 1.6: Užitečné příkazy MATLABu
Příkaz path clear close pause ▲
Význam nastaví vyhledávací cestu, například do jiného pracovního adresáře vymaže z paměti všechny proměnné a funkce zavře grafické okno pozastaví probíhající proces, nejčastěji m-soubor
23
Poznámka 1.3: Poznámky v m-souboru Až budete psát své vlastní m-soubory, tak můžete někdy potřebovat, zvláště u složitějších programů, napsat poznámku přímo do m-souboru. V tom případě stačí na začátek řádku napsat symbol % a to, co bude následovat za tímto symbolem, až do konce řádky, MATLAB neprovádí, verifikuje to jako poznámku a tento text, včetně symbolu %, navíc zvýrazní zelenou barvou. ▲ Nyní se vrátíme k vytvoření nových goniometrických funkcí, do kterých byste mohli úhly zadávat přímo ve stupních a k vytvoření nových cyklometrických funkcí, ze kterých získáte hledaný úhel přímo ve stupních, minutách a vteřinách. ▲ Tip 1.5: Nové goniometrické a cyklometrické funkce Nejprve vytvoříme novou goniometrickou funkci dsin, do které bude možné zadávat úhly přímo ve stupních. Napište si tedy tento m-soubor: dsin.m function[y]=dsin(x); y=sin(pi*x/180);
Když nyní do příkazové řádky napíšete: dsin(30)
tak se Vám zobrazí hodnota sin (30°) ans = 0.5000
Podobně vytvoříte ostatní funkce dcos, dtan, dcot: dcos.m function[y]=dcos(x); y=cos(pi*x/180);
dtan.m function[y]=dtan(x); y=tan(pi*x/180);
dcot.m function[y]=dcot(x); y=cot(pi*x/180);
U cyklometrických funkcí arcsin, arccos a arctan nenarazíte na žádný problém a využijete všech sedm řádků z m-souboru prevodx.m dasin.m function[y]=dasin(x); z=asin(x); z=180*z/pi; stupnu=fix(z); p=(z-stupnu)*60; minut=fix(p); vterin=round((p-minut)*60); stupnu,minut,vterin,
dacos.m function[y]=dacos(x); z=acos(x); z=180*z/pi; stupnu=fix(z); p=(z-stupnu)*60; minut=fix(p); vterin=round((p-minut)*60); stupnu,minut,vterin,
24
datan.m function[y]=datan(x); z=atan(x); z=180*z/pi; stupnu=fix(z); p=(z-stupnu)*60; minut=fix(p); vterin=round((p-minut)*60); stupnu,minut,vterin,
O funkci arccot x, která je předdefinována v MATLABu (acot(x)) víte, že neodpovídá tomu, jak je definována v matematice. Obě definice se shodují pouze pro kladná reálná čísla. Při použití předdefinované funkce acot(x) byste tedy dostali shodné výsledky pouze pro kladné hodnoty (Varování 1.3). Aby Vaše funkce arccot x odpovídala matematické definici, tak pro vytvoření této funkce využijete navíc m-soubor arccot.m. dacot.m function[y]=dacot(x); z=pi/2-atan(x); end; z=180*z/pi; stupnu=fix(z); p=(z-stupnu)*60; minut=fix(p); vterin=round((p-minut)*60); stupnu,minut,vterin,
▲
K zamyšlení 1.6 Co když budete mít úhel zadán nejen ve stupních, ale i v minutách a vteřinách? Jak například úhel 25°34´24˝zadáte do funkce dsin? ▲ Řešení Máte dvě možnosti. Buď zadaný úhel převedete na stupně, nebo si vytvoříte funkci ddsin, do které byste mohli přímo vkládat stupně, minuty i vteřiny. Jak převedete 25°34´24˝ na stupně? 34 24 24 Uvědomte si, že 34´ je ve skutečnosti stupně a 24˝ je minuty, což je stupně. 60 60 3 600 34 24 Tedy 25°34´24˝ je 25 + + ≈ 25,573 3 stupňů. Do příkazové řádky MATLABu stačí 60 3 600 zadat příkaz: dsin(25+34/60+24/3600)
a obdržíte výsledek: ans = 0.4317
Druhá možnost je vytvoření funkce ddsin, stačí napsat tento m-soubor:
ddsin.m function[y]=ddsin(x,y,z); y=sin((x+y/60+z/3600)*pi/180);
pak stačí zadat příkaz: ddsin(25,34,24)
a obdržíte stejný výsledek: 0.4317
▲
Poznámka 1.4: Klíčová slova v m-souboru Pokud patříte mezi zvídavé a zkusili jste si některé nepovinné m-soubory napsat, nebo jste si zkusili napsat alespoň výše uvedené nové goniometrické a cyklometrické funkce, tak jste 25
zjistili, že některá slova změní barvu. Například tzv. klíčová slova jako je function, if, else, end atd. se Vám zabarví modře a dokonce se Vám tato slova odsadí, aby bylo na první pohled vidět, která klíčová slova k sobě „patří“. Text, který napíšete do uvozovek, se Vám ve staré verzi MATLABu zabarví „hnědočerveně“, v novějších verzích „fialovomodře“. V novějších verzích MATLABu se Vám stejnou „fialovomodrou“ barvou budou zabarvovat i slova jako square, on, off atd. Toto barvené rozlišení s případným odsazením Vám ihned napoví, kde jste udělali syntaktickou chybu a pomůže Vám nalézt i chybu logickou. ▲ Varování 1.4: Názvy m-souborů 1. MATLAB rozlišuje velká a malá písmena. Napíšete-li pr, Pr, PR, pR, tak jsou to čtyři různé proměnné a ne jedna. 2. Na začátku názvu m-souboru musí být nějaké písmeno, ne číslice. 3. Název m-souboru musí splňovat stejná pravidla jako název proměnné Varování 1.1. Nelze proto používat v názvech m-souborů háčky, čárky, mezery atd., protože by Vám pak m-soubory nešly spustit. 4. Není vhodné používat zkratky anglických názvů. Neznáte všechny předdefinované funkce v MATLABu a tak by se Vám snadno mohlo stát, že použijete název, který patří předdefinované funkci. V tomto případě se MATLAB bude snažit vykonat předdefinovanou činnost. Pak buď budete mít štěstí a nebude souhlasit ani počet parametrů a Vy tak poznáte, co se stalo. Nebo náhodou bude souhlasit počet parametrů a pak budete získávat nepochopitelné výsledky a těžko hledat chybu. Například v motivačním příkladě byla použita kvadratická funkce, kterou jsem nazvala mot. Nejmenovanému studentovi se tento název nelíbil, a protože se do angličtiny kvadratická funkce dá přeložit jako „quadratic function“, tak funkci nazval quad. Co se stalo? Při napsání a uložení m-souboru vůbec nic, ale při pokusu funkci zobrazit, nebo vypočítat funkční hodnotu, dostal pouze chybová hlášení. Proč? Protože quad je název předdefinované funkce, která počítá určitý integrál, což je vidět u motivačního příkladu u výpočtu obsahu plochy. 5. Doporučuji používat zkratky českých názvů bez háčků a čárek. Než nějaký m-soubor odladíte, tak s výhodou můžete používat názvy jako pok, pok1, pok2 atd. ▲ AUTOTEST 1. Vypočítejte funkční hodnoty polynomu p = x 8 + 14 x 5 + 7 x 2 + 12 x − 125 , pro x = 1, 3, 5, 8, 13, –3, –5, –7, –8, –11, –13. 2. Vypočítejte čtvrtou odmocninu ze dvou třetin, sedmou odmocninu ze sedmnácti čtvrtin a dvacátou odmocninu ze sedmi devítin. 3. Vypočítejte sedmou odmocninu ze součtu druhé mocniny 8 a druhé odmocniny ze 7. 4. Vypočítejte logaritmus o základu 12 z čísla 4,285. Určete přirozený a dekadický logaritmus čísla 4,285. 5. Vypočítejte sinus, kosinus, tangens a kotangens 48°35´27˝. Výsledky udávejte s přesností na čtyři desetinná místa. 6. Vypočítejte e 7 + e 3 − e 5 s přesností na 8 desetinných míst. 7. Víte, že sin z = 0,624 8. Vypočítejte tento úhel z nejprve v radiánech a pak ve stupních, minutách a vteřinách. 8. Napište program, který ze znalosti sinu úhlu z ∈ (0; π ) určí tento úhel nejprve v radiánech a pak ve stupních, minutách a vteřinách a na monitor zobrazí výsledek jak v radiánech, tak i ve stupních, minutách a vteřinách. 9. Uveďte alespoň jeden příklad, kde lze využít program prevodx.m. 10. Jaký výsledek by se měl zobrazit na monitoru, napíšete-li do příkazového řádku MATLABu následují text? pr=25+12-7;Pr=12-5*3;pr=Pr;Pr+pr ▲
26
Řešení 1. p=[1,0,0,14,0,0,7,12,-125];polyval(p,1), ans = -91 polyval(p,3), ans = 9937 polyval(p,5), ans = 434485 polyval(p,8), ans = 17236387 polyval(p,13), ans = 820930037 polyval(p,-3), ans = 3061 polyval(p,-5), ans = 346865 polyval(p,-7), ans = 5529637 polyval(p,-8), ans = 16318691 polyval(p,-11), ans = 212104757 polyval(p,-13) ans = 810533521
2. (2/3)^(1/4), ans = 0.9036 (17/4)^(1/7), ans = 1.2296 (7/9)^(1/20) ans = 0.9875
3. (8*8+sqrt(7))^(1/7) ans = 1.8220
4. log(4.285)/log(12), ans = 0.5856 log(4.285), ans = 1.4551 log10(4.285) ans = 0.6320
5. x=(48+35/60+27/3600)*pi/180 x = 0.8481 sin(x), ans = 0.7500 cos(x), ans = 0.6614 tan(x), ans = 1.1339 cot(x) ans = 0.8819
27
6. v=exp(7)+exp(3)-exp(5);num2str(v,11), ans = 968.30553625
7. z=asin(0.6248) z = 0.6749 v radiánech z*180/pi ans = 38.6675 ve stupních 0.6675*60 ans = 40.0500 0.0500*60 ans = 3
8. prevodasinx.m z=asin(x); radianu=z; z=180*z/pi; stupnu=fix(z); p=(z-stupnu)*60; minut=fix(p); vterin=round((p-minut)*60); radianu,stupnu,minut,vterin,
V MATLABu stačí zadat: x=0.6248;prevodasinx radianu = 0.6749 stupnu = 38 minut = 40 vterin = 3
9. Například když počítáte úhel dvou vektorů, úhel dvou přímek, vnitřní úhly trojúhelníka, úhel přímky s rovinou, úhel dvou rovin atd. 10. pr = 30, Pr = –3, pr = –3, Pr + pr = –3 – 3 = –6. Objeví se číslo –6. ▲ Výsledek 1. Hodnoty jsou p(1) = –91, p(3) = 9 937, p(5) = 434 485, p(8) = 17 236 387, p(13) = 820 930 037, p(–3) = 3 061, p(–5) = 346 865, p(–7) = 5 529 637, p(–8) = 16 318 691, p(–11) = 212 104 757, p(–13) = 810 533 521. 2. Čtvrtá odmocnina ze dvou třetin je přibližně 0,903 6, sedmá odmocnina ze sedmnácti čtvrtin je přibližně 1,229 6 a dvacátá odmocnina ze sedmi devítin je přibližně 0,987 5. 3. Sedmá odmocnina ze součtu druhé mocniny 8 a druhé odmocniny ze 7 je přibližně 1,822 0. 4. Logaritmus o základu 12 z čísla 4,285 je přibližně 0,585 6, přirozený logaritmus tohoto čísla je přibližně 1,455 1 a jeho dekadický logaritmus je přibližně 0,632 0. 5. Sinus 48°35´27˝ je přibližně 0,750 0, kosinus tohoto úhlu je přibližně 0,661 4, tangens 1,133 9 a kotangens 0,881 9. 6. e 7 + e 3 − e 5 je s přesností na 8 desetinných míst rovno 968,305 536 25. 7. Úhel z je přibližně 0,674 9 radiánů, což je přibližně 38°40´3˝. 8. prevodasinx.m z=asin(x); radianu=z; z=180*z/pi; stupnu=fix(z);
28
p=(z-stupnu)*60; minut=fix(p); vterin=round((p-minut)*60); radianu,stupnu,minut,vterin,
9. Například když počítáte úhel dvou vektorů, úhel dvou přímek, vnitřní úhly trojúhelníka, úhel přímky s rovinou, úhel dvou rovin atd. 10. Objeví se číslo –6. ▲ Shrnutí V této první kapitole jste viděli, jak lze využít program MATLAB při hledání obsahu plochy a naučili jste se: 1. vypočítat funkční hodnotu polynomu, 2. počítat hodnoty odmocnin, 3. počítat hodnoty algebraických výrazů, které obsahují mocniny a odmocniny, 4. počítat funkční hodnoty logaritmických výrazů, 5. počítat hodnoty výrazů, které obsahují exponenciální funkci, 6. počítat hodnoty goniometrických a cyklometrických funkcí, 7. převádět stupně na radiány, 8. převádět radiány na stupně, minuty a vteřiny, 9. napsat jednoduchý m-soubor, který ze znalosti hodnoty kosinu úhlu určí tento úhel ve stupních, minutách a vteřinách. Naučili jste se tedy používat MATLAB jako „kalkulačku“, která Vám vypočítá hodnotu jakéhokoliv algebraického výrazu a poznali jste, jak v tomto prostředí napsat jednoduchý m-soubor. ▲ Další zdroje MATLAB CREATIVE TEAM. MATLAB The Language of Technical Computing. USA: Natick, The MathWorks, Inc., November 2000. Fifth printing. MA 01760-2098 USA. POLCEROVÁ, Marie. Doprovodný text k počítačovým cvičením Matematika I. Brno: Fakulta chemická, Vysoké učení technické v Brně, 2001. POLCEROVÁ, Marie a Jaroslav BAYER. Analytická geometrie v příkladech. Brno: Vysoké učení technické v Brně, Fakulta chemická, 2004, ISBN 80-214-1793-5. POLCEROVÁ, Marie. Prezentace cvičení č. 1. In: Vysoké učení technické v Brně, e-learning, Kurz: Matematika I (BCT_MAT1 15/16Z) [online], 2015 [cit. 2015-09-19]. Dostupné z: https://moodle.vutbr.cz/ POLCEROVÁ, Marie. Prezentace cvičení č. 1. In: Fakulta chemická Vysokého učení technického v Brně, Matematika I [online], 2015 [cit. 2015-09-20]. Dostupné z: https://www.fch.vutbr.cz/~polcerova/▲ Klíčová slova M-soubor MATLAB umožňuje provést posloupnost příkazů uložených v souborech na disku. Tyto soubory se nazývají „m-soubory“, protože musí mít příponu „m“. Z příkazové řádky MATLABu se spouští napsáním jména souboru bez zmíněné přípony. Existují dva typy m-souborů: skriptové soubory (skripty) a funkční soubory (funkce). Skriptový soubor (skript) se skládá z posloupnosti běžných MATLABovských příkazů. Máte-li např. m-soubor rotat.m, pak, když napíšete rotat v příkazové řádce MATLABu, tak se Vám provedou všechny příkazy obsažené v m-souboru rotat.m. Proměnné ve skriptovém souboru jsou chápány jako globální a vždy změní hodnotu proměnných se stejným jménem, které byly definovány lokálně během práce v MATLABu. M-soubor může obsahovat odkazy na jiné m-soubory, včetně rekurzivního odkazu na sebe sama.
29
Funkční soubory (funkce) vnášejí do MATLABu pružnost a přizpůsobivost. Můžete si vytvořit nové, vlastní tzv. uživatelské funkce specielně pro Váš problém, které potom budou mít stejné postavení, jako běžné (předdefinované, vestavěné) funkce v MATLABu. Proměnné jsou ve funkčních souborech standardně lokální, avšak od verze 4.0 je povoleno definovat proměnnou jako globální. Je vhodné volit název funkce stejný jako název souboru. Operace Zobrazení n-té kartézské mocniny An do množiny A se nazývá n-ární operací na množině A, kde n je libovolné přirozené číslo, nebo číslo 0. Je-li n = 0, pak operaci nazýváme nulární operací na množině A, je-li n = 1, pak se nazývá unární, pro n = 2 binární, pro n = 3 ternární atd. Nejčastěji se vyskytující operace jsou unární operace a binární operace. Příkladem unárních operací jsou například trigonometrické funkce, zatímco příkladem binárních operací jsou třeba sčítání, odčítání, násobení nebo dělení reálných čísel. Program M-soubor, který může obsahovat jak skriptové, tak i funkční soubory. Příkazový řádek MATLABu Prostředí MATLABu, okno s názvem Command Window, kde spouštíme m-soubory. Předdefinovaným m-souborům v MATLABu také zkráceně říkáme příkazy MATLABu (MATLABovské příkazy), resp. funkce MATLABu (MATLABovské funkce). Syntaxe příkazu V informatice syntaxe označuje pravidla pro zápis formálního jazyka (například programovacího). Zde syntaxe označuje pravidla pro zápis příkazu v MATLABu. Popisuje význam jednotlivých znaků a skupin znaků, například jak může vypadat název proměnné nebo funkce, určuje, kde se může objevit jaký speciální znak či klíčové (rezervované) slovo, tedy slovo se zvláštním významem. ▲ Všechny příkazy, které jste psali do příkazové řádky MATLABu, byly a budou i nadále v tomto textu psány tak, abyste je mohly z elektronické verze tohoto textu překopírovat do příkazové řádky MATLABu bez jakýchkoliv typografických úprav. Samozřejmě, že když se učíte z vytištěného textu, tak nemůžete nic kopírovat, ale to nevadí, protože je stejně nutné, abyste se sami naučili tyto příkazy psát a věděli, kde který znak na své klávesnici máte. Pokud ale ani na popáté nebude mít příkaz správně napsaný, nebo si budete chtít, po prostudování kapitoly, připomenout některý příkaz, tak jej můžete překopírovat a bude Vám fungovat. Pokud si chcete vyzkoušet některý z výše uvedených m-souborů, tak se nemusíte zdržovat jeho vytvářením, protože všechny jsou Vám dány k dispozici na eLearningu ve složce M-soubory. ▲
30