Cíl 1 Seznámení s MATLABem - elementární funkce MATLABu Osnova 1.1 MATLAB...1 1.1.1 Hlavní kategorie MATLABských funkcí... 1.1. Aritmetické operátory a některé speciální znaky... 1.1. 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ě 10 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, vyprázdnit, 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 MATLABský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 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 D a D 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 4-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 (R1.1) z června 001 poskytuje 4 hlavních kategorií funkcí. Některé MATLABské funkce jsou obsaženy uvnitř interpreteru, zatímco jiné jsou ve formě m-souborů. M-soubory obsahují pouze pomocný text, jsou organizovány do 4 adresářů, z nichž každý obsahuje soubory sdružené s kategorií.
1.1.1 Hlavní kategorie MATLABský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í graphd dvoudimenzionální (D) grafika graphd třídimenzionální (D) 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í verctrl řízení verze winfun soubory rozhraní operačního systému Windows (DDE/ActiveX) V adresáři Matlab6p1\Toolbox\Matlab je uloženo 4 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é verzi MATLABu Vám funguje příkaz help colormap a demo ú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í. Co je stará a nová verze MATLABu je vysvětleno v úvodu k tomuto učebnímu textu. 1.1. 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.\ 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 MATLABské 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 kurzívou. 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 funkce, které znáte z předmětů Matematika I a II. 1.1. Základní elementární funkce MATLABu Tab. 1.1: Trigonometrické funkce Funkce Název funkce Příkaz MATLABU Výstup MATLABU sin sinus sin() 0.1411 sinh hyperbolický sinus sinh() 10.0179 asin arkussinus asin(0.9) 1.1198 asinh argument hyperbolického sinu asinh(0.4) 0.900 cos kosinus cos() -0.9900 cosh hyperbolický kosinus cosh() 10.0677 acos arkuskosinus acos(0.4) 1.159 acosh argument hyperbolického kosinu acosh() 1.170 tan tangens tan() -0.145 tanh hyperbolický tangens tanh() 0.9951 atan arkustangens atan(4) 1.58 atan čtyř-kvadrantový arkustangens atan(1.1,1) 0.80 atanh argument hyperbolické tangenty atanh(0.7) 0.867 sec sekans sec() -1.0101 sech hyperbolický sekans sech() 0.099 asec arkussekans asec(5) 1.694 asech argument hyperbolické sekanty asech(0.5) 1.170 csc kosekans csc() 7.086 csch hyperbolický kosekans csch() 0.0998 acsc arkuskosekans acsc(5) 0.014 acsch argument hyperbolické kosekanty acsch(4) 0.475 cot kotangens cot() -7.015 coth hyperbolický kotangens coth() 1.0050 acot arkuskotangens acot() 0.18 acoth argument hyperbolické kotangenty acoth(7) 0.148 4
Tab. 1.: Exponenciální funkce Funkce Název funkce Příkaz MATLABU Výstup MATLABU exp exponenciální funkce exp(.7) 14.8797 log přirozený logaritmus log(9.8).84 log10 dekadický logaritmus log10(10) 1 log logaritmus o základu dvě log(16) 4 pow mocnina o základu dvě pow() 8 sqrt druhá odmocnina sqrt(16) 4 atd. Tab. 1.: Funkce pro komplexní čísla Funkce Název funkce Příkaz Výstup MATLABU MATLABU abs absolutní hodnota abs(-+i).6056 angle argument komplexního čísla (fázový úhel) angle(-+i).1588 complex sestrojí komplexní číslo z reálné a imaginární části complex(-,) -.0000+.0000i conj komplexně sdružené číslo conj(-+i) -.0000.0000i imag imaginární část komplexního čísla imag(-+i) real reálná část komplexního čísla real(-+i) - atd. Tab. 1.4: Numerické funkce Funkce Název funkce Příkaz MATLABU Výstup MATLABU fix převede na celé číslo tak, že odřízne desetinnou část fix(-5.16) -5 floor zaokrouhlí dolů na nejbližší nižší celé číslo floor(-5.16) -6 ceil zaokrouhlí nahoru na nejbližší vyšší celé číslo ceil(-5.16) -5 round zaokrouhlí na celé číslo běžným způsobem round(-5.16) -5 mod modul (znaménko zbytku po celočíselném dělení) mod(7,-) -1 rem zbytek po celočíselném dělení rem(7,) 1 sign funkce signum (znaménko funkce) sign(-5.16) -1 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 5x + 6, osou y a úsečkou s krajními body AB, kde A = (0; 0) a B = (, 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 1, 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.: Ř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,)-quad('mot',,) P = 4.8 Nakonec byl napsán příslušný m-soubor motivace.m, ve kterém byla bledě modrou barvou znázorněna příslušná plocha. motivace.m x1=0:0.01:; 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,],[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,8 příslušných'); text(1,5,'\fontname{times new roman ce}plošných jednotek.'); text(6.75,0.5,'\fontname{times new roman ce}\itx'); text(0.5,6.75,'\fontname{times new roman ce}\ity'); text(0.5,-0.5,'\fontname{times new roman ce}a'); text(.5,-0.5,'\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 7 4 Vypočítejte funkční hodnotu polynomu x + x + x 7 pro x =. Řešení a) Na str. -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: ******+****+**-7 obdržíte výsledek: ans = 177 což budu dále zapisovat do jednoho řádku jako ans = 177 b) Můžete také použít symbol pro umocňování, který znáte z Excelu, tj. symbol ^ a napsat: 7
^7+*^4+^-7 obdržíte stejný výsledek: ans = 177 c) Oba výše uvedené příkazy můžete také zadat takto:.*.*.*.*.*.*+.*.*.*.*+.*.*-7.^7+.*.^4+.^-7 protože nenásobíte matice, ale pole. d) Pokud byste potřebovali vypočítat funkční hodnotu nejen pro x =, 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,,0,,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,) 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 = 8004 Výsledek 7 4 Funkční hodnota polynomu x + x + x 7 pro x = 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 P8 je implicitně nastavena klávesnice česká. Tab. 1.5: Klávesové zkratky Znak Název znaku Klávesová zkratka Kód \ zpětné lomítko pravé Alt + q levé Alt + 09 levé Alt + 9 @ zavináč pravé Alt + v levé Alt + 064 levé Alt + 64 ~ velká tilda pravé Alt + + (pod 1) levé Alt + 016 levé Alt +16 ^ stříška pravé Alt + š (pod ) levé Alt + 094 levé Alt + 94 [ levá hranatá závorka pravé Alt + f levé Alt + 091 levé Alt + 91 ] pravá hranatá závorka pravé Alt + g levé Alt + 09 levé Alt + 9 { levá složená závorka pravé Alt + b levé Alt + 01 levé Alt +1 } pravá složená závorka pravé Alt + n levé Alt + 015 levé Alt +15 < menší než pravé Alt + < levé Alt + 060 levé Alt + 60 > větší než pravé Alt + > levé Alt + 06 levé Alt + 6 8
Jistě Vás nyní napadlo, zda by nešla podobným způsobem provést tabelace funkce například pro hodnoty x = 1,,, 0. Samozřejmě, že odpověď je ano, lze, například pomocí tzv. FOR cyklu, což si ukážeme ve druhé kapitole. Nyní, pro zvídavé studující, uvedu pouze příslušný m-soubor tabelace.m. tabelace.m p=[1,0,0,,0,,0,-7]; for i=1:0, 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 =, tak do příkazové řádky MATLABu napište: tabelace; x() a obdržíte výsledek: ans = 441 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.: 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: ******+****+**-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: ******+****+**-7, tak se výsledek na monitoru opět objeví. Tip 1.: Uložení výsledku do proměnné Pokud v MATLABu napíšte příkaz: y=******+****+**-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ž 1 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í Co se stane, když napíšete y=******+****+**-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: *.1 tak ve staré verzi MATLABu obdržíte červené chybové hlášení:??? *.1 Error: Missing operator, comma, or semicolon. v nové verzi MATLABu pak červené chybové hlášení:?? *.1 Error: Unexpected MATLAB expression. pokud ale napíšete příkazy: p=[1 0 0 0 0-7]; polyval(p,) 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.: 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.: 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 staré verzi MATLABu, místo výsledku, červené chybové hlášení:??? Error using ==> sym/sym (charsym) x.*x+7 is not a valid symbolic expression. Error in ==> C:\MATLAB6p1\toolbox\symbolic\@sym\sym.m On line 9 ==> S = charsym(x); 10
V nové verzi MATLABu pak uvidíte:??? Error using ==> sym.sym>expressionref at 408 Error: 'expression' expected [line 1, col ] Error in ==> sym.sym>charref at 78 s = expressionref(x); Error in ==> sym.sym>tomupad at 147 S = charref(x); Error in ==> sym.sym>sym.sym at 10 S.s = tomupad(x,''); Co je stará a nová verze MATLABu bylo vysvětleno v úvodu k tomuto učebnímu textu. 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:;y=x*x+7;plot(x,y,'b'); zobrazí se Vám, v obou 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:;y=x.*x+7;plot(x,y,'b'); otevře se Vám nové okno s obrázkem, kde uvidíte toto: Obr. 1.: Demonstrace správného použití operátoru.* Vyzkoušejte si to! 1.1.5 Zápisy funkcí a operátorů Příklad 1.: Jednoduché odmocniny a mocniny Vypočítejte a = 1 7, 8 4 a =, a =. 7 Řešení Když se podíváte do Tab. 1. na str. 5, tak uvidíte předdefinované funkce MATLABu, které Vám úlohu pomohou vyřešit. Můžete postupovat například takto: 11
a) Do příkazové řádky MATLABu napište příkaz: a1=sqrt(7) na monitoru se zobrazí výsledek: a1 =.6458 b) Do příkazové řádky MATLABu napište příkaz: a=^8 na monitoru se zobrazí výsledek: a = 56 c) Protože čtvrtou odmocninu můžete napsat také jako mocninu s exponentem 1/4, tak do MATLABu napište příkaz: a=7^(1/4) na monitoru se zobrazí výsledek: a = 1.666 Výsledek Hledané hodnoty jsou: a = 7,645 8, a = 8 56, a 4 = 7 1,66 6. 1 = Upozornění 1.: Desetinná tečka MATLAB používá desetinnou tečku a ne desetinnou čárku. K zamyšlení Jakým jiným příkazem lze vypočítat a? Řešení Stačí zadat příkaz: a=pow(8) Příklad 1.: Algebraické výrazy s mocninami a odmocninami Vypočítejte funkční hodnotu následujících výrazů: z 7 5 4 = +. Řešení Stačí do MATLABu zadat příkaz: z1=(^+5^4)^(1/) na monitoru se zobrazí výsledek: z1 = 8.586 pak zadejte příkaz: z=(7^5+^)^(1/5) výsledek je: z = 7.0007 a nakonec zadejte příkaz: z=(^5+^4)^(1/7) výsledek je: z = 1.9647 4 1 = + 5 z ; z ; 5 5 = 7 + 1
Výsledek Funkční hodnoty jsou: z = + 5 4 8,586 ; 5 5 z = 7 + 7,000 7 ; 7 5 z 4 = + 1,964 7. 1 K zamyšlení Jakým jiným příkazem lze vypočítat z 1? Řešení Můžete napsat příkaz: z1=(.^+5.^4).^(1/) a obdržíte shodný výsledek: z1 = 8.586 1 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 b x + a pak stále stejný příkaz z=(x.^b+y.^c).^(1/a). Například: a=;b=;c=4;x=;y=5;z1=(x.^b+y.^c).^(1/a) výsledek je: z1 = 8.586 y c. Stačí tedy zadat hodnoty proměnných a, b, c, x a y 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 příští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=[,,4,,5;5,5,,7,;7,5,4,,;,,5,4,5;5,5,5,5,5;4,4,4,4,4;,,,,;,,4,4,5;4,4,5,6,6;5,5,6,,]; for i=1:10, z(i)=(m(i,4)^m(i,)+m(i,5)^m(i,))^(1/m(i,1)); end; V příkazovém řádku MATLABu pak stačí napsat: tabulka; z a obdržíte výsledek: z = 8.586 7.0007 1.9647 14.719 5.745 4.7568.7798 8.8 9.7595.9585 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 8 =, 5 4 = atd. V MATLABu pokud zadáte: (-8)^(1/) tak obdržíte výsledek ans = 1.0000 + 1.71i pokud ale zadáte příkaz:
-8^(1/) tak obdržíte správný výsledek: ans = - protože tento příkaz je identický (při výpočtu) s příkazem: -(8^(1/)) vypočítá tedy třetí odmocninu z 8 a pak změní znaménko na mínus, chceme-li vypočítat 5 4 =, tak stačí zadat příkaz: -(4^(1/5)) a obdržíte správný výsledek: - Příklad 1.4: Výrazy obsahující logaritmy Vypočítejte funkční hodnoty následujících výrazů: b 1 = lg 4, 589; b = ln 4, 875 ; b = log 5,457 ; b log, 564. 4 = 1 Řešení Dekadický logaritmus se počítá pomocí předdefinované funkce log10, a proto stačí napsat příkaz: b1=log10(4.589) a obdržíte výsledek: b1 = 1.907 Přirozený logaritmus se počítá pomocí předdefinované funkce log, a proto stačí napsat příkaz: b=log(4.875) a obdržíte výsledek: b = 1.5841 Protože platí matematický vztah například takto: b=log(.457)/log(5) a dostanete výsledek: b = 0.7707 napíšete-li příkaz: b4=log(.564)/log(1/) dostanete výsledek: b4 = -1.1568 ln a log b a =, tak lze zbývající dvě hodnoty vypočítat ln b Výsledek Funkční hodnoty jsou tyto: b 1 = log 4,589 1,90 7 ; b = ln 4,875 1,584 1; b = log 5,457 0,770 7 ; b 4 = log 1,564 1,156 8. 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 14
školách se ještě používá log), v MATLABu je log10. V matematice je binární (logaritmus o základu ) lb, v MATLABu je log. Symbol ln MATLAB nezná. Pokud se Vám nelíbí, jak je nutné zadávat příkaz pro výpočet například b = log 5, 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: b=logz(.457,5) a obdržíte výsledek: b = 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 8 4 Vypočítejte funkční hodnoty následujících výrazů: c 1 = ; c = e + e ; c e Řešení Stačí zadat příkaz: c1=/exp() a obdržíte výsledek: c1 = 0.1494 po zadání příkazu: c=exp(8)+exp(1/4) obdržíte výsledek: c =.98e+00 což je semilogaritmický tvar,98 10 desetinného čísla 98, a nakonec po zadání příkazu: c=exp(+1/7) obdržíte výsledek: c =.1700 Výsledek 1 1 + 7 = e 8 4 7 Funkční hodnoty jsou: c 1 = 0,149 4 ; c e e 98, = +, c = e,170 0. e 1 1 + Poznámka 1.: Zobrazení dalších desetinných míst Pokud byste potřebovali číslo c na více desetinných míst, tak stačí zadat například příkaz: c=numstr(c,10) a dostanete výsledek: c = 98.401 Můžete pak psát, že c 98,4 01.. 15
Výše uvedený příkaz numstr 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, c tak se Vám číslo c zobrazí ve stejném semilogaritmickém tvaru, jako bez zadání příkazu format, ale vypíše se Vám, v obou verzích MATLABu, 15 desetinných míst: c =.98401458416e+00 což je,98 4 01 458 416 10 = 98,4 01 458 416. 1.1.7 Trigonometrické funkce Příklad 1.6: Hodnoty goniometrických a cyklometrických funkcí Vypočítejte u 1 = cos, u = arcsin 0, 584, u = sin 7. Řešení První dvě hodnoty vypočítáte snadno. Zadejte nejprve příkaz: u1=cos() a obdržíte výsledek: u1 = -0.9900 po zadání příkazu: u=asin(0.584) obdržíte výsledek: u = 0.66 Ve třetím případě musíte nejprve 7 stupňů převést na radiány, protože MATLAB implicitně počítá pouze s radiány. Protože 180..π radiánů, 7 x radiánů, 7 tak x = π v radiánech a stačí tedy napsat příkaz: 180 u=sin(7*pi/180) a obdržíte výsledek: u = 0.6018 Výsledek Funkční hodnoty jsou tyto: u 1 = cos 0,990 0 ; u = arcsin 0,584 0,6 6 ; u = sin 7 0,601 8. Varování 1.: Funkční hodnoty arkuskotangens 1 Z matematiky znáte funkci f : y = arccot x jako inverzní funkci k funkci 1 1 D ( f ) = H ( f ) = ( 0; π) a H ( f ) = D( f ) = R acot(0) tak se ve staré verzi MATLABu objeví hlášení: 16 f : y = cot x, kde. Jestliže ale v MATLABu zadáte příkaz: Warning: Divide by zero. In C:\MATLAB6p1\toolbox\matlab\elfun\acot.m at line 8 ans = 1.5708
zatímco v nové verzi MATLABu získáte správný výsledek: ans = 1.5708 π π víme totiž, že arccot 0 = 1,570 8, protože cot = 0. Pokud zadáte příkaz: h=acot(-5) tak v obou verzích MATLABu získáte výsledek: h = -0.1974 1 což ale víme, že je chybně, protože D ( f ) = H ( f ) = ( 0; π) kontrolu, tj. zadáte příkaz: cot(h) tak opět v obou verzích MATLABu získáte výsledek: ans = -5. Jestliže si uděláte jakoby Jak je to možné? Pokud se pokusíte v MATLABu vykreslit funkci y = arccot x pomocí příkazu acot(x), tak v obou 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. Ve starém obdržíte hlášení: Obr. 1.4: První pokus o graf funkce arkuskotangens Warning: Divide by zero. In C:\MATLAB6p1\toolbox\matlab\elfun\acot.m at line 8 In C:\MATLAB6p1\work\pokus1.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. 17
Obr. 1.5: Druhý pokus o graf funkce arkuskotangens Správný graf je až na následujícím obrázku: Vidíte tedy, že hodnota ( 5) graf vypadá takto: Obr. 1.6: Graf funkce arkuskotangens arccot musí být téměř. A jak je to s funkcí kotangens? Její 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 =.944 Pokud by vás zajímalo, jak se výše uvedené grafy nakreslí, tak si prostudujte m-soubory ark1.m, ark.m, ark.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 =.944 arccot.m function[y]=arccot(x) if x >= 0, if x == 0, y=pi/; else y=acot(x); end; else y=acot(x)+pi; end; 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íme, že ϕ = x ϕ 0; π v radiánech a ve stupních, minutách a vteřinách, cos, jaký je úhel ( ) jestliže x je postupně ; 0,45 8; 0,687 4? 19
Řešení Nejprve zadejte do MATLABu první hodnotu x, tj. napište příkaz: x=-sqrt()/ 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 =.6180 který je samozřejmě v radiánech. Protože 180..π radiánů, x., 618 0 radiánů,,618 0 tak x 180 ve stupních. Když zadáte příkaz: π 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.458 zobrazí se Vám: x = 0.458 po zadání příkazu: z=acos(x) dostanete: z = 1.5 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 0,770 9 x 60 minut. Když zadáte příkaz: 1 0.7709*60 dostanete : ans = 46.540 minut, ale tím jste se dopustili dosti velké nepřesnosti, protože jste použili pouze čtyři 0