Elektronická opora k výuce předmětu
KŘP/IMSW Modelování ve výpočtových software Garant doc. Ing. František Dušek, CSc.
Týdenní rozsah výuky a kredity ECTS 1 hod. přednášky, 3 hod. cvičení, 4 kredity
Cíle předmětu Seznámit studenty s používáním standardních programových prostředků pro numerické řešení základních matematických úloh. Pozornost je věnována zejména výpočetnímu prostředí MATLAB / SIMULINK. Studenti získají základní zkušenosti s používáním profesionálního nástroje nezbytné při řešení složitějších problémů v navazujících předmětech.
Požadavky na studenta Aspoň 50% účast na cvičeních a úspěšné absolvování kontrolního testu, který je součástí elektronické opory předmětu. Dále získání aspoň minimálního počtu bodů z písemného testu při zkoušce.
Seznam témat 1.
náplň předmětu, přehled možností MATLAB – historie, princip práce a základní datový typ, prostředí, nápověda MATLAB – proměnné a další datové struktury, vstup a výstup dat, základní operace s maticemi, operace prvek po prvku, matematické funkce MATLAB – soustava lineárních rovnic, 2D a 3D grafy, speciální grafy, editace a export grafů MATLAB – operace s polynomy, interpolace, skripty a uživ. funkce, programové konstrukce MATLAB – tvorba uživatelského grafického rozhranní (GUI) aplikace MATLAB – funkce funkcí, funkce jako parametr, hledání kořene funkce MATLAB – výpočet určitého integrálu a numerické řešení diferenciálních rovnic MATLAB – hledání extrému funkce, optimalizace – Optimization Tbx, kombinace funkcí SIMULINK – určení a princip práce, knihovny bloků, tvorba modelu, start řešení, vizualizace SIMULINK – parametry řešení, typické nelinearity, blok integrátor a počáteční podmínky SIMULINK – subsystém a maskovaný subsystém, uživatelské knihovny SIMULINK – vstup a výstup dat, spojitý a diskrétní systém, algebraická smyčka další možnosti MATLABu a SIMULINKu, symbolické výpočty – Symbolic Toolbox
2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Literatura •
Základní a) Dušek, F.; Honc, D. MATLAB a SIMULINK úvod do používání, Univerzita Pardubice 2005, ISBN 80‐7194‐776‐8 b) nápověda a elektronická dokumentace k programu (součást instalace programu, anglicky)
KŘP/IMSW Modelování ve výpočtových software
1 2011/12
František Dušek KŘP FEI Univerzita Pardubice
•
•
Doporučená c) Karel Zaplatílek; Bohuslav Doňar MATLAB pro začátečníky, BEN d) Pavel Karban Výpočty a simulace v programech MATLAB a Simulink, Computer Press e) Novák, J.; Pultarová, I.; Novák, P.: Základy informatiky: Počítačové modelování v MATLABu. Česká technika ‐ nakladatelství ČVUT Praha 2005, 170 s., ISBN 80‐01‐03308‐2 Rozšiřující f) další dostupné publikace v ČJ www.humusoft.cz/matlab/knihy.htm g) elektronická dokumentace fy MathWorks www.mathworks.com/help/ h) elektronická učebnice Learning MATLAB 7 www.mathworks.com/academia/student_version/learnmatlab_sp3.pdf f) Interactive MATLAB & Simulink Based Tutorials www.mathworks.com/academia/student_center/tutorials/
Požadované prerekvizitní znalosti Předpokládají se základní znalosti z programování a dále znalosti z matematiky a fyziky v rozsahu základního kurzu.
Získané způsobilosti Absolvováním předmětu získá student základní dovednosti v používání výpočetního prostředí MATLAB / SIMULINK pro numerické řešení standardních matematických úloh a jeho využití při řešení technicky zaměřených problémů.
Způsob hodnocení Předmět je ukončen zápočtem a zkouškou. Zápočet je udělen za aspoň 50% účast na cvičeních a úspěšné absolvování závěrečného testu v elektronické opoře. Zápočet je podmínkou pro přihlášení ke zkoušce, která probíhá formou řešení zadaných příkladů na počítači v prostředí MATLAB / SIMULINK. Pro úspěšné absolvování zkoušky je nutné dosáhnout minimálně 30 bodů z 60 v části MATLAB a současně minimálně 20 bodů ze 40 v části SIMULINK. Výsledná známka potom odpovídá součtu bodů z obou částí podle následující tabulky: 0 – 49 bodů 50 – 59 bodů 60 – 69 bodů 70 – 79 bodů 80 – 89 bodů 90 – 100 bodů
nevyhověl dobře velmi dobře‐m velmi dobře výborně‐m výborně
F E D C B A
Struktura opory Elektronická opora je strukturována do 13 základních témat, která odpovídají probírané látce na přednáškách a cvičeních v rámci semestru. Pro označování vybraných částí textů opory jsou používány piktogramy, které upozorňují na charakter informací, jež jsou v příslušných částech textu uváděny (přehled piktogramů je uveden v Tabulce 1). KŘP/IMSW Modelování ve výpočtových software
2 2011/12
František Dušek KŘP FEI Univerzita Pardubice
Tabulka 1 Přehled v textu použitých piktogramů
Kontrolní otázky a úlohy
Čas potřebný pro studium
Rozšiřující látka
Pojmy k zapamatování
Cíl látky či kapitoly
Podrobnější vysvětlení
Příklad, objasnění problematiky
Definice
Zajímavé místo
Průvodcem studiem
Důležitá pasáž
Komentář, slovo autora
Řešení testů a otázek
Záchytný bod
Shrnutí předcházející látky či kapitoly
Obtížná pasáž s rozlišením stupně náročnosti
Kreativní myšlenka
Opakování
Počítačové cvičení Praktické cvičení
Elektronický zdroj
Zdrojový kód
Odkazy na další studijní prameny
Reference
KŘP/IMSW Modelování ve výpočtových software
3 2011/12
František Dušek KŘP FEI Univerzita Pardubice
1 Úvod do používání MATLABu Studijní cíl Obsahem prvního bloku je seznámení s náplní předmětu a přehled software pro numerické výpočty. Dále jsou uvedeny základní informace o programu MATLAB – k čemu je určen, historie vzniku, jaké má součásti, aktuální verze a požadavky na instalaci. Následuje vlastní úvod do používání MATLABu – princip práce a základní datový typ, prostředí, systém nápovědy a příkazy.
Doba nutná k nastudování
1 ‐ 2 hodiny
Průvodce studiem V kapitole 1.1 se seznámíme s pojmy modelování a model. Jako příklad je uká‐ zán matematický model rychlovarné konvice. Kapitola 1.2 uvádí stručný pře‐ hled některých programů pro numerické výpočty. Kapitola 1.3 obsahuje všeo‐ becné informace o programu MATLAB a poslední kapitola 1.4 je věnována zá‐ kladům práce s MATLABem. V tomto bloku nejsou příklady na procvičení V textu jsou použity následující typografické konvence: Calibri 11, Bold, Italic nové pojmy k zapamatování Calibri 11 označení klávesy Courier New 10, Bold názvy nástrojů MATLABu Courier New 10, Bold upřesnění nápovědy (help téma) Courier New 10 názvy příkazů, funkcí a objektů Courier New 9 ukázka příkazů příkazové řádky
1.1 Náplň předmětu V poněkud komplikovaném názvu předmětu „Modelování ve výpočetních software“ je dominantní slovo modelování. Modelování je činnost související s tvorbou modelu tj. „něčeho“ čím nahrazujeme část reality (originál, reálný systém 1 ), jehož vlastnosti chceme zkoumat. Model musí mít stejné nebo po‐ dobné chování v oblasti, která nás zajímá a musí se s ním jednodušeji pracovat než s reálným systémem. Model tedy obsahuje pouze vybrané informace o originále. Výběr informací je určen především účelem, ke kterému budeme model používat a samozřejmě úrovní znalostí originálu. Důvody pro tvorbu modelu mohou být ekonomické, ekologické, bezpečnostní nebo důvodem mů‐ že být to, že umožňuje s informacemi o reálném systému uloženými ve formě modelu dále pracovat. Vyšetřování vlastností originálu prostřednictvím modelu se označuje jako simulace.
1
Pojmem systém se označuje jednoznačně ohraničená část reality s určením vstupních vlivů (vstupních veličin), kterými působí okolí na systém a výstupních vlivů (výstupních veličin), který‐ mi systém působí na okolí. Při vymezení systému obvykle dochází ke zjednodušení, tj. málo významné vlivy se zanedbávají.
KŘP/IMSW Modelování ve výpočtových software
1‐1 (16) 13.7.11
František Dušek KŘP FEI Univerzita Pardubice
Model může být reálný fyzikální model, reálný analogický model nebo abs‐ traktní matematický model. Příkladem reálného fyzikálního modelu může být zmenšený sádrový model auta používaný pro zjištění aerodynamických vlast‐ ností karosérie. Jiným příkladem jsou figuríny používané při automobilových nárazových (crash) testech. Figurína je modelem 2 člověka, který z originálu zahrnuje pouze některé vlastnosti – rozložení hmotnosti, umístění a pohybli‐ vost kloubů. Na tomto příkladě je dobře vidět, že model nemusí odpovídat originálu do všech detailů, stačí shodné či podobné vlastnosti (chování) důleži‐ té z hlediska použití modelu.
Dříve používané elektrické a pneumatické analogové počítače jsou příkladem reálných analogických modelů. Používaly se zejména k řešení (určení časového průběhu vybraných veličin) reálných systémů, jejichž chování lze nahradit za‐ pojením částí s typickým chováním (kapacita, odpor, nelinearita atd.). Model vznikne zapojením standardních bloků (integrátor, sumátor, násobička, funkční blok atd.) analogového počítače. Podobně jako u předchozího typu modelů se sledují (měří) hodnoty fyzikálních veličin ale jiných než na originálu. Nové fyzi‐ kální veličiny (napětí, tlak) mají analogický 3 průběh jako odpovídající veličiny originálu. Poslední typ modelů – abstraktní matematické modely – jsou modely, ve kte‐ rých je informace o chování originálu uložena ve formě matematických výrazů popisujících vztah mezi veličinami modelu. Obecnou formou matematického modelu pro případ spojitých systémů je soustava nelineárních parciálních rov‐ nic. Matematický model ve spojení s výkonnou výpočetní technikou umožňující výpočet modelu v reálném čase může usnadňovat i zkoušky reálných zařízení. Příkladem může být vývoj a testování reálné řídicí jednotky spalovacího moto‐ ru, kde chování motoru je nahrazeno jeho matematickým modelem. Vstupem do řídicí jednotky jsou elektrické signály od čidel otáček motoru, teploty oleje a nasávaného vzduchu, polohy plynového pedálu atd. Výstupem jsou elektrické signály nastavující čas vstřiku paliva, zapalování atd. Vstupní a výstupní elek‐ trické signály jsou připojeny na počítač simulující chování motoru. Počítač je vybaven A/D převodníkem pro převod elektrických signálů do číslicové podoby a D/A převodníkem pro převod čísla na elektrický signál. V počítači probíhá řešení matematického model (výpočet časových průběhů výstupních veličin v závislosti na časovém průběhu vstupních veličin) v reálném čase včetně mož‐ nosti měnit další parametry (zatížení, poloha plynového pedálu, okolní teplota atd.) a zobrazovat a ukládat aktuální hodnoty. Vstupní veličiny modelu jsou dány aktuálními hodnotami měřených výstupních elektrických signálů řídicí jednotky a aktuální vypočítané hodnoty výstupních veličin jsou převedeny na odpovídající hodnoty elektrických signálů přivedených do řídicí jednotky. Tako‐ 2
Je zřejmé, že bez náhrady reálného systému (člověka) modelem (figurínou) je tento typ zkou‐ šek prakticky nereálný.
3
Pojem analogický označuje, že existuje vzájemně jednoznačná transformace mezi hodnotami odpovídajících veličin originálu a modelu. Kromě transformace mezi hodnotami veličin byla možná i transformace časová tj. změna časového měřítka (časové průběhy veličin modelu byly pomalejší/rychlejší než časové průběhy veličin originálu).
KŘP/IMSW Modelování ve výpočtových software
1‐2 (16) 13.7.11
František Dušek KŘP FEI Univerzita Pardubice
výto simulační systém dovoluje ověřit chování řídicí jednotky i v kritických situ‐ acích, které by vedly na zničení reálného motoru. Základní úlohou, pro kterou jsou modely používány, je určení časového průbě‐ hu výstupních veličin jako funkcí časového průběhu vstupních veličin. V případě matematického modelu řešení může být analytické (tj. ve formě vzorců, je možné získat jen výjimečně ve speciálních případech) či numerické (tabulka hodnot čas a odpovídající hodnota příslušné veličiny, lze získat vždy). Na nume‐ rické řešení soustav diferenciálních a algebraických rovnic jsou určeny progra‐ my pro numerické výpočty zahrnující knihovny pro řešení standardních úloh a prostředky pro řízení výpočtu a vizualizaci výsledků. Je potřeba rozlišovat mezi numerickým výpočtem a simulací. Simulace doplňu‐ je numerický výpočet tak aby výsledné chování odpovídalo originálu. Obvykle jde o situace, kdy je potřeba změnit výpočet. Příkladem může být simulace průběhu výšky hladiny v nádrži s odtokem v závislosti na přítoku. Při dostateč‐ ném přítoku bude stále hladina stoupat, ačkoliv nádoba začne přetékat. Jiným příkladem může být simulace polohy skleněné kuličky puštěné z určité výšky na kamennou podlahu. Prostý výpočet pohybové rovnice tělesa v gravitačním poli vede na neustálý pohyb ve směru gravitačního zrychlení. Simulace znamená tento výpočet (stále stejné rovnice) doplnit o změnu počátečních podmínek v okamžiku nulové výšky.
1.1.1 Příklad zjednodušeného modelu rychlovarné konvice Pro ilustraci pojmů matematické modelování a matematický model je uveden příklad modelu rychlovarné konvice sestavený na základě matematicko‐ fyzikální analýzy. Model popisuje teplotu vody T (°C) v rychlovarné konvici (viz ‐1 Obrázek 1‐1) v závislosti na příkonu E (Js ), okolní teplotě To (°C) a počátečních podmínkách tj. T(t)=fce[E(t),To(t), T(0)]. Při tvorbě modelu se předpokládá do‐ konalé míchání 4 vody v konvici a je zanedbán vliv malých tepel‐ ných kapacit. Jsou uvažovány pouze některé 5 parametry reálné‐ ho systému uvedené v Tabulce 1‐1. Další veličiny (teplota vzduchu nad vodou T1, teplota stěny T2, teplota topné desky T3, teplota izolace topné desky T4 a teplota podstavce T5) a parametry – T0 tepelné kapacity (vzduch nad kapalinou, stěna konvice, topná T deska, izolace topné desky, podstavce) a koeficienty přestupů tepla mezi odpovídajícími kapacitami nejsou uvažovány. Model vychází z tepelné bilance (zákona zachování energie) a platí pouze v rozsahu teplot vody od teploty tání do teploty varu. Za výše uvedených předpokladů je model tvořen jednou obyčejnou diferenciální rovnicí prvního řádu ve tvaru
E(t ) = α .S .[T(t ) − To (t )] + m.c.
d T(t ) dt
T1 T2 T3 T4 T5
E Obrázek 1‐1 Schéma rychlovarné konvice
4
To znamená, že v každém časovém okamžiku je teplota stejná v každém místě objemu konvice.
5
Tj. parametry, které mají největší vliv na výsledné chování
KŘP/IMSW Modelování ve výpočtových software
1‐3 (16) 13.7.11
František Dušek KŘP FEI Univerzita Pardubice
Tabulka 1‐1 Parametry modelu rychlovarné konvice Symbol α S m c
Rozměr J.s-1.m-2.K-1 m2 kg J.kg-1.K-1
Hodnota 20 0.2513 1 4180
Význam koeficient přestupu tepla (voda okolí) přestupní plocha (voda okolí) hmotnost vody v konvici měrná tepelná kapacita vody
Řešení modelu (průběh teploty T) za podmínek, že okolní teplota To =20 °C je konstantní, počáteční teplota vody je stejná jako okolní teplota a konvice o příkonu 2 kW je zapnuta po dobu 150 s je graficky znázorněno na Obrázku 1‐2.
Obrázek 1‐2 Průběh vstupu a výstupu modelu
1.2 Přehled SW pro numerické výpočty Numerické výpočty byly jedním z hlavních úkolů počítačů od samotného vzni‐ ku. Zpočátku bylo nutné kompletní řešení napsat vlastními silami v progra‐ movacím jazyce dostupném pro daný počítač (obvykle Assembler). Postupně vznikly programovací jazyky specializované na výpočty. Jako první jazyk navr‐ žený speciálně pro vědeckotechnické výpočty se uvádí FORTRAN (zkratka z FORmula TRANslation), který je používán od roku 1956. Existence počítačově nezávislého programovacího jazyka umožnila vznik matematických knihoven, obsahujících funkce na numerická řešení standardních matematických úloh. Tyto knihovny významně usnadnily tvorbu vlastních programů. Další etapa začala, když se objevily hotové programy umožňující zápis úlohy, její řešení a prohlížení výsledků bez nutnosti psát vlastní program. Mezi tyto programy lze zařadit i tabulkové procesory VisiCalc (1979, Aple II), Lotus 1‐2‐3 (1983, MS DOS), Quattro (1988, MS DOS) a Excel (1985 Macintosh, 1987 MS Windows, 1992 MS DOS). Použití tabulkových procesorů pro numerické vý‐ počty je omezené nicméně lze v nich lze řešit i poměrně komplikované úlohy 6 . Dále existují programy určené speciálně pro numerické výpočty, které se někdy označují také jako CAS (Computer Algebra System). Některé jsou určeny pro 6
Např. v Excelu lze řešit úlohu optimalizace s více proměnnými za existence omezení včetně omezení na obor celých čísel
KŘP/IMSW Modelování ve výpočtových software
1‐4 (16) 13.7.11
František Dušek KŘP FEI Univerzita Pardubice
obecné použití, jiné jsou již zaměřeny na určitou oblast. Mezi programy pro všeobecné použití uveďme jako zajímavost program Famulus (pro MS DOS) vyvíjený českou firmou FAMULUS Etx., s.r.o. (vývoj ukončen cca 1997), který se v 90. letech používal ve školách. Jako další profesionální programy všeobecné‐ ho použití je možné uvést Mathcad (původně MathSoft, od 2007 PTC, www.mathsoft.com), značně rozšířený program Mathematica 7 (1987 Wolfram Research, Inc., www.wolfram.com) a MAPLE (od 1988 Waterloo Maple, Inc. www.maplesoft.com). Z nekomerčních (GNU) produktů uveďme program Ma‐ xima 8 (1982, http://maxima.sourceforge.net) pro platformu Linux. Společným rysem těchto programů je, že přímo podporují symbolické výpočty.
Jako příklad programů pro numerické výpočty specializovaných na určitou ob‐ last – statistické výpočty (analýza dat) – uveďme program QC Expert (původně AdStat) vyvíjený pardubickou firmou TriloByte, s.r.o. od roku 1990 (www.trilobyte.cz) a program StatGraphics (StatPoint, Inc., od 2005 Manugis‐ tics, Inc., www.statgraphics.com). V dalším se budeme zabývat pouze programem pro numerické výpočty MATLAB 9 (1984, The MathWorks, Inc., www.mathworks.com). Podobné MATLABu jsou volně dostupné programy Scilab 10 (www.sclilab.org) nebo GNU Octave 11 (1994, http://www.gnu.org/software/octave/) 7
(Wikipedie) Mathematica je počítačový program široce používaný ve vědeckých, technických a matematických kruzích. Program byl původně vytvořen Stephenem Wolframem a následně vyvíjen týmem matematiků a programátorů, který vytvořil a vede. Mathematica je rozdělena do dvou částí – jádra a front endu. Jádro interpretuje výrazy a vrací výsledky. Front end poskytuje GUI, ve kterém výsledky vhodně zobrazuje.
8
(Wikipedie) Maxima je svobodný počítačový algebraický systém, napsaný v Lispu (resp. jeho dialektu Common Lisp) a distribuovaný pod GNU General Public License. Je dostupný pro všech‐ ny platformy standardu Posix, jakými jsou Unix, BSD nebo Linux; dostupné jsou také binární soubory pro MS Windows. wxMaxima je multiplatformní verzí s grafickým uživatelským rozhra‐ ním, založenou na wxWidgets. Maxima vychází z projektu Macsyma, jenž byl vyvíjen v MIT (Massachusetts Institute of Technology) a financován United States Department of Energy a dalšími vládními organizacemi.
9
(Wikipedie) MATLAB je interaktivní programové prostředí a skriptovací programovací jazyk čtvrté generace. Program MATLAB je vyvíjen společností MathWorks a a je k dispozici pro ope‐ rační systémy Linux (32‐bit, 64‐bit), Windows (32‐bit, 64‐bit), Mac OS X (64‐bit). MATLAB umož‐ ňuje počítání s maticemi, vykreslování 2D i 3D grafů funkcí, implementaci algoritmů, počítačovou simulaci, analýzu a prezentaci dat i vytváření aplikací včetně uživatelského rozhraní. Půdně byl jazyk určen pro matematické účely, ale časem byl upraven, byly přidány nové funkce a rozšíření, rozrostl se různými směry a dnes je využitelný v široké paletě aplikací. V roce 2004 měl MATLAB přes milión uživatelů a to především z řad vědeckotechnických pracovníků, studentů a zaměst‐ nanců vysokých škol. MATLAB je využíván pro vědecké a výzkumné účely a to jak v soukromém sektoru, tak i v akademických řadách. Hlavní oblastí využití jsou technické obory a ekonomie.
10
(Wikipedie) Scilab je volně šiřitelný program pro numerické výpočty podobný systému MATLAB. Program byl vytvořen francouzskými vědeckými institucemi INRIA a ENPC. Jeho licence umožňuje bezplatné používání, ale nesplňuje podmínky Open Source Initiative ani Free Software Foundation. Program umožňuje provádět jak jednoduchou aritmetiku (násobení čísel), tak ná‐ ročné výpočty. Scilab je například používán pro statistické analýzy, zpracování obrazu, simulace fyzikálních a chemických jevů.
11
(Wikipedie) Octave je svobodný software pro provádění číselných výpočtů šířený pod licencí GPL. Octave je do určité míry kompatibilní s programem MATLAB. Octave obsahuje rozsáhlý
KŘP/IMSW Modelování ve výpočtových software
1‐5 (16) 13.7.11
František Dušek KŘP FEI Univerzita Pardubice
1.3 Co je to MATLAB Citováno ze stránek fy Humusoft Praha, s.r.o., výhradního zástupce fy Ma‐ thWorks, Inc. pro Českou republiku a Slovensko „MATLAB je integrované pro‐ středí pro vědeckotechnické výpočty, modelování, návrhy algoritmů, simulace, analýzu a prezentaci dat, paralelní výpočty, měření a zpracování signálů, ná‐ vrhy řídicích a komunikačních systémů. MATLAB je nástroj jak pro pohodlnou interaktivní práci, tak pro vývoj širokého spektra aplikací“. Co to tedy je MATLAB ? Slovy firemní literatury "MATLAB je vysoce výkonný jazyk pro technické výpočty. Integruje výpočty, vizualizaci a programování do jednoduše použitelného prostředí, kde problémy i řešení jsou vyjádřeny v přiro‐ zeném tvaru". Jde o interaktivní systém, jehož základním datovým typem je matice (orientované dvourozměrné pole bez nutnosti deklarovat rozměry). Tato vlastnost spolu s množstvím zabudovaných funkcí umožňuje relativně snadný zápis a řešení mnoha technických problémů, speciálně takových, které vedou na vektorovou či maticovou formulaci, v mnohem kratším čase než ře‐ šení v klasických jazycích jako je "C/C++" nebo FORTRAN. Typické oblasti použi‐ tí jsou: • inženýrské výpočty • vývoj algoritmů • modelování, simulace a vývoj prototypů • analýza dat a jejich vizualizace • inženýrská grafika • vývoj aplikací včetně tvorby grafického uživatelského rozhraní V univerzitním prostředí jde o standardní nástroj využívaný zejména ve výuce matematiky a inženýrských oborech. V průmyslu je využíván jako vysoce efek‐ tivní nástroj pro výzkum, vývoj i analýzu dat. O jeho využití svědčí velké množ‐ ství publikací z různých oborů, které MATLAB při řešení problémů používají a řešení ve formě m‐funkcí v knize nejen uvádějí, ale ve formě souborů buď na doprovodné disketě (CD) nebo na některém FTP serveru také nabízejí. Možnosti MATLABu mohou být rozšířeny pomocí problémově orientovaných knihoven nazývaných toolboxy. Tyto toolboxy využívají funkce jádra MATLABu a rozšiřují je o další funkce užitečné v oblasti, pro kterou je daný toolbox určen – např. pro oblast zpracování obrazu je určen Image Processing Tbx, rozšíření o symbolické výpočty zajišťuje Symbolic Tbx 12 . Dále existuje nadstavba MATLABu – SIMULINK, který určen pro simulaci a mo‐ delování dynamických systémů. Využívá algoritmy MATLABu pro numerické řešení nelineárních diferenciálních rovnic. Poskytuje uživateli možnost rychle a soubor nástrojů pro numerické řešení problémů lineární algebry, hledání řešení nelineárních rovnic, integrování funkcí, práci s polynomy a integrování diferenciálních rovnic. Základní struk‐ tura v Octave je matice, jsou podporovány i řídké matice. Pro zobrazování výsledků používá Octave program Gnuplot. 12 Původně (do verze MATLABu R2007b) byl založen na výpočetním jádře programu MAPLE (MAPLE engine). Novější verze využívají MuPAD engine (Multiprocessing Algrebraic Data Tool), další z aplikací pro symbolické výpočty (SciFace Software GmbH & Co. KG, www.sciface.com).
KŘP/IMSW Modelování ve výpočtových software
1‐6 (16) 13.7.11
František Dušek KŘP FEI Univerzita Pardubice
snadno vytvářet modely dynamických soustav ve formě blokových schémat a rovnic. Rozšiřující knihovny k SIMULNKu se označují jako blocksety.
Základem MATLABu je rychlé a výkonné výpočetní jádro optimalizované na maticové operace využívající matematické knihovny s podporou vícejádrových procesorů. Grafické jádro postavené na standardu OpenGL zajišťuje rychlé vykreslování 2D a 3D grafů s maximálním využitím možností grafické karty. Samozřejmostí je bohatá podpora různých datových, zvukových, obrazových i video formátů. MATLAB je také plně objektový programovací jazyk s plnou podporou vývoje programu. Obsahuje editor s kontrolou programu během jeho psaní, debbuger i profiler. Součástí MATLABu je i rozsáhlá nápověda v on‐line hypertextová formě a ve formátu PDF.
1.3.1 Historie a vývoj MATLABu Název MATLAB vznikl z anglického MATrix LABoratory. Počátky jsou v roce 1970, kdy prof. Cleve Moler, University of New Mexico vytvořil prostředí po‐ skytující jednoduchý přístup k matematickým knihovnám vyvinutým v projek‐ tech LINPACK a EISPACK. Od roku 1984 je MATLAB komerčně poskytován fy MathWorks, Inc. Původně byl určen pro operační systém UNIX a tato okolnost se dodnes (i v prostředí Windows) projevuje ve velmi jednoduchém základním komunikačním rozhraní ‐ příkazové řádce. V posledních verzích (od roku 2000) jsou nyní využívány matematické knihovny ARPACK (Arnoldi PACKage), LAPACK (Linear Algebra PACKage) a BLAS (Basic Linear Algebra Subroutines). První verze pro PC XT se objevila kolem roku 1985. Základním problém byl ne‐ dostatek paměti ‐ a z toho plynoucí omezení na maximální velikost matic. Po nástupu PC AT rychle následovala verze MATLABu pro tento počítač. Zde byla maximální velikost matice omezena fyzickou velikostí paměti (pro PC AT max. 16 MB). Velké obliby doznala verze MATLAB 386 určená pro počítače PC s procesorem 80386, která již využívala virtuální paměť. Poslední verze MATLAB386 g z října 1995 byla používána velmi dlouho, protože byla vzhledem k tomu, že pracuje pod OS DOS, nepřekonatelná v rychlosti výpočtů. Všechny tyto verze MATLABu pracovaly pod OS DOS a vyžadovaly matematický koprocesor. Přibližně v roce 1994 byla uvedena verze MATLAB for Windows, která nabízela podstatně bohatší možnosti grafického rozhraní než předchozí verze. V této verzi se objevil poprvé SIMULINK. Po výpočetní stránce mnoho nového nenabí‐ zela (naopak výpočty na tom samém počítači byly, díky většímu vytížení proce‐ soru režií operačního systému, pomalejší). MATLAB for Windows skončil verzí 4.2c, která se přestala dodávat koncem roku 1996. Nástupcem verze 4 byla verze 5 určená v rámci platformy Intel do 32‐bitového prostředí (pod OS Windows 95 nebo Windows NT). Verze 6 byla již plně 32‐ bitová a přinesla nové možnosti plynoucí z využití objektového přístupu – zejména nové datové struktury, rychlejší grafiku, nové vizualizační funkce a další rozšíření nabídky základních funkcí. Novinkou bylo, že obsahovala čtyři různá výpočetní jádra optimalizovaná pro různé typy procesorů. Tuto verzi nelze spustit pod Windows 7. KŘP/IMSW Modelování ve výpočtových software
1‐7 (16) 13.7.11
František Dušek KŘP FEI Univerzita Pardubice
Verze 7.0.4 z ledna 2005 již vyžadovala Windows NT/2000/XP. Obsahovala 4 optimalizovaná výpočetní jádra pro procesory Pentium (PII, PPro, PIII, P4) a jedno pro Athlon. Tato verze byla dostupná kromě pro Windows také pro plat‐ formy HP‐UX 11, Linux, Mac OS X, Solaris a částečně Linux x86‐64 (ne všechny toolboxy). Poslední verze (aktuálně R2011b) podporují vícejádrové procesory Intel a AMD, paralelní výpočty na GPU a výpočetních clustrech a 32/64‐bitové platformy Windows, Mac OS a Linux.
1.3.2 Oblast použití, požadavky na systém a instalace MATLAB s jeho součástmi má velmi široké spektrum použití. Základní oblasti použití ukazuje Obrázek 1‐3.
Obrázek 1‐3 Oblasti použití MATLABu
Podporované platformy ‐ Windows Server 2008 SP2/R2, Windows XP SP3, MS‐Windows XP x64 SP2, Windows Vista SP2, Windows 7 32/64 bit ‐ Mac OS X 10.5.5 a vyšší (Intel), 10.6 a vyšší (Intel) ‐ Linux 32/64bit ‐ Kernel 2.6 a glibc 2.5 a vyšší doporučené distribuce: Ubuntu 9.10 a 10.04 LTS Red Hat Enterprise Linux 5.x SUSE Linux Enterprise Desktop 11.x Debian 5.x
Nároky na systém Procesor: RAM: HD:
Intel nebo AMD, rozšířená instrukční sada SSE2 1024 MB min (2048 MB doporučeno) 1GB pro hlavní modul MATLAB, 3‐4GB typická instalace
KŘP/IMSW Modelování ve výpočtových software
1‐8 (16) 13.7.11
František Dušek KŘP FEI Univerzita Pardubice
Instalace Instalace MATLABu probíhá z instalačního DVD. Podle použité platformy se instaluje odpovídající verze MATLABu (32/64 bit). Je možná síťová instalace (network) využívající licenční server nebo instalace na počítač (standalone). V případě instalace na počítač je možná varianta využívající internetové připojení na MathWorks či bez něj. Využíváme‐li internetové připojení, je nutné mít vytvořen tzv. MathWorks Acount či jej s využitím Activation Key vytvořit. Nevy‐ užíváme‐li připojení, je nutné mít tzv. File Instalation Key. Po výběru požadova‐ ných součástí z nabídnutého seznamu (nabízí se pouze zakoupené součásti) proběhne instalace. Instalované součásti je nutné aktivovat. Aktivace je možná automatická s využitím internetového připojení k MathWorks Acount nebo manuální vyžadující Licence File. Activation Key nebo File Instalation Key a Li‐ cence File uživatel obdrží při zakoupení licence.
1.3.3 Licence Licence jsou časově neomezené – všechny konfigurace programového systému MATLAB jsou dodávány jako časově neomezené! Pořizovací cena představuje poplatek za časově neomezenou licenci pro jednoho uživatele nebo skupinu uživatelů a zahrnuje v sobě předplatné na update vydaná v průběhu prvních 12 měsíců od pořízení a technickou podporu uživatele. Přístup k update a technic‐ ké podpoře v následujících letech je možný po zaplacení RENEWAL poplatku. RENEWAL – je předplatné update a technické podpory na 12 měsíců. Časové období bezprostředně navazuje na předchozí období předplatného. RENEWAL je možné zakoupit za zvýhodněné ceny nejpozději dva měsíce od ukončení předchozího cyklu předplatného, po tomto datu je cena RENEWAL vyšší. Je‐li cyklus předplatného přerušen, je možné jej obnovit zpětným doplacením RENEWAL poplatků. Při přerušení předplatného na více než 4 roky je pro aktua‐ lizaci produktu třeba zakoupit novou licenci za plnou cenu.
Komerční licence Tento typ licencí dovoluje používat zakoupené produkty k jakýmkoliv účelům, které neodporují standardní licenční smlouvě tj. je možné je používat ke ko‐ merčním účelům. Individuální (jednouživatelská) konfigurace – licence pro jednu osobu („Stan‐ dalone Named User“). Programy mohou být instalovány a spouštěny na jed‐ nom nebo více počítačích (max. 4), ale pracovat s nimi smí jen jedna osoba určená držitelem licence (firmou). Umístění počítače (počítačů) používaných určeným uživatelem není limitováno. V jednom okamžiku smí být spuštěn MATLAB maximálně na dvou procesorech. Držitel licence může změnit určené‐ ho uživatele maximálně 4x ročně. Alternativně může držitel licence určit k in‐ stalaci programů jeden konkrétní počítač („Designated CPU“). Na určeném počítači se může v práci s MATLABem střídat více uživatelů (v jeden časový okamžik však smí s MATLABem pracovat pouze jeden uživatel). Vzdálený pří‐ stup k určenému počítači není dovolen. Síťová (concurrent) konfigurace – umožňuje současnou práci s MATLABem danému počtu uživatelů připojených k lokální počítačové síti. Licenční podmín‐ ky dovolují instalaci programového vybavení na libovolný počet počítačů (nebo KŘP/IMSW Modelování ve výpočtových software
1‐9 (16) 13.7.11
František Dušek KŘP FEI Univerzita Pardubice
na souborový server) ve správě nositele licence, ale počet současně pracujících uživatelů je omezen počtem zakoupených uživatelských licencí. Síťové konfigu‐ race jsou dodávány jako multiplatformní – umožňují kombinovaný provoz na všech podporovaných platformách (PC i UNIX) v rámci jedné počítačové sítě. Přístup uživatelů do systému je řízen automaticky jedním licenčním serverem pro všechny platformy.
Školní licence Tyto licence jsou omezeny na použití na školních výpočetních prostředcích, využívaných pouze pro výuku a výzkumnou činnost studentů a pedagogů. U těchto licencí je využití programů pro jakékoli komerční účely zakázáno! Školní licence pro všeobecné použití – plnohodnotné verze MATLABu, Simulin‐ ku a ostatních souvisejících produktů za školní ceny. Licence jsou určeny pro vzdělávací, výzkumnou a publikační činnost studentů, pedagogů a ostatních zaměstnanců ve vzdělávacích institucích. Jsou možné individuální i síťové více‐ uživatelské multiplatformní konfigurace. Classroom Kit – síťová konfigurace MATLABu, Simulinku a ostatních souvisejí‐ cích produktů, která je určena pouze pro pravidelnou výuku studentů zapsa‐ ných do kurzů v institucích poskytujících akademické vzdělání. Classroom Kit nesmí být používán k jiným účelům než je pravidelná výuka. Zejména je zaká‐ záno použití Classroom Kitu k vědecké a publikační činnosti pedagogů, dokto‐ randů i studentů (mimo pravidelnou výuku)! Classroom Kit je k dispozici pro všechny podporované platformy. Studentské licence – individuální multiplatformní konfigurace. Licence jsou určeny pro provoz na soukromých počítačích studentů pro studijní účely. Pro‐ gramové vybavení musí být zakoupeno univerzitou v minimálním množství 10 kusů a dále distribuováno jednotlivým studentům do osobního vlastnictví. Mi‐ nimální konfigurace (Student Suite) obsahuje MATLAB, Simulink, Symbolic Ma‐ th, Control System, Optimization, Statistics, Image Processing a Signal Proces‐ sing Toolboxy a Signal Processing Blockset. Studentskou licenci je možné rozší‐ řit i o toolboxy a blocksety, ale pouze v okamžiku nákupu celé konfigurace a pro všechny uživatele stejně. Studentské licence jsou "jednorázové" ‐ není možné je aktualizovat ani převádět mezi uživateli.
1.4 Úvod do požívání MATLABu Z hlediska používání je práce v MATLABu podobná jako práce v programovacím jazyce BASIC. Základem je zápis příkazů v textové podobě do příkazového řád‐ ku. Napsaný příkaz se hned provede, případně je možné nechat posloupnost příkazů provést najednou, pokud příkazy zapíšeme do textového souboru. Po‐ dobně jako BASIC je MATLAB interpret tj. každý příkaz (řádek) se překládá až v okamžiku, kdy se má provést a při opakovaném použití pokaždé znovu. Dů‐ sledkem je nižší rychlost provádění programu ale jednoduchá a rychlá změna programu a jednoduché ladění. Program vytvořený v MATLABu tedy není vhodný pro opakované rutinní výpočty, ale používá se zejména pro vývoj a ověření složitých výpočetních algoritmů. Čím se MATLAB liší od ostatních programů je jeho orientace na práci s matice‐ mi a maticové výpočty. Základním datovým typem je komplexní matice s čísly KŘP/IMSW Modelování ve výpočtových software
1‐10 (16) 13.7.11
František Dušek KŘP FEI Univerzita Pardubice
ve dvojnásobné přesnosti (64 bit). Proměnné není potřeba deklarovat – vytvoří se automaticky při prvním použití. Důsledkem je, že základní matematické ope‐ race se standardně aplikují jako maticové, což znamená, že např. není možné násobit libovolně dvě proměnné. Zápis příkazů je základní formou ovládání MATLABu. V podstatě vše lze udělat pomocí příkazů z příkazové řádky.
1.4.1 Prostředí Po startu MATLABu se objeví hlavní okno programu s implicitním uspořádáním do pěti dílčích oken, jak je ukázáno na Obrázku 1‐4. Nejdůležitější je okno Com‐ mand Window, do kterého se píší příkazy a ve kterém se zobrazují výsledky v textové podobě. V pravém horním rohu je okno Workspace obsahující se‐ znam proměnných v aktuálním pracovním prostoru. Pracovní prostor, který využívají příkazy zapsané na příkazovou řádku se nazývá základní pracovní prostor (basic workspace). Pod ním je okno Command History obsahující se‐ znam (historii) zapsaných příkazů. V levém horním rohu je okno Current Folder obsahující seznam souborů v aktuální 13 složce (adresáři) a pod ním okno obsa‐ hující informace o vybraném souboru. Která složka je aktuální je vidět v položce Current Folder (v pruhu nástrojů hlavního okna – třetí řádek), kde lze také aktuální složku změnit.
Obrázek 1‐4 Základní okno MATLABu
13
Tj. složka, do které se uloží nebo ve které se hledají soubory, u nichž neuvedeme úplnou adre‐ sářovou cestu
KŘP/IMSW Modelování ve výpočtových software
1‐11 (16) 13.7.11
František Dušek KŘP FEI Univerzita Pardubice
Všechna okna jsou tzv. dokovatelná, což znamená, že je lze z hlavního okna uvolnit (a zase vložit zpět) a osamostatnit. Toto akce provádí pomocí tlačítka (zahnutá šipka) v pravém horním rohu každého okna. Uspořádání oken lze libovolně měnit – viz např. volby v položce Menu Desktop. Pokud se chceme vrátit k výchozímu uspořádání, je možné použít volbu Menu Desktop -> Desktop Layout -> Default. Výmaz obsahu oken Command Window a Command History lze zajistit volbou příslušného příkazu položky Menu Edit.
Výmaz okna Command Window dosáhneme také zápisem příkazu clc na pří‐ kazovou řádku. Poslední řádek hlavního okna je tzv. stavový řádek. Je zde tla‐ čítko Start umožňující spustit některé pomocné programy MATLABu. V tomto řádku je též informace o stavu. Text „Ready“ znamená, že příkaz byl dokončen a čeká se na další, „Busy“ znamená, že se příkaz provádí. I prostředí MATLABu je objektové což znamená, že po vybrání objektu je mož‐ né pravým tlačítkem zobrazit seznam metod, které lze u vybraného objektu použít. Např. u datového souboru v okně Current Folder lze vybrat a spustit Import Wizard (průvodce importem textu) nebo u proměnné v okně Workspa‐ ce je možné vybrat a spustit Variable Editor.
1.4.2 Nápověda MATLAB obsahuje rozsáhlou nápovědu. Základní forma nápovědy vychází z možností příkazové řádky. Napíšeme‐li příkaz help (a Enter) vypíše se se‐ znam skupin příkazů. Seznam se liší podle instalovaných součástí. Napíšeme‐li např. help elfun, vypíše se seznam příkazů ze skupiny základních matema‐ tických funkcí a napíšeme‐li např. help sin, vypíše se nápověda k vybrané funkci. Ačkoliv jde o příkazový řádek, výpis je hypertextový tj. dovoluje kliknu‐ tím na zvýrazněné slovo vyvolat textovou nápovědu nebo rozšířenou nápovědu v html formátu (doc sin). Rozšířenou kontextově senzitivní 14 nápovědu mů‐ žeme vyvolat přímo použitím klávesy F1 nebo použitím položky Menu Help spustit Help Browser (viz Obrázek 1‐5). Pokud neznáme název funkce, kterou potřebujeme, může být užitečný příkaz lookfor následovaný řetězcem, o kterém předpokládáme, že se bude vysky‐ tovat v textové nápovědě hledané funkce. Výsledkem bude seznam funkcí, v jejichž textové nápovědě se zadaný řetězec vyskytuje. Bude‐li mne zajímat funkce související s Fourierovou transformací, použiji např. lookfor Fouri. >> lookfor Fouri fft - Discrete Fourier transform. fft2 - dimensional discrete Fourier Transform. fftn - N-dimensional discrete Fourier Transform. ifft - Inverse discrete Fourier transform. ifft2 - Two-dimensional inverse discrete Fourier transform. ifftn - N-dimensional inverse discrete Fourier transform. fi_radix2fft_demo - Fixed-Point Fast Fourier Transform (FFT) dftmtx - Discrete Fourier transform matrix. Specgram - Spectrogram using a Short-Time Fourier Transform (STFT). spectrogram - Spectrogram using a Short-Time Fourier Transform (STFT).
14
Tj. nápověda ke slovu, na kterém je textový kurzor
KŘP/IMSW Modelování ve výpočtových software
1‐12 (16) 13.7.11
František Dušek KŘP FEI Univerzita Pardubice
Obrázek 1‐5 Help Browser
1.4.3 Příkazy Jak již víme z prvního bloku, základní ovládání MATLABu je příkazy 15 zapsanými na příkazový řádek za znaky >> 16 . Rozlišují se velká a malá písmena v názvech příkazů, parametrů a proměnných. Vstupní parametry příkazu mohou být za‐ psány jako seznam oddělený mezerami nebo seznam v závorce oddělený čár‐ kami (zápis jako funkce). Ukončení zápisu příkazu je obvykle 17 stiskem klávesy Enter. Příkaz je hned proveden. MATLAB dovoluje jednoduchou editaci příka‐ zového řádku – posun po řádku pomocí kláves šipka vlevo/vpravo, vkládání a výmaz znaků. Klávesy šipka nahoru/dolů přesouvají na příkazový řádek položky ze seznamu historie zapsaných příkazů. Pokud napíšeme několik znaků, potom
15
Příkaz stejně jako funkce může mít vstupní parametry a může vracet nějakou informaci. Pojem příkaz budeme používat, když se vstupní parametry používají pro upřesnění činnosti a výstupní parametry (pokud vůbec jsou) nesou obecnou informaci o výsledku. Pojem funkce bude použí‐ ván v případě, že vstupní a výstupní parametry jsou numerické hodnoty. Další rozdíl je v tom, že když neuvedeme při volání funkce proměnnou pro uložení návratové hodnoty, uloží se implicitně do proměnné ans, zatímco návratová informace příkazu není implicitně nikam ukládána.
16
Pokud tento nápovědný řetězec (prompt) chybí, jde o situaci, kdy předchozí příkaz nebyl do‐ končen (provádí se) nebo zadání aktuálního příkazu není dokončeno. O kterou variantu jde, se pozná podle stavového řádku. Je‐li na něj text „Busy“, není dokončen předchozí příkaz. Ve dru‐ hém případě je na něm text „Continue entering statement“.
17
Při zápisu složitějších příkazů je možné použití klávesy Enter i uvnitř zápisu příkazu
KŘP/IMSW Modelování ve výpočtových software
1‐13 (16) 13.7.11
František Dušek KŘP FEI Univerzita Pardubice
se posun v historii provádí po položkách začínajících uvedenými znaky. Užiteč‐ ná je klávesa Esc, která maže příkazový řádek a klávesová kombinace Ctrl+c, která přeruší 18 prováděný příkaz.
Specialitou MATLABu je, že funkce (i příkaz) může mít nejen více vstupních parametrů 19 , ale může vracet i více výsledků, které lze uložit do více výstupních proměnných (je‐li více než jedna výstupní proměnná, pak seznam musí být uzavřen v hranatých závorkách). Uvedení výstupních (i vstupních) parametrů může být při použití příkazu (funkce) vynecháno. Syntaxe obecného příkazu je [ou1,ou2,…]=příkaz(in1,in2,…)
Co který příkaz dělá, jeho syntaxi a význam jednotlivých parametrů jednoduše zjistíme pomocí nápovědy tj. help příkaz nebo doc příkaz. Pokud příkaz vrací jednu či více hodnot a název výstupní proměnné (proměnných) není sou‐ částí příkazu, pak se uloží pouze první výsledek do proměnné s implicitním názvem ans. Obsah výstupní proměnné (proměnných) se hned vypíše. Výpis je možné potlačit uvedením znaku středník (;) bezprostředně za příkaz. Text uve‐ dený znakem procento (%) se do konce řádky považuje za komentář. Je možný zápis i více příkazů do jednoho řádku. Jako příklad jednoduchých příkazů bez vstupních parametrů uveďme skupinu příkazů umožňujících získat informace o prostředí: ispc/ismac/isunix vrací hodnotu 1 na dané platformě, jinak 0 [c,m,e] = computer informace o dané platformě c řetězec PCWIN / PCWIN64 / GLNX86 / GLNXA64 / MAXI64 m hodnota – maximální počet prvků v matici e řetězec L / B – organizace bitů little endien / big endien ver informace o verzích instalovaných součástí pwd úplná cesta k aktuální složce path seznam složek, ve kterých se hledají příkazy MATLABu clock vektor 6 čísel (rok,měsíc,den,hodina,minuta,sekunda) cputime čas v sekundách od spuštění MATLABu now datum a čas zakódovaný do jednoho reálného čísla datestr(now) datum a čas – standardní řetězec tic nastavení časové značky (spuštění stopek) toc uplynulý čas od časové značky (odečtení stopek) Užitečná je možnost nastavit formát výpisu čísel příkazem format. Např. pří‐ kaz format shorteng nastaví výpis na semilogaritmický tvar se čtyřmi čísli‐ cemi za desetinou čárkou a exponentem v násobcích tří (31.4159e+003). Lze též nastavit zahuštěnou (jsou vynechány vložené prázdné řádky) formu výpisu do okna příkazem format short. Jinou možností je výpis celých čísel v šestnáctkové soustavě format hex, či výpis reálných čísel v podobě podílu 18
Velmi užitečné v případě, že jsme vytvořili např. matici o rozměru 1000×1000 a zapomněli příkaz ukončit středníkem – výpis milionu čísel nějakou chvíli trvá.
19
Parametry příkazu mohou být buď ve formě seznamu v kulatých závorkách, nebo jako seznam parametrů oddělený mezerami následující za příkazem
KŘP/IMSW Modelování ve výpočtových software
1‐14 (16) 13.7.11
František Dušek KŘP FEI Univerzita Pardubice
dvou celých čísel format rat. Další možnosti viz help format nebo doc format.
Pokud nelze příkaz provést, je vypsána červeně textová informace upřesňující chybu – např. v případě neexistujícího příkazu >> clck % správně clock ??? Undefined function or variable 'clck'.
V MATLABu lze zapsat i příkazy určené pro operační systém, které jsou OS vy‐ konány a případná textová odpověď je vypsána do Command Windows. Jsou možné dva způsoby, buď předřadit příkazu OS znak vykřičník (!) nebo použít příkaz dos('příkaz OS') případně [status,result]=dos('příkaz OS'). Druhý způsob umožňuje zachytit výsledek příkazu OS do proměnné result, včetně možnosti potlačit výpis do okna středníkem na konci. Více viz. doc dos. % výpis obsahu aktuální složky % do okna >> !dir % spustí poznámkový blok >> !notepad % ověří spojení s adresou % výpis do okna >> !ping www.upce.cz
% uloží seznam do r % bez výpisu do okna >> [s,r]=dos('dir'); % spustí poznámkový blok >> dos('notepad') % ověří spojení s adresou % výpis do okna >> dos('ping www.upce.cz')
KŘP/IMSW Modelování ve výpočtových software
1‐15 (16) 13.7.11
František Dušek KŘP FEI Univerzita Pardubice
Pojmy k zapamatování Okruhy problémů: model a modelování, numerické výpočty, simulace, programy pro numerické výpočty, určení MATLABu, toolbox, blockset, li‐ cence, příkazový řádek, význam a uspořádání hlavního okna, nápověda, příkazy pro získání informací o prostředí a čase Použité nástroje:
Help Browser
Příkazy a funkce: clc, clock, computer, cputime, datestr, doc, dos, format, help, lookfor, now, tic, toc, ver
Otázky na procvičení 1. 2. 3. 4. 5. 6. 7. 8. 9.
Jaký typ modelu je využíván pro výpočty v MATLABu a SIMULINKu? Jaký je rozdíl mezi numerickým výpočtem a simulací? Jaké jsou další programy pro numerické výpočty mimo MATLAB? Co označují pojmy „toolbox“ a „blockset“? Jaké je hlavní omezení licence Classroom Kit? Jaký je rozdíl mezi příkazem help a lookfor? Které funkce či příkazy umožňují změřit časový interval? Jak je označen chybný příkaz? Jak lze zapsat v MATLABu příkaz operačního systému?
Odkazy a další studijní prameny • • •
základní informace o MATLABu včetně jeho součástí a licencích – www.humusoft.cz on‐line dokumentace k programu nebo www.mathworks.com/help/ – části „Instalation Guide“, „Product Overview“, „Starting a MATLAB Sessi‐ on“ elektronická učebnice Learning MATLAB 7 – www.mathworks.com/academia/student_version/learnmatlab_sp3.pdf (části „Introduction“ a „What is MATLAB?“)
KŘP/IMSW Modelování ve výpočtových software
1‐16 (16) 13.7.11
František Dušek KŘP FEI Univerzita Pardubice
2 Základní operace Studijní cíl V druhém bloku se budeme zabývat základními dovednostmi potřebnými pro používání MATLABu. Seznámíme se s datovými typy proměnných, jejich plně‐ ním a možnostmi vstupu a výstupu dat. Dále se budeme zabývat základními operacemi s maticemi a používáním funkcí.
Doba nutná k nastudování
2 ‐ 3 hodiny
Průvodce studiem Předpokládá se, že čtenář je seznámen s prostředím MATLABu a základními příkazy, se základy maticové počtu a komplexními čísly. Při studiu je vhodné mít spuštěný MATLAB a jednotlivé příkazy či funkce hned vyzkoušet a případně získat podrobnější informace využíváním nápovědy k programu. Informace uvedené v tomto bloku budou využívány ve všech následujících blocích. Na závěr jsou uvedeny řešené příklady na procvičení. V textu jsou použity následující typografické konvence: Calibri 11, Bold, Italic nové pojmy či informace k zapamatování Calibri 11 označení klávesy Courier New 10, Bold názvy nástrojů MATLABu Courier New 10, Bold upřesnění nápovědy (help téma) Courier New 10 názvy příkazů, funkcí a objektů Courier New 10 označení části příkazu, která se může vynechat Courier New 10, Italic názvy proměnných použitých v programu Courier New 9 příkazy příkazové řádky
2.1 Proměnné a datové typy Proměnné se vytvářejí při prvním použití (není je potřeba deklarovat ani v pří‐ padě složitých datových typů) v aktuálním pracovním prostoru a existují do té doby, dokud je nevymažeme příkazem clear či naplníme jinou hodnotou. Seznam existujících proměnných v daném pracovním prostoru včetně základ‐ ních informací o nich je v okně Workspace.
2.1.1 Jednoduché proměnné Vytvoření a naplnění proměnné hodnotou může být považováno také za pří‐ kaz. Název proměnné je tvořen písmena číslicemi, musí začínat písmenem a může být dlouhý maximálně 63 znaků (ve verzi R2011b). Aktuální hodnotu lze zjistit příkazem namelengthmax. Např. vytvoření proměnné s názvem a včet‐ ně jejího naplnění hodnotou a vypsání obsahu existující proměnné se provede dále uvedenými příkazy. V levém sloupci je příkaz pro vytvoření proměnné a a naplnění hodnotou s výpisem výsledku doplněný komentářem. V pravém sloupci je příkaz vytvoření proměnné a s naplněním a s potlačením výpisu KŘP/IMSW Modelování ve výpočtových software
2‐1 (18) 20.7.11
František Dušek KŘP FEI Univerzita Pardubice
včetně komentáře. Následuje příkaz pro zjištění obsahu proměnné a. (bez středníku tj. s požadavkem na výpis). % vytvoř s výpisem výsledku % příkazu do okna >> a=7 a = 7
% vytvoř bez výpisu výsledku >> a=7; >> a % vypiš obsah proměnné a = 7
Proměnná se vytvoří v pracovním prostoru 1 (Workspace) a objeví se v seznamu v okně Workspace, kde jsou uvedeny i některé vlastnosti příslušné proměnné. Jakého datového typu je vytvořená proměnná a? Ačkoliv jde o celé číslo je implicitně uloženo jako číslo reálné (dvojnásobná přesnost tj. 64 bit, typ double). Pokud bychom chtěli, aby proměnná byla uložena v paměti jako jiný základní datový typ, je nutné to explicitně uvést. Když tedy chceme mít pro‐ měnnou b uloženou jako celé číslo bez znaménka na 1 byte, je nutné zapsat příkaz b=uint8(7). Stejným způsobem je možné přetypovat i existující pro‐ měnné. Další informace o datových typech a přetypování viz položku nápovědy k programu Programming and Data Types -> Data Type Conversion -> Numeric. Zjištění aktuálního typu proměnné je možné příkazem class(název proměnné). Proměnná obsahující řetězec se vytvoří např. příkazem s=‘ahoj‘. Text před‐ stavující řetězec je v apostrofech. Proměnná s komplexní hodnotou se vytvoří pomocí předdefinované matema‐ tické konstanty i nebo j např. k=4+5i nebo k=4+5j (algebraická forma zápisu komplexního čísla). Vnitřní reprezentace je pomocí dvou reálných čísel. Další předdefinované matematické konstanty jsou: Inf nekonečno (např. 1/0) intmin/intmax nejmenší a největší celé číslo NaN není číslo – neurčitý výraz (např. 0/0) pi reálné číslo (dvojitá přesnost) nejbližší Ludolfovu číslu realmin/realmax nejmenší a největší celé číslo Lze vytvořit i proměnnou bez hodnoty – prázdnou matici příkazem x=[]. Všechny vytvořené proměnné existují v daném pracovním prostoru do doby, než je vymažeme nebo se pracovní prostor nezruší (např. při ukončení funkce). Seznam existujících proměnných v daném pracovním prostoru je v okně Workspace případně ho zjistíme příkazem who (pouze názvy) nebo whos (ná‐ zvy a vlastnosti). Konkrétní proměnnou vymažeme příkazem clear název_proměnné nebo všechny proměnné příkazem clear.
2.1.2 Matice a vektory Nejčastěji jsou v MATLABu používány proměnné obsahující matice či vektory. Vektor (případně skalár) je speciálním případem matice, kde jeden (či oba roz‐ 1
V tomto případě v základním (Base) pracovním prostoru. Pracovních prostorů může být více – např. každá funkce má svůj pracovní prostor vytvořený v okamžiku volání a funkce a zrušený po jejím ukončení. Pracovní prostory jsou něco jako zásobník (stack). V okně Workspace lze mezi existujícími prostory přepínat pomocí ikony Stack v pruhu nástrojů okna.
KŘP/IMSW Modelování ve výpočtových software
2‐2 (18) 20.7.11
František Dušek KŘP FEI Univerzita Pardubice
měry) je roven jedné. Je potřeba rozlišovat mezi pojmem matice (vektor) a 2D (1D) pole. Rozdíl je zřejmý zejména v případě vektoru, který může být řádkový či sloupcový, zatímco u 1D pole orientace neexistuje. Dále je potřeba dodržo‐ vat konvenci, že první uváděný index je řádkový a druhý sloupcový.
Manuální plnění matic a vektorů Plnění vektorů a matic ukážeme na příkladech. V pravém sloupci je uveden alternativní způsob zápisu stejného příkazu % řádkový vektor 1×3 >> Rv=[1,2,3]; % sloupcový vektor 3×1 >> Sv=[1;2;3]; % matice 3×3 >> M1=[1,2,3 4,5,6 7,8,9]; >> M2=[Rv;Rv;Rv]; >> M3=[Sv,Sv,Sv];
% řádkový vektor 1×3 >> Rv=[1 2 3]; % sloupcový vektor 3×1 >> Sv=[1 2 3]; % matice 3×3 >> M1=[1,2,3;4,5,6;7,8,9]; >> M2=[Rv;1 2 3;Rv];
Je potřeba rozlišovat mezi oddělovači mezera, čárka a středník. Středník je používán ve dvou významech – jako oddělovač řádků a pro potlačení výpisu do okna. Je možné používat i již existující proměnné. Pozor na rozměry >> M4=[Rv,Rv,Rv] % vektor 1x9 M4 = 1 2 3 1 2 3 1 >> M5=[Rv,Rv;Rv] % chyba - nelze provést! ??? Error using ==> vertcat CAT arguments dimensions are not consistent. >> M5=[Rv,Sv,Rv] % chyba - nelze provést! ??? Error using ==> horzcat CAT arguments dimensions are not consistent.
2
3
Automatické plnění matic a vektorů Pokud v číslech, které se ukládají do vektoru či matice, existují nějaké zákoni‐ tosti, je možné využít speciální příkazy. Řadu po sobě jdoucích čísel s konstantním krokem vytvoříme pomocí dvojtečky nebo příkazem linspace, případně logaritmicky rozložené hodnoty příkazem logspace V1=5:0.1:6; V2=1:10;
řádkový vektor 1×11, od 5 do 6, krok 0.1 řádkový vektor 1×9, od 1 do 10, krok 1 řádkový vektor 1×100 s hodnotami rovnoměrně rozloženými od 1 do 5 V3=linespace(1,5,100);
řádkový vektor 1×100 s hodnotami logaritmicky rozloženými mezi 10‐1 a 105 V4=logspace(-1,5,100);
Další možností je naplnění vektoru či matice konstantou, naplnění náhodnými hodnotami nebo vytvoření diagonální matice M1=zeros(50,100); matice 50×100 naplněná nulami M2=ones(500,10); matice 500×10 naplněná hodnotou jedna M3=eye(25,30); matice 25×30 s hodnotou 1 na hlavní diagonále, 0 jinde M4=rand(1,10); řádkový vektor 1×10, náhodné hodnoty, rovnoměrné
rozložení na intervalu 0‐1
KŘP/IMSW Modelování ve výpočtových software
2‐3 (18) 20.7.11
František Dušek KŘP FEI Univerzita Pardubice
M5=randn(50,1);
sloupcový vektor 50×1, náhodné hodnoty, normální rozložení N(0,1) tj. střední hodnota nula a jednotkový rozptyl
Další funkce pro vytvoření matic se speciálními vlastnostmi, zjištění jejich vlastností a manipulaci s maticemi viz help elmat.
Základní manipulace s maticemi Pro výběr jedné hodnoty na pozici 3 řádek, 5 sloupec z matice M1 a její uložení do skalární proměnné m použijeme příkaz m=M1(3,5). Indexy se počítají od hodnoty 1! Pro výběr části matice lze využít výčet indexů používající dvojtečku – např. vytvoření matice M1 o rozměru 100×100, která má po obvodu hodnoty 1 a jinde hodnoty 0 zajistí následující příkazy M0=zeros(100,100); M1=ones(100,100); M=M0(1:98,1:98); výběr submatice M1(2:99,2:99)=M; nebo např. M1(2:99,2:99)=M0(3:100,1:98);
Dvojtečku na místě indexů lze použít i bez hodnot – pak znamená všechny in‐ dexy. Použití je např. pro výběr celého sloupce či řádku Sv=M0(:,2); Rv=M0(3,:);
výběr druhého sloupce výběr třetího řádku
Pro zjištění rozměrů proměnné se používají příkazy length (vrací největší rozměr) a size (vrací oba rozměry) >> M=rand(25,75); >> length(M) ans = 75 >> [r,s]=size(M) r = 25 s = 75
Někdy je potřeba vybrat všechny indexy od dané hodnoty do konce. Pokud známe rozměr, je řešení zřejmé. Pokud rozměr neznáme, je možné rozměr zjistit příkazem size nebo použít klíčové slovo end. >> M=rand(10,20); >> [r,s]=size(M); >> M(8:r,15:s) ans = 0.7826 0.5707 0.2955 0.5718 0.1518 0.2860 >> M(8:end,15:end) ans =0.7826 0.5707 0.2955 0.5718 0.1518 0.2860
0.9037 0.9085 0.7472 0.9037 0.9085 0.7472
0.0734 0.8223 0.7229 0.0734 0.8223 0.7229
0.0364 0.3262 0.9730 0.0364 0.3262 0.9730
0.4996 0.6153 0.5831 0.4996 0.6153 0.5831
Na místě indexů je možné kromě skalárních proměnných používat i vektorové proměnné, které nemusí obsahovat souvislý rozsah indexů. Následující příklad ukazuje jak vybrat každou desátou hodnotu z daného vektoru. >> data=randn(1,10000); % původní data >> n=1:10:10000; % indexy 1,11,21,...,9991 >> d10=data(n); % pouze každý desátý
KŘP/IMSW Modelování ve výpočtových software
2‐4 (18) 20.7.11
František Dušek KŘP FEI Univerzita Pardubice
2.1.3 Složitější datové struktury základních jednoduchých datových typů (uint8/int8, uint16/int16, uint32/int32, uint64/int64, single, double) a
Kromě
matice komplexních čísel je možné používat i složitější datové struktury. Pokud rozsáhlé matice obsahují významný počet nulových prvků, lze použít speciální datový typ tzv. sparse – řídké matice. Uložení dat je paměťově úsporné, a přesto je možné s maticemi tohoto typu standardně pracovat. V následujícím příkladu se potřebuje pro uložení jednotkové matice při použití typu sparse pouze 0.2% paměti jinak potřebné při standardním uložení >> M=eye(1000,1000); >> S=sparse(M); >> whos Name Size M 1000x1000 S 1000x1000
% jednotková matice (8 000 000 B) % vytvoření řídké matice (16 004 B) % výpis proměnných Bytes Class Attributes 8000000 double 16004 double sparse
Datový typ vícerozměrná matice odpovídá n‐dimensionálnímu poli v jiných programovacích jazycích. Na vícerozměrné matice nelze aplikovat standardní maticové operace! Používají se např. pro uložení informace o obraze – každý bod dvourozměrného obrazu je popsán trojicí byte s intenzitou barevné složky RGB (např. 1024×768×3). Vytvoření vícerozměrné matice je nejjednodušší pomocí příkazů pro plnění např. >> M3D=rand(4,3,2) M3D(:,:,1) = 0.2146 0.5062 0.4313 0.8074 M3D(:,:,2) = 0.7715 0.3957 0.7815 0.3486
0.4753 0.9190 0.3801 0.4771 0.0943 0.3356 0.0897 0.4390
0.9908 0.1708 0.4998 0.7410 0.2376 0.6042 0.9120 0.7349
Datový typ struktura je stejný jako v jiných jazycích. Je možné vytvořit pro‐ měnnou s pojmenovanými položkami libovolného datového typu. Je možné použít buď příkaz struct (parametry jsou dvojice ‚název položky‘, hodnota) >> st=struct('jm','Josef','pr','Novak','na',1968,'zn',[1,2;2,1]) st = jm: 'Josef' pr: 'Novak' na: 1968 zn: [2x2 double]
nebo přímé vytvoření položek >> >> >> >>
st.jm='Josef'; st.pr='Novak'; st.na=1968; st.zn=[1,2;2,1];
Datovým typem, který nemá ekvivalent ve standardních jazycích je pole buněk (cell array). Jde o matici (přístup k prvkům pomocí indexů) a každý prvek mati‐ ce může být jiného datového typu. Při vytváření se místo hranatých závorek
KŘP/IMSW Modelování ve výpočtových software
2‐5 (18) 20.7.11
František Dušek KŘP FEI Univerzita Pardubice
používají závorky složené. Proměnnou typu pole buněk lze převést 2 na typ matice funkcí cell2mat a obráceně příkazem mat2cell.
>> ce={rand(2),'ahoj'; 7, 5-6*i} ce = [2x2 double] 'ahoj' [ 7] [5.0000 - 6.0000i]
Jen velmi stručně se zmíníme o datovém typu třída (class) a její instanci objekt. Kromě toho, že lze vytvořit vlastní třídy a odvozovat od nich objekty podle standardních pravidel objektového programování MATLAB obsahuje příkazy vytvářející určité typy objektů a samozřejmě funkce, které je využívají. Ukažme příklad vytvoření objektu timer (časovač) s uživatelským názvem „Casovac“ a nastavení jeho atributů tak, aby 5x po sobě s intervalem 1.5 sec spustil příkaz pro výpis aktuálního data a času. >> >> >> >>
t=timer('Name','Casovac','Period',1.5); set(t,'TasksToExecute',5,'ExecutionMode','FixedRate'); set(t,'TimerFcn','datestr(now)'); get(t) % výpis všech atributů objektu AveragePeriod: NaN BusyMode: 'drop' ErrorFcn: '' ExecutionMode: 'fixedRate' InstantPeriod: NaN Name: 'Casovac' ObjectVisibility: 'on' Period: 1.5000 Running: 'off' StartDelay: 0 StartFcn: '' StopFcn: '' Tag: '' TasksExecuted: 0 TasksToExecute: 5 TimerFcn: 'datestr(now)' Type: 'timer' UserData: [] >> start(t) % spuštění časovače
Atributy objektu lze získat pomocí příkazu get a plnit při jeho vytvoření nebo pomocí příkazu set. V obou případech se uvádí dvojice název atributu, hodno‐ ta. Hodnota musí být odpovídajícího datového typu. Např. atributy s názvem ukončeným znaky „…Fcn“ vyžadují datový typ řetězec (použito v příkladu), pole buněk nebo ukazatel na funkci (function handler). Pro vytvoření ukazatele na funkci se používá znak @. Je možné vytvořit ukazatel jak na funkce jádra, tak na uživatelské funkce – např. >> fh=@sin fh = @sin >> fh(pi/2) ans = 1
Poznámka k proměnné označující objekt – v příkladu označená t. Tato pro‐ měnná je pouze ukazatel (reference, handle) na objekt. To znamená, že její smazání příkazem clear t smaže pouze referenci, ale objekt zůstává v paměti. Smazání vlastního objektu provede příkaz delete(t). Toto je důle‐ 2
Pokud jsou všechny prvky pole buněk stejného datového typu
KŘP/IMSW Modelování ve výpočtových software
2‐6 (18) 20.7.11
František Dušek KŘP FEI Univerzita Pardubice
žité si uvědomit zejména v případě, že objekt zprostředkovává přístup k hard‐ ware (např. objekt serial 3 či objekt daq z Data Acquisition Tbx). Objekt může být ve stavu, že má příslušný hardware alokován pro svoji potřebu a pokud smažeme ukazatel, ztratíme možnost s objektem pracovat a není možné zablo‐ kované HW uvolnit. Řešení je buď ukončit a znovu spustit MATLAB nebo použít příkaz pro vyhledání objektu a vytvoření nového ukazatele. Pro specifické typy objektů jsou specifické příkazy např. uk=instfind pro objekt typu serial či uk=daqfind pro objekt typu daq.
Problematika grafických objektů (Handle Graphics) bude řešena v samostatné části později. Vytváření, vyhledávání a mazání grafických objektů se liší od po‐ stupů uvedených výše.
2.1.4 Vstup a výstup dat Kromě plnění proměnných přiřazením (znak =) a výpisu obsahu neuvedením středníku za příkaz, jak bylo uvedeno v předchozí kapitole, je možné použít jednoduché příkazy input a disp. Oba příkazy najdou hlavně uplatnění při psaní uživatelských programů. Příkaz disp se syntaxí disp(varname)
nebo
disp('text')
vypíše obsah proměnné (nebo textu) uvedené jako (pouze jeden) argument (podobně jako zápis názvu proměnné bez středníku), ale bez výpisu názvu proměnné. Příkaz input se syntaxí var=input('text')
vypíše text uvedený jako argument a čeká na text zapsaný z klávesnice ukon‐ čený klávesou Enter. Pokud je možné text převést na číslo, to se uloží do pro‐ měnné číslo. Jinak do proměnné uloží zadaný řetězec. S plněním proměnných souvisí i vstup a výstup dat mimo prostředí MATLAB. Existuje několik úrovní příkazů pro výměnu dat. Nejjednodušší z hlediska pou‐ žívání jsou příkazy nejvyšší úrovně. Základní jsou příkazy save a load. Případ‐ né vstupní parametry příkazu save mohou být uvedeny buď jako seznam od‐ dělený mezerami nebo seznam v závorce (parametry jako řetězce tj. v apostrofech) save uložení obsahu proměnných do souboru save filename var1 var2 … format version save(filename, var1,var2,…,format,version) filename specifikace 4 souboru, je‐li vynecháno, použije se matlab.mat var1, var2 názvy proměnných, není‐li žádný, uloží se celý pracovní prostor format možné je -mat (binární uložení, použito když je formát vynechán) nebo -ascii (textové uložení, 8 číslic), -ascii je možné doplnit o -double (16 číslic) a -tabs (oddělovač tabulátor)
3
Zprostředkovává přístup k sériovým portům com0‐com255, jsou použitelné i pro virtuální séri‐ ový port USB 4 Není‐li použita úplná cesta, ukládá se do aktuální složky (Current Folder)
KŘP/IMSW Modelování ve výpočtových software
2‐7 (18) 20.7.11
František Dušek KŘP FEI Univerzita Pardubice
version možné je -v7.3|-v7|-v6|-v4, binární uložení specifické pro
různé verze MATLABu load načtení hodnot ze souboru do proměnné shodné se jménem souboru load (filename) v případě binárního formátu obnoví všechny
proměnné uložené v souboru v případě binárního souboru vytvoří strukturu var s položkami pojmenovanými podle názvů proměn‐ ných, v případě textového souboru vytvoří proměnnou s názvem var obsahující hodnoty ze souboru, data v souboru musí odpoví‐ dat matici či vektoru (všechny řádky musí obsahovat stejný počet čísel)
var=load (filename)
Příklady:
>> >> do >> ze >> >> AB
A=zeros(3,5); B=ones(2,3); save % uloží obsah i názvy všech proměnných binárního souboru s implicitním názvem matlab.mat load % načte (včetně názvů) všechny proměnné souboru s názvem matlab.mat save('ab.mat') % ulož jako binární soubor AB=load('ab.mat') % načti a vytvoř strukt. s položkami A, B = A: [3x5 double] B: [2x3 double] >> load('ab.mat') % načti a vytvoř proměnné A, B >> save ab.txt -ascii –double % ulož do textového souboru hodnoty z A, B >> AB=load('ab.txt') % chyba – nesprávné uspořádání souboru ??? Error using ==> load Number of columns on line 3 of ASCII file C:\Dusek\MATLAB\ab.txt must be the same as previous lines. >> save ab.txt A -ascii –double % ulož do textového souboru hodnoty z A >> oA=load('ab.txt') % načti a vytvoř proměnnou oA >> load('ab.txt') % načti a vytvoř proměnnou ab (jméno souboru)
Pro čtení/zápis (import/export) v jiných datových formátech lze použít buď specializované příkazy 5 podle Tabulky 2‐1 nebo nástroj Import Wizard. Ten je možné spustit buď příkazem uiimport nebo výběrem souboru v okně Current Folder a po stisku pravého tlačítka myši výběrem položky Import Data… z nabídky. Ukázka okna Import Wizard při načítání textového souboru je na Obrázku 2‐1. Import Wizard vyžaduje jako oddělovač desetinné části tečku. Na platformě Windows je možné načíst zvukový signál z audiovstupu příkazem wavrecord (včetně volby vzorkovací frekvence) a přehrát data na audio vý‐ stup příkazem wavplay. Další specializované příkazy viz help audiovideo. Kromě výše uvedených příkazů je možné používat i nízkoúrovňové příkazy po‐ dobně jako v jazyce „C“. Např. příkazy fopen/fclose, fprintf, fscanf, fread/fwrite atd. Přehled všech příkazů viz help iofun. 5
Jsou vynechány příkazy pro formáty používané pouze na platformách Linux a Mac
KŘP/IMSW Modelování ve výpočtových software
2‐8 (18) 20.7.11
František Dušek KŘP FEI Univerzita Pardubice
Tabulka 2‐1
MATLAB format
Import
Export
MAT DAQ
load daqread
save ---
Text format
Import
Export
any any any
load dlmread textscan
save -ascii dlmwrite ---
MATLAB workspace Data Acquisition Toolbox White‐space delimited numbers Delimited numbers Any above text format, or a mix of strings and num‐ bers Extended Markup Language
xmlread
xmlwrite
Spreadsheet formats
Import
Export
XLS
xlsread
xlswrite
Scientific data formats
Import
Export
CDF
Common Data Format
FITS HDF H5 NC
Flexible Image Transport System Hierarchical Data Format v.4 Hierarchical Data Format v.4 network Common Data Form v.3
cdfread cdflib fitsread hdfread hdf5read netcdf
cdfwrite cdflib ----hdf5write netcdf
Video formats (All Platforms)
Import
Export
AVI MJ2
mmreader mmreader
avifile ---
Video formats (Windows and Mac)
Import
Export
MPEG Motion Picture Experts Group, phases 1 and 2 (Inclu‐ des MPG)
mmreader
---
Video formats (Windows only)
Import
Export
WMV ASF ASX any
mmreader mmreader mmreader mmreader
---------
Image formats
Import
Export
BMP CUR FITS GIF HDF ICO JPEG JP2 PBM PCX PGM PNG PNM PPM RAS TIFF XWD
imread imread imread imread imread imread imread imread imread imread imread imread imread imread imread imread imread
imwrite ----imwrite imwrite --imwrite imwrite imwrite imwrite imwrite imwrite imwrite imwrite imwrite imwrite imwrite
Audio formats
Import
Export
AU SND WAV
auread auread wavread
auwrite auwrite wavwrite
XML
Excel worksheet (XLSX, XLSB, XLSM require Excel 2007 for Windows)
Audio Video Interleave Motion JPEG 2000
Windows Media Video Windows Media Video Windows Media Video formats supported by DirectShow Windows Bitmap Windows Kursor resources Flexible Image Transport Systém Includes FTS Graphics Interchange Format Hierarchical Data Format Icon image Joint Photographic Experts Group Includes JPG JPEG 2000 Includes JPF, JPX, J2C, J2K Portable Bitmap Paintbrush Portable Graymap Portable Network Graphics Portable Any Map Portable Pixmap Sun Raster Tagged Image File Format Includes TIF X Window Dump NeXT/Sun sound NeXT/Sun sound Microsoft Wave sound
KŘP/IMSW Modelování ve výpočtových software
2‐9 (18) 20.7.11
František Dušek KŘP FEI Univerzita Pardubice
Obrázek 2‐1 Načítání textového souboru pomocí Import Wizard
2.2 Základní maticové operace Je potřeba si uvědomit, že matematické operace jsou v MATLABu implicitně maticové a je tedy nutné dodržovat pravidla maticové počtu. Obecně nelze sečíst a vynásobit libovolné dvě proměnné. Sčítat lze pouze matice stejného rozměru. Násobit lze pouze takové dvě matice, kdy počet sloupců první matice je stejný jako počet řádků matice druhé. Výsledná matice má stejný počet řád‐ ků jako matice první a stejný počet sloupců jako matice druhá. Při násobení záleží na pořadí. Přičítat či násobit skalárem lze matice bez omezení. >> a=[1,2,3]; % řádkový vektor >> b=[1;2;3]; % sloupcový vektor >> c=a+b % nelze ??? Error using ==> plus Matrix dimensions must agree. >> v1=a*b % skalární součin v1 = 14 >> v2=b*a % maticový součin v2 = 1 2 3 2 4 6 3 6 9 >> v3=a*a % nelze ??? Error using ==> mtimes Inner matrix dimensions must agree. >> v3=a^2 % nelze ??? Error using ==> mpower Inputs must be a scalar and a square matrix.
Pokud chceme aplikovat nějakou operaci mezi odpovídajícími prvky matic je potřeba použít příznak operací prvek po prvku tj. operátoru předřadit znak tečka >> >> >> v3 >> v4
a=[1,2,3]; b=[1;2;3]; v3=a.*a = 1 4 v4=b.^2 = 1 4 9
% řádkový vektor % sloupcový vektor % součin prvek po prvku 9 % mocnění prvvek po prvku
KŘP/IMSW Modelování ve výpočtových software
2‐10 (18) 20.7.11
František Dušek KŘP FEI Univerzita Pardubice
>> v5=a./a v5 = 1 1
% dělení prvek po prvku 1
Ačkoliv maticové dělení není definováno, v MATLABu existuje operace matico‐ vé dělení zleva (operátor \) a dělení zprava (operátor /) – blíže bude popsáno v kapitole věnované soustavám lineárních rovnic. Další viz help arith. Dále existují speciální maticové operace. Mezi ně patří operace transpozice (znak apostrof za názvem proměnné), výpočet determinantu (funkce det) a inverzní matice (funkce inv nebo ^(‐1)). >> a=[1,2,3]; % řádkový vektor >> b=a' % sloupcový vektor b = 1 2 3 >> A=b*a % čtvercová matice A = 1 2 3 2 4 6 3 6 9 >> det(A) % výpočet determinantu ans = 0 >> inv(A) % nelze - A je singulární matice Warning: Matrix is singular to working precision. ans = Inf Inf Inf Inf Inf Inf Inf Inf Inf >> A(2,2)=-1; A(3,3)=1; % odstranění singularity >> det(A) % výpočet determinantu ans = 40 >> B=inv(A) % výpočet inverzní matice B = -0.9250 0.4000 0.3750 0.4000 -0.2000 0 0.3750 0 -0.1250 >> E=A*B % jednotková matice E = 1.0000 0 0 0 1.0000 0 0 0 1.0000
Mezi důležité úlohy lineární algebry patří určení vlastních čísel a vektorů mati‐ ce a dekompozice (faktorizace) matic. Vlastní čísla λi a vlastní vektory xi ke čtvercové matici M splňují rovnici
M.xi = λi .xi ⇔ (M − λi .I ).xi = xi Počet vlastních čísel odpovídá hodnosti matice tj. pro regulární čtvercovou matici jejímu rozměru. Funkce [X,L]=eig(M) počítá všechna vlastní čísla a vlastní vektory čtvercové matice M najednou. Čtvercová matice X obsahuje jako sloupce všechny vlastní vektory xi a čtvercová diagonální matice L obsahu‐ je na diagonále všechna vlastní čísla λi. Následující příkazy vytvoří speciální matici (magický čtverec 6 ), ověří jeho hodnost, spočítají všechna vlastní čísla a vektory a ověří platnost rovnice pro druhé vlastní číslo 6
Magický čtverec je čtvercová matice rozměru n≥3, která obsahuje všechna čísla od 1 do n2 uspořádaná tak, že součet čísel každého řádku, sloupce i hlavní diagonály je stejný a rovný hod‐ notě
1 n 2 ∑ i . n i=1
KŘP/IMSW Modelování ve výpočtových software
2‐11 (18) 20.7.11
František Dušek KŘP FEI Univerzita Pardubice
>> M=magic(5) % vytvoření magického čtverce M = 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 >> r=rank(M) % určení hodnosti matice r = 5 >> [X,L]=eig(M) % výpočet vlastních vektorů a čísel X = -0.4472 0.0976 -0.6330 0.6780 -0.2619 -0.4472 0.3525 0.5895 0.3223 -0.1732 -0.4472 0.5501 -0.3915 -0.5501 0.3915 -0.4472 -0.3223 0.1732 -0.3525 -0.5895 -0.4472 -0.6780 0.2619 -0.0976 0.6330 L = 65.0000 0 0 0 0 0 -21.2768 0 0 0 0 0 -13.1263 0 0 0 0 0 21.2768 0 0 0 0 0 13.1263 >> vl=M*X(:,3); % výpočet levé strany pro třetí číslo >> vp=L(3,3)*X(:,3); % výpočet pravé strany pro třetí číslo >> [vl,vp] % výpis výsledků pro porovnání ans = 8.3086 8.3086 -7.7377 -7.7377 5.1393 5.1393 -2.2730 -2.2730 -3.4373 -3.4373
Dekompozice nebo také faktorizace matice znamená rozklad na součin matic, které mají speciální vlastnosti, např. Choleského (odmocninová) faktorizace čtvercové, pozitivně definitní matice M znamená rozklad na součin matice X a její transpozice tj. M=XTX. Matice X je horní trojúhelníková matice. Odpovídají‐ cí funkce je X=chol(M). LU faktorizace obecné matice M je rozklad na součin dolní L a horní U trojúhelníkové matice, pro které platí LU=M. Odpovídající funkce je [L,U]=lu(M). Užitečná je dekompozice SVD (Singular Value De‐ composition) určující tzv. singulární čísla. Tato dekompozice rozkládá obecnou matici M na součin tří matic tj. M=USV, kde (obecně obdélníková) diagonální matice S obsahuje singulární čísla matice M a pro čtvercové matice U a V platí UUT=I a VVT=I, kde I je jednotková matice. Odpovídající funkce je [U,S,V]=svd(M). Další maticové funkce viz help matfun.
2.3 Standardní matematické funkce Kromě již zmiňovaných speciálních funkcí souvisejících s maticovým počtem MATLAB obsahuje i všechny standardní matematické funkce. Jejich přehled viz help elfun. Připomeňme odlišnosti v jejich používání: a) funkce mohou mít více výstupních parametrů (seznam v hranatých zá‐ vorkách) b) vstupní i výstupní parametr může být datového typu matice, funkce je aplikována na každý prvek vstupního parametru a výsledek je přenesen do odpovídajícího prvku výstupního parametru c) funkce lze používat v celém definičním rozsahu včetně oblasti kom‐ plexních čísel
KŘP/IMSW Modelování ve výpočtových software
2‐12 (18) 20.7.11
František Dušek KŘP FEI Univerzita Pardubice
Následuje několik komentovaných ukázek používání základních matematických funkcí – odmocnina, logaritmus, komplexní čísla, goniometrické funkce, opera‐ ce prvek po prvku, minimum a maximum >> x=-2:2 % řádkový vektor 5 čísel x = -2 -1 0 1 2 >> y1=sqrt(x) % odmocnina ze záporného čísla y1 = 0 + 1.4142i 0 + 1.0000i 0 1.0000 1.4142 >> y2=log(x) % přirozený logaritmus y2 = 0.6931 + 3.1416i 0 + 3.1416i -Inf 0 0.6931 >> y3=1./y2 % dělení komplexním číslem a 0 y3 = 0.0670 - 0.3035i 0 - 0.3183i 0 Inf 1.4427 >> k=5-4i >> abs(k) % abs. hod. čísla ans = 6.4031 >> angle(k) % fázový úhel komplexního čísla ans = -0.6747 >> x=linspace(-2*pi,2*pi,1000); % řádkový vektor 1000 čísel >> y=sin(x); >> ys2=sin(x)^2; % chyba–považováno za maticovou operaci ??? Error using ==> mpower Inputs must be a scalar and a square matrix. >> ys2=sin(x).^2; % každý prvek^2, operace prvek po prvku >> jedna=ones(size(x)); % jednotkový vektor o rozměrech x >> r=sin(x).^2+cos(x).^2-jedna; % pro všechny hodnoty má být 0 >> min(r) % minimální hodnota vektoru ans = -2.2204e-016 >> max(r) % maximální hodnota vektoru ans = 2.2204e-016
Příklad funkce s více výstupními parametry – výpočet kartézských souřadnic prostorové spirály a jejich přepočet na sférické souřadnice 160 140 120
>> >> >> >> >> >>
% řádkový vektor 1000 čísel t=0:4*pi/999:4*pi; x=t.*sin(2*t); y=t.*cos(t); z=t.^2-sqrt(t); [th,phi,r]=cart2sph(x,y,z);
100 80 60 40 20 0 -20 15
Funkce pro analýzu dat – základní statistické funkce >> x=randn(1,10000); >> mean(x) ans = 0.0017 >> std(x) ans = 0.9915 >> var(x) ans = 0.9830 >> median(x) ans = 0.0086 >> mode(x) ans = -3.7422 >> min(x) ans = -3.7422 >> max(x) ans = 3.5784 >> sum(x) ans = 16.5943 >> prod(x) ans = 0 >> y=sort(x);
10
15 10
5 5
0
% 10000 náhodných čísel % střední hodnota
0 -5
-5
-10 -10
-15
% směrodatná odchylka % rozptyl % medián % nejčastěji se vyskyt. hodnota % minimum % maximum % součet všech prvků % součin všech prvků
KŘP/IMSW Modelování ve výpočtových software
% vytvoř seřazený vektor
2‐13 (18) 20.7.11
František Dušek KŘP FEI Univerzita Pardubice
Dále uvedeme příklad dvou složitějších matematických funkcí. Např. výpočet
∞
∫
gamma funkce (zobecněný faktoriál 7 ) popsané vztahem Γ(a) = e−t t a−1dt jed‐ 0
noduše zjistíme použitím funkce y=gama(x). Druhou často používanou funkcí je tzv. chybová funkce erf definovaná vztahem erf ( x) =
2
π
x
∫e
−t 2
dt , hodnotu
0
které zjistíme použitím funkce y=erf(x). Další funkce viz help specfun.
2.3.1 Funkce pro práci s řetězci, logické funkce a operátory Funkce z této skupiny jsou potřebné zejména při tvorbě vlastních funkcí (pro‐ gramu. Pro práci s řetězci jsou k dispozici speciální funkce (úplný seznam funkcí viz help strfun). Mezi často používané patří funkce s=strcat(s1,s2,…,sn) f=strcmp(s1,s2) k=strfind(text,vzor) s=lower(s1)/upper(s1) s=num2str(n,format) n=str2num(s) s=sprintf(format,A)
spojení n řetězců porovnání dvou řetězců pozice výskytu vzor v text převod řetězce na malá/velká písmena převod čísla na řetězec převod řetězce na číslo vytvoření řetězce formátovaných dat
S řetězci souvisí i užitečná funkce eval, která zajistí provedení příkazu zadané‐ ho ve formě řetězce – např. >> sa='a=sin(x)'; % řetězec představující úplný příkaz >> x=linspace(0,pi,5); >> eval(sa); % !!! ač středník tak výpis (je uvnitř eval) a = 0 0.7071 1.0000 0.7071 0.0000 >> b=eval(sa) % chyba b=a=sin(x) ??? Error: The expression to the left of the equals sign is not a valid target for an assignment. >> b=eval('sin(x)') % výpisu vně eval (středník potlačí) b = 0 0.7071 1.0000 0.7071 0.0000
Logické funkce vrací hodnotu 0 (logická nula, false, nepravda, nesplněno atd.) nebo 1 (logická jednička, true, pravda, splněno atd.). Výsledná hodnota může být vektor či matice. Velká skupina funkcí pro testování zda něco má určitou vlastnost, začíná znaky is…() Tyto funkce též vrací logickou hodnotu 0/1 (ne‐ bo vektor hodnot). Např. isinteger() zjišťuje, zda argument je celé číslo a isinf() zjišťuje, zda argument je nekonečno (inf). Funkce isempty() zjišťu‐ je, zda proměnná má nějakou hodnotu 8 . Následující příklad ukazuje vytvoření vektoru p obsahujícího prvočísla do hodnoty 1000. Funkce isprime vrací hod‐ notu 1, jde‐li o prvočíslo jinak 0, aplikována na vektor vrací vektor 0 a 1. Funkce find vrací vektor s indexy (polohou) nenulových položek, který je využit pro výběr prvočísel z původního vektoru všech čísel. 7
Faktoriál je definovaný pouze pro 0 a čísla přirozená, gamma funkce je definována pro čísla kladná reálná čísla přičemž pro přirozená čísla platí Γ(n+1)=n!
8
V MATLABu můžeme vytvořit proměnnou bez hodnoty tj. prázdnou matici příkazem x=[]
KŘP/IMSW Modelování ve výpočtových software
2‐14 (18) 20.7.11
František Dušek KŘP FEI Univerzita Pardubice
>> a=1:1000; % vektor celých čísel od 1 do 1000 >> n=find(isprime(a));% vektor indexů hodnot splňujících podmínku >> p=a(n); % vektor s prvočísly, které jsou ve vektoru a
Logické hodnoty vrací i porovnání pomocí relačních operátorů == (rovno) , ~= (nerovno) , < (menší), <= (menší nebo rovno), > (větší), >= (větší nebo rovno), které lze aplikovat i na vektory a matice viz příklad >> a=[1 2 3]; b=[3 1 3]; >> v=a>=b v = 0 1 1
U logických operátorů (viz Tabulka 2‐2) je třeba rozlišovat, zda jde o vztahy mezi odpovídajícími prvky matice 9 (element‐wise operators or functions) nebo o vztahy mezi odpovídajícími bity dvou beznaménkových celých čísel (bit‐wise operators or functions). V obou případech je možné použít funkční tvar nebo pro některé operace zkrácený operátorový tvar. Více viz help relop Tabulka 2‐2 mezi odpovídajícími prvky vektorů či matic funkce operátor or(A,B) A|B logický součet and(A,B) A&B logický součin xor(A,B) -- not(A) ~A doplněk jednotkový doplněk prvních 16 bitů čísla operace
mezi odpovídajícími bity bez‐ znaménkových celých čísel funkce operátor bitor(A,B) A||B bitand(A,B) A&&B bitxor(A,B) --bitcmp(A,16)
---
9
Nulové hodnoty se považují za logickou nulu a nenulové prvky za logickou jedničku
KŘP/IMSW Modelování ve výpočtových software
2‐15 (18) 20.7.11
František Dušek KŘP FEI Univerzita Pardubice
2.4 Příklady na procvičení V kapitole 2.4.1 jsou zadání a v kapitole 2.4.2 řešení jednoduchých příkladů na problematiku prvních dvou bloků. Předpokládá se, že při řešení příkladů má čtenář k dispozici MATLAB a aktivně využívá nápovědu k programu.
2.4.1 Zadání příkladů Př01. Vytvořte vektory a potom je vymažte. a) řádkový vektor a naplněný celými čísly od 50 do 100 b) sloupcový vektor b naplněný celými čísly od 100 do 50 c) sloupcový vektor c naplněný všemi celými čísly dělitelnými 7 (< 5000) d) řádkový vektor d naplněný 2500 hodnotami z intervalu <‐2π, 2π> e) řádkový vektor e obsahující 10 komplexních čísel, jejichž reálná část jsou celá čísla od 1 do 5 a imaginární část jsou celá čísla od 5 do 1 Př02. Vytvořte matice a potom je vymažte. a) matici A (50 řádků, 40 sloupců) naplněná hodnotou 7 b) matici B (5 řádků, 100 sloupců) kde na prvním řádku jsou hodnoty 1, na druhém 1.1 na třetím 1.2 atd. c) matici C (100 řádků a sloupců), která má na obvodu hodnoty 2 a 0 jinde Př03. Vytvořte sloupcový vektor vr naplněný 1000 náhodnými čísly rovnoměr‐ ně rozloženými v rozsahu ‐10 až 10 a řádkový vektor vn naplněný 1000 ná‐ hodnými čísly normální rozložení N(0,1) a vytvořte vektor v tvořený souči‐ nem odpovídajících hodnot ve vektorech vn, vr. a) určete směrodatnou odchylku a střední hodnotu vektoru v b) určete součet kvadrátů čísel ve vektoru v (pomocí funkce sum) c) určete součet kvadrátů čísel ve vektoru v (použitím vektorových operací) Př04. Vytvořte vektor x (10 hodnot na intervalu ‐2≤x≤+2), spočítejte vektor y podle vztahu y(x)=x5‐4x4+x+1. Ke každé hodnotě vektoru y přičtěte náhodné číslo s rovnoměrným rozložením z intervalu ±1 a uložte do vektoru yn. Vy‐ tvořte matici D obsahující v prvním sloupci hodnoty vektoru x a ve druhém sloupci hodnoty vektoru y a ve třetím yn. Matici D uložte do textového sou‐ boru s názvem data.txt. Př05. Vytvořte matici o dvou sloupcích, kde první sloupec bude tvořen nezávis‐ le proměnnou a druhý (a případně další) sloupec hodnotami dané funkce
x 0 ≤ x ≤ 10 100 hodnot 1+ x2 b) y ( x ) = e x sin 2 1 − x 2 cos( x ) 0 ≤ x ≤ 4π 500 hodnot 2 − s +1 0 ≤ f ≤ 1e4 10000 hodnot c) p ( f ) = 5 e −3 s s = j 2πf 3 2 s − s + s +1 y1 = p y2 = Φ( p ) absolutní hodnota a fázový úhel komplexního čísla a) y ( x) =
(
)
z = a + bj = z [sin (Φ ) + j cos(Φ )]
z = a 2 + b2
sin (Φ ) =
b z
cos(Φ ) =
a z
KŘP/IMSW Modelování ve výpočtových software
2‐16 (18) 20.7.11
František Dušek KŘP FEI Univerzita Pardubice
2.4.2 Řešení příkladů Př01. a) b) c) d) e)
>> a=50:1:100; >> b=100:-1:50; b=b‘; >> c=7:7:5000; c=c'; >> d=linspace(-2*pi,2*pi,2500); >> r=1:5; k=5:-1:1; k=k*i; >> e=r+k e = 1.0000 + 5.0000i … 5.0000 + 1.0000i >> clear a b c d e r k
Př02. a) >> A=zeros(50,40)+7; nebo >> A=ones(50,40)*7; b) >> b=ones(1,100); c)
>> >> >> >>
B=[b;b+0.1;b+0.2;b+0.3;b+0.4]; C=ones(100,100)*2; C(2:99,2:99)=zeros(98,98); clear A B b C
Př03. >> vr=20*rand(1,1000)-10; a)
b) c)
>> vn=randn(1000,1); >> v=vr'.*vn; % sloupcový vektor >> mean(v) % střední hodnota ans = 0.1842 >> std(v) % směrodatná odchylka ans = 5.6188 >> sum(v.^2) ans = 3.1573e+004 >> v'*v ans = 3.1573e+004
Př04. >> x=linspace(-2,2,10); >> >> >> >>
% řádkový vektor y=x.^5-4*x.^4+x+1; % řádkový vektor yn=y+2*rand(1,10)-1; % řádkový vektor D=[x',y',yn']; % transponované vektory save data.txt D -ascii
Př05. a) >> x=linspace(0,10,100); >> y=x./(1+x.^2); >> D=[x',y'];
% řádkový vektor % transponované vektory
b)
>> >> >> >>
x=linspace(0,4*pi,500); % řádkový vektor xp=sqrt(x); % pomocný vektor y=exp(xp).*sin(1-x.^2.*cos(xp)).^2; % výpočet D=[x',y']; % transponované vektory
c)
>> >> >> >> >> >> >> >>
f=linspace(0,1e4,10000); s=j*2*pi*f; % komplexní čísla bez reálné části p=(-s.^2+1)./(s.^5-s.^3+s.^2+1); y1a=sqrt(real(p).^2+imag(p).^2); % výpočet y1b=abs(p); % hotová funkce y2a=atan2(imag(p),real(p)); % výpočet y2b=angle(p); % hotová funkce D=[f',y1b',y2b']; % transponované vektory
KŘP/IMSW Modelování ve výpočtových software
2‐17 (18) 20.7.11
František Dušek KŘP FEI Univerzita Pardubice
Pojmy k zapamatování Okruhy problémů: workspace, plnění proměnných a datové typy, manipu‐ lace s maticemi a maticové funkce, operace prvek po prvku, práce s řetězci, relační operátory, matematické funkce Použité nástroje:
Import Wizard
Příkazy a funkce: abs, angle, class, clear, det, disp, end, eig, eval, eye, find, get, input, inv, isprime, length, linspace, load, log, logspace, max, mean, min, ones, rand, randn, save, set, sqrt, size, sort, std, sum, var, who, whos, zeros
Otázky na procvičení 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Jak zjistíme, které proměnné v pracovním prostoru existují a jakého jsou datového typu? Které předdefinované proměnné (konstanty) MATLAB obsahuje? Je‐li proměnná x řádkový vektor, který(é) z příkazů M1=[x,x,x], M2=[x x,x], M3=[x x;x] a M4=[x;x;x] je špatně a proč? Jak vypadá příkaz pro výběr části vektoru x od pátého prvku do konce? Je vytvořen objekt o, jaký je rozdíl mezi příkazem clear o a delete(o)? K čemu slouží nástroj Import Wizard? V jakém případě je vhodné použít datový typ sparse matrix? Co označuje pojem function handle? Co označuje pojem operace prvek po prvku? Jakou zvláštnost (čím se liší) mají funkce v MATLABu (oproti funkcím pou‐ žívaným v programovacích jazycích)? Jak se zapíše relační operátor nerovná se?
Odkazy a další studijní prameny •
•
on‐line dokumentace k programu nebo www.mathworks.com/help/ – části „Arithmetic operators“ a „Relational operators“, „File input and output“, „Elementary matrices and matrix manipulation“, „Matrix functions ‐ numerical linear algebra“, „Specialized math functions“, „Character strings“ elektronická učebnice Learning MATLAB 7– www.mathworks.com/academia/student_version/learnmatlab_sp3.pdf (část „Matrices and Arrays“)
KŘP/IMSW Modelování ve výpočtových software
2‐18 (18) 20.7.11
František Dušek KŘP FEI Univerzita Pardubice
3 Soustavy lineárních rovnic, tvorba grafů Studijní cíl Třetí blok je věnován využití maticových operací při řešení soustav lineárních rovnic a dále tvorbě grafů (2D , 3D a speciálních). Též se zabývá možnostmi editace grafů a jejich exportem.
Doba nutná k nastudování
2 ‐ 3 hodiny
Průvodce studiem Předpokládá se, že čtenář je seznámen s prostředím MATLABu a jeho základ‐ ními příkazy, se základy maticové počtu a komplexními čísly. Dále se předpo‐ kládá, že čtenář zná principy a základní pojmy z objektového programování. Při studiu je vhodné mít spuštěný MATLAB a jednotlivé příkazy či funkce hned vyzkoušet a případně získat podrobnější informace využíváním nápovědy k programu. Na závěr jsou uvedeny řešené příklady na procvičení. V textu jsou použity následující typografické konvence: Calibri 11, Bold, Italic nové pojmy či informace k zapamatování Calibri 11 označení klávesy Courier New 10, Bold názvy nástrojů MATLABu Courier New 10, Bold upřesnění nápovědy (help téma) Courier New 10 názvy příkazů, funkcí a objektů Courier New 10 označení části příkazu, která se může vynechat Courier New 10, Italic názvy proměnných použitých v programu Courier New 9 příkazy příkazové řádky
3.1 Soustavy lineárních rovnic Jednou ze základních úloh lineární algebry je úloha nalézt řešení soustavy line‐ árních rovnic. Tuto úlohu můžeme zapsat buď jako samostatné rovnice
a11 x1 + a12 x2 + K + a1s xs = b1 a21 x1 + a22 x2 + K + a2 s xs = b2 M ar1 x1 + ar 2 x2 + K + ars xs = br
r
nebo
∑a x i =1
ij
j
= bj
pro j = 1K s
nebo v ekvivalentním maticovém tvaru
Ax = b
⎡ a11 ⎢a A = ⎢ 12 ⎢ M ⎢ ⎣ a r1
a12 K a1s ⎤ a22 K a2 s ⎥⎥ M O M ⎥ ⎥ ar 2 K ars ⎦
KŘP/IMSW Modelování ve výpočtových software
⎡ x1 ⎤ ⎡ b1 ⎤ ⎢x ⎥ ⎢b ⎥ 2⎥ ⎢ x= b = ⎢ 2⎥ ⎢M⎥ ⎢M⎥ ⎢ ⎥ ⎢ ⎥ ⎣ xs ⎦ ⎣bs ⎦ 3‐1 (24) 17.8.11
František Dušek KŘP FEI Univerzita Pardubice
V následujícím textu budeme používat pouze zápis v maticovém tvaru a bude‐ me se zabývat možnostmi MATLABu pro řešení soustavy lineárních rovnic.
Soustava lineárních rovnic má buď jedno, nekonečně mnoho nebo žádné řeše‐ ní. Aby řešení existovalo, musí vždy platit, že hodnost 1 matice (funkce rank) soustavy A musí být stejná jako hodnost tzv. rozšířené matice soustavy A|b tj. h(A)= h(A|b). O kterou variantu jde lze obecně určit podle hodnosti matice soustavy A. Pokud je hodnost h(A) rovna počtu neznámých, pak má soustava právě jedno řešení, pokud je hodnost h(A) menší pak má soustava nekonečně mnoho řešení a pokud je hodnost h(A) větší pak řešení neexistuje. Podle počtu rovnic r a neznámých s je možné ihned určit že: a) soustava má nekonečně mnoho řešení – nedourčená soustava r<s počet rovnic r je menší jako počet neznámých s tj. h(A) ≤ r < s b) soustava pravděpodobně nemá žádné řešení – přeurčená soustava r>s počet rovnic r je větší jako počet neznámých s tj. h(A)≤s ≠ h(A|b) ≤ s+1 V případě že počet rovnic r je stejný jako počet neznámých s (tj. r=s=n soustava n rovnic o n neznámých) pak nelze jednoduše odhadnout o kterou variantu jde h(A) = h(A|b) ≤ n.
3.1.1 Soustava n rovnic o n neznámých Základní řešení (s využitím inverzní matice) je možné zapsat jako maticovou rovnici pro nalezení všech neznámých ve formě sloupcového vektoru
x = A −1b
V případě, že soustava rovnic nemá právě jedno řešení, inverze čtvercové ma‐ tice soustavy A neexistuje (matice je singulární). >> A=[0,2,3; 1,0,3; 1,2,0]; >> b=[1;1;1]; >> rank(A) ans = 3 >> rank([A,b]) ans = 3 >> x=inv(A)*b >> x=A^(-1)*b >> x=A^-1*b x = 0.5000 0.2500 0.1667 >> A*x ans = 1 1 1
% čtvercová matice soustavy % sloupcový vektor pravé strany % hodnost matice soustavy % hodnost rozšířené matice soustavy % funkce inverze % mocnina matice % i tento zápis je správně
% kontrola řešení
1
Hodnost matice je vždy rovna nebo menší než je menší z rozměrů matice. Vyjadřuje maximální počet vzájemně nezávislých řádků či sloupců.
KŘP/IMSW Modelování ve výpočtových software
3‐2 (24) 17.8.11
František Dušek KŘP FEI Univerzita Pardubice
Pro přímý výpočet jednotlivých neznámých je také možné využít i Crammerovo pravidlo 2 obecně popsané následující rovnicí (podíl determinantů 3 matic).
⎛ ⎡ a11 K a1i−1 b1 ⎜ xi = det ⎜ ⎢⎢ M O M M ⎜ ⎢a K a bn ni −1 ⎝ ⎣ n1
a1i+1 K a1n ⎤ ⎞ ⎟ M O M ⎥⎥ ⎟ det( A) ani +1 K ann ⎥⎦ ⎟⎠
V případě, že řešení neexistuje je determinat matice soustavy roven nule. >> >> >> >> x1 >> >> x2 >> >> x3
A=[0,2,3;1,0,3;1,2,0]; b=[1;1;1]; A1=[b,A(:,2:3)]; x1=det(A1)/det(A) = 0.5000 A2=[A(:,1),b,A(:,3)]; x2=det(A2)/det(A) = 0.2500 A3=[A(:,1:2),b]; x3=det(A3)/det(A) = 0.1667
% čtvercová matice soustavy % sloupcový vektor pravé strany % doplněná matice soustavy i=1 % doplněná matice soustavy i=2 % doplněná matice soustavy i=3
Obě uvedená řešení využívají standardní maticové operace a funkce. V MATLABu existuje speciální operátor \ (levé maticové dělení, též funkce mldivide), který určí řešení soustavy lineárních rovnic stejně jako postup s in‐ verzí – tj. platí x=inv(A)*b=A\b. Výhoda použití tohoto postupu je v numericky efektivnějším způsobu výpočtu. Místo numericky náročného výpočtu inverzní matice a následného maticového násobení se úloha v případě, že je matice soustavy A trojúhelníková, řeší Gaussovou eliminací 4 .
⎡ a11 0 ⎢a ⎢ 21 a22 ⎢ a31 a32 ⎢ M ⎣ M
0 0 a33 M
L⎤ ⎡ x1 ⎤ ⎡ b1 ⎤ L⎥⎥ ⎢⎢ x2 ⎥⎥ ⎢⎢b2 ⎥⎥ = L⎥ ⎢ x3 ⎥ ⎢b3 ⎥ ⎥⎢ ⎥ ⎢ ⎥ O⎦ ⎣ M ⎦ ⎣ M ⎦
x1 = b1 a11 x2 = (b2 − a21 x1 ) a22 x3 = (b3 − a32 x2 − a31 x1 ) a33 M
V případě obecné matice soustavy se tato rozloží na součin dolní a horní trojú‐ helníkové matice ([L,U]=LU(M) LU dekompozice M=L*U) a řeší se dvojná‐ sobná Gaussova eliminace.
A.x = b
{A = L.U
x = A\b
y = U \ b x = L \ y}
Následující ukázka demonstruje efektivitu výpočtu pomocí operátoru levého maticového dělení oproti použití inverzní matice na výpočtu soustavy 2000 rovnic o 2000 neznámých. Je dosaženo úspory cca 33% původního času. >> A=rand(2000); >> rank(A) ans = 2000 >> b=rand(2000,1);
% matice soustavy 2000x2000 % kontrola existence řešení % vektor pravé strany 2000x1
2
Neznámá xi je podíl determinantu doplněné matice soustavy, ve které je i‐tý sloupec nahrazen vektorem pravé strany a determinantu původní matice soustavy.
3
Funkce det MATLABu
4
Postupný výpočet neznámých s využitím již spočítaných hodnot.
KŘP/IMSW Modelování ve výpočtových software
3‐3 (24) 17.8.11
František Dušek KŘP FEI Univerzita Pardubice
>> t1 t1 t1 >> t2 t2 t2
tic, = = = tic, = = =
x1=inv(A)*b; t1=toc 1.2655 1.2909 1.2203 x2=A\b; t2=toc 0.7157 0.8218 0.6723
% % % % % % % %
výpočet 1 s měřením času doba výpočtu 1.běh v sec doba výpočtu 2.běh v sec doba výpočtu 3.běh v sec výpočet 2 s měřením času doba výpočtu 1.běh v sec doba výpočtu 2.běh v sec doba výpočtu 3.běh v sec
Pokud není systém Ax=b standardním způsobem řešitelný, pak je oznámena chyba. I v tomto případě lze nalézt přibližné řešení pomocí funkce pinv (Moo‐ re‐Penroseova pseudoinverze). Je nalezeno takové řešení, které minimalizuje kvadratickou chybu řešení e=Ax‐b přesněji kvadratickou normu chyby e tj. min Ax − b 2 (funkce norm) např. x
>> A=magic(5); % matice soustavy původní 5x5 >> rank(A) % hodnost původní matice ans = 5 >> det(A) % hodnota determinantu ans = 5.0700e+006 >> A(:,2)=zeros(5,1); % upravená matice 5x5 >> rank(A) % hodnost upravené matice ans = 4 % je menší než rozměr matice >> det(A) % hodnota determinantu ans = 0 >> b=[1;2;3;4;5]; % vektor pravé strany % standardní řešení % přibližné řešení >> x1=A\b >> x2=pinv(A)*b Warning: Matrix is singular to working precision. x1 = NaN x2 = 0.0273 Inf -0.0000 0.1885 0.1845 0.0114 0.0169 0.0120 0 >> A*x1 >> A*x2 ans = NaN ans = 0.7837 NaN 2.1555 NaN 2.8445 NaN 4.1320 NaN 4.9457
3.1.2 Přeurčená soustava rovnic (žádné řešení) V případě, že máme více rovnic než je neznámých, neexistují hodnoty nezná‐ mých takové, aby všechny rovnice platily. Zdálo by se, že nemá význam se ta‐ kovými soustavami zabývat. Opak je pravdou, mnoho praktických úloh 5 vede na takovouto soustavu rovnic a hledá se „nejlépe vyhovující“ řešení. Nejčastěji se za „nejlépe vyhovující řešení“ volí takové řešení, které minimalizuje kvadra‐ tickou chybu řešení e=Ax‐b. Jde o stejnou formulaci jako v případě soustavy se stejným počtem rovnic a neznámých a singulární maticí soustavy. V MATLABu lze řešení přeurčené soustavy lineárních rovnic spočítat třemi způsoby >> A=[1 2;-2 1;1 -2];
% matice soustavy 3x2
5
Např. proložení naměřených bodů přímkou „metodu nejmenších čtverců“ je nejjednodušší úlohou tzv. lineární regrese – úlohy, která vede na přeurčený systém lineárních rovnic
KŘP/IMSW Modelování ve výpočtových software
3‐4 (24) 17.8.11
František Dušek KŘP FEI Univerzita Pardubice
>> b=[1;1;1]; % vektor pravé strana 3x1 >> x1=A\b >> x2=pinv(A)*b >> x3=inv(A'*A)*A'*b x1 = 0.0400 x2 = 0.0400 x3 = 0.0400 0.1200 0.1200 0.1200 % ověření řešení % chyba % kvadratická norma >> A*x1 >> A*x1-b >> norm(A*x1-b,2) ans = 0.2800 ans = -0.7200 ans = 1.6971 0.0400 -0.9600 -0.2000 -1.2000
3.1.3 Nedourčená soustava rovnic (nekonečně mnoho řešení) V případě, že máme méně rovnic než je neznámých lze nalézt nekonečně mno‐ ho kombinací neznámých, které těmto rovnicím vyhovují. Mezi těmito kombi‐ nacemi je možné vybrat ty, které mají určité speciální vlastnosti. Řešení pomocí levého maticového dělení (asi) vybírá kombinaci s maximálním počtem nulo‐ vých hodnot ve vektoru neznámých, řešení s pseudoinverzí hledá řešení s minimální kvadratickou normou vektoru neznámých stejně jako uvedený maticový výraz >> A=[-1 2 2 1;1 -2 2 1; 1 2 -2 1]; % matice soustavy 3x4 >> b=[1;1;1]; % vektor pravé strany 3x1 >> x1=A\b >> x2=pinv(A)*b >> x3=A'*inv(A*A')*b x1 = 1.0000 x2 = 0.4000 x3 = 0.4000 0.5000 0.2000 0.2000 0.5000 0.2000 0.2000 0 0.6000 0.6000 >> A*x1 >> A*x2 ans = 1.0000 ans = 1.0000 1.0000 1.0000 1.0000 1.0000 >> norm(x1) >> norm(x2) ans = 1.2247 ans = 0.7746
3.2 Základy práce s grafikou V případě, že výsledkem je velké množství čísel, je užitečné grafické zobrazení výsledků – vizualizace výsledků ve formě grafu. MATLAB poskytuje nejen velké množství funkcí pro tvorbu různých typů 2D i 3D grafů ale i prostředky pro ma‐ nipulaci s grafickými objekty, editaci hotových grafů a jejich export do různých formátů. Za zmínku stojí, že původně byl grafický výstup podporován pouze jako tisk na PostScriptové tiskárně a podpora pro grafický výstup na obrazovku byla doplněna až později. Práce s grafikou je plně objektová, ač vznikla v době, kde objektově orientované programování nebylo moc rozšířené. Systém práce s grafikou v MATLABu se nazývá Handle Graphics. Každý grafický objekt je ur‐ čen svém ukazatelem (reference, handler), který je představován reálným čís‐ lem. Grafické funkce vrací handler vytvářeného objektu. Přehled základních funkcí viz help graphics. Všechny grafické objekty jsou odvozeny od objektu Root a jsou umístěny v jednom či více objektech Figure (okno Windows). Vytvoření prázdného nového okna (včetně uložení handleru okna do proměnné hf, může být vyne‐ cháno) je příkazem hf=figure.
KŘP/IMSW Modelování ve výpočtových software
3‐5 (24) 17.8.11
František Dušek KŘP FEI Univerzita Pardubice
Může být vytvořeno více oken ale pouze jedno je „current figure“ – tj. aktivní okno nebo také okno, které má fokus (naposledy vytvořené nebo to, na které se naposledy kliklo myší – okno se zvýrazněným záhlavím). Handler aktivního okna lze získat příkazem hf=gcf. Aktivním se učiní okno příkazem figure(hf). Aktivní okno se zruší příkazem clf nebo close, případně okno s handlerem hf příkazem clf(hf) nebo 6 close(hf). Příkaz close all uzavře všechna okna.
Chceme‐li nalézt nějaký konkrétní objekt (respektive jeho handler) např. v exis‐ tujícím objektu (např. v okně) lze použít příkaz h=findobj(ObjectHandler, PropertyName, Value)
tento příkaz prohledá objekt určený handlerem ObjectHandler a všechny jeho potomky a vrátí handlery (vektor handlerů) všech objektů, jejichž vlast‐ nost PropertyName má hodnotu Value. Blíže viz help findobj. Základem grafů je objekt Axes (obdélníková oblast), do kterého příkazy pro kreslení grafů (např. příkaz plot) umisťují další grafy. Vytvoření nové‐ ho objektu Axes (včetně uložení handleru objektu Axes do proměnné ha, které může být vynecháno) v aktivním okně je příkazem ha=axes(PropertyName, Value)
Pokud nenastavíme vlastnost Position, pak oblast objektu Axes zabírá celou plochu okna 7 . Hodnota vlastnosti NextPlot ovlivňuje, zda následující požada‐ vek na přidání grafu do objektu existující graf přepíše (implicitní hodnota replace) nebo nový graf přidá (hodnota add). Nastavení těchto hodnot je možné explicitně pomocí obecného příkazu pro nastavení vlastností objektů set(handle, PropertyName, Value) nebo speciálním příkazem hold on/off. Tento příkaz mění vlastnost pouze aktivního objektu Axes v aktivním okně 8 tj. následující příkazy jsou ekvivalentní hold on = set(gca,'NextPlot','add') režim přidávání hold off = set(gca,'NextPlot','replace') režim přepisu
Při tvorbě grafů je několik možností kam a jak se graf vytvoří a) žádný objekt Figure (okno) neexistuje – funkce tvořící graf vytvoří objekt Figure (nové okno) včetně objektu Axes a vykreslí do něj graf b) existuje jeden či více objektů Figure – funkce tvořící graf vytvoří objekt Axes v aktivním okně a vykreslí graf c) existuje jeden či více objektů Figure každý obsahující objekt Axes – funkce tvořící graf vykreslí graf do aktivního objektu Axes; je‐li první para‐ metr funkce handler objektu Axes, pak funkce vytvoří graf v zadaném objek‐ tu (podle aktuální hodnoty vlastnosti NextPlot objektu Axes).
6
Příkaz (metoda) close může být přetížený (overloaded) podle typu objektu, na který ukazuje použitý handler
7
Je možné vložit více objektů Axes do jednoho okna
8
Handler objektu Axes v aktivním okně lze získat příkazem ha=gca.
KŘP/IMSW Modelování ve výpočtových software
3‐6 (24) 17.8.11
František Dušek KŘP FEI Univerzita Pardubice
V následujícím příkladě se vytvoří postupně tři okna. Ve druhém okně je vytvo‐ řen prázdný objekt Axes. Příkaz plot vytvoří v aktivním okně č. 3 (posledně vytvořené) graf funkce sinus. Poté je jako aktivní nastaveno okno č. 1 a v něm vytvořen graf funkce cosinus. Následuje vykreslení funkce sinus do objektu Axes v okně č. 2, změna vlastnosti NextPlot tohoto objektu a přidání grafu funkce cosinus. >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
x=0:0.1:2*pi; ys=sin(x); yc=cos(x); hf1=figure; % okno č.1 hf1 = 1 hf2=figure; % okno č.2 hf2 = 2 ha2=axes; % axes v akt.okně č.2 ha2 = 346.0079 hf3=figure; % okno č.3 hf3 = 3 plot(x,ys) % přepiš obsah aktuálního okna č.3 figure(hf1) % nastav jako aktuální okno č.1 plot(x,yc) % přepiš obsah aktuálního okna č.1 plot(ha2,x,ys) % přepiš obsah okna č.2 set(ha2,'NextPlot','add') % režim přidávání axes č.2 plot(ha2,x,yc) % přidej do okna č.2
3.2.1 2D grafy (dvourozměrné grafy) Nejčastěji používanými jsou 2D grafy tj. grafy v rovině x‐y. Přehled příkazů vztahující se k této problematice viz help graph2d. Základním a nejčastěji používaným příkazem pro tvorbu 2D grafu je příkaz plot s obecnou syntaxí hl=plot(ha,x,y,linespec, …)
kde první parametr ha (může se vynechat) je handler objektu Axes, do které‐ ho se bude kreslit graf, x, y jsou stejně orientované a stejně dlouhé vektory obsahující x‐ové a y‐ové souřadnice bodů, které se mají vykreslit, linespec je maximálně tříznakový řetězec. Tento řetězec (může se vynechat) obsahuje jeden až tři znaky – znak určující barvu čáry, znak určující typ spojovací čáry mezi body a znak určující značku pro vykreslení bodu (libovolný znak se může vynechat, na pořadí nezáleží). V případě, že chceme jedním příkazem vykreslit více průběhů do jednoho grafu, je možné trojice (či dvojice) parametrů opako‐ vat. Návratová hodnota (může se vynechat) je handler na grafický objekt typu Line nebo vektor handlerů v případě vykreslení více průběhů. Blíže viz help plot. Kromě tohoto typu 2D grafu je možné použít příkazy pro vykreslení gra‐ fů s logaritmickým měřítkem na ose x (semilogx), ose y (semilogy) či na obou (loglog). Další možností je použít příkaz hl=polar(ha,theta,rho,linespec)
pro kreslení v polárních souřadnicích (theta je vektor úhlů radiánech a rho vektor poloměrů jednotlivých bodů). Návratová hodnota (může se vynechat) je handler na grafický objekt typu Line. Do jednoho objektu Figure (okna) je možné vložit více objektů Axes s vyme‐ zením obdélníkové oblasti uvnitř okna pro každý objekt. Toto vložení je možné provést dvěma způsoby. Jednoduší způsob využívající rozdělení aktivního okna na matici obdélníkových oblastí o r (≤9) řádcích a s (≤9) sloupcích je příkazem KŘP/IMSW Modelování ve výpočtových software
3‐7 (24) 17.8.11
František Dušek KŘP FEI Univerzita Pardubice
ha=subplot(r,s,n) nebo
ha=subplot(rsn)
kde n je pořadové číslo oblasti počítáno po řádcích. Příkaz vrací handler vytvo‐ řeného objektu Axes. Druhý způsob s explicitním určením polohy a velikosti objektu Axes uvnitř aktivního okna je příkazem ha=axes('Position',[xL,yB,xW,yH])
kde hodnota parametru je vektor 4 hodnot (hranaté závorky jsou součástí de‐ finice vektoru), xL, yB jsou souřadnice levého dolního rohu obdélníku, do kterého se bude graf kreslit a xW, yH je jeho šířka a výška. Všechna čísla jsou v rozmezí 0‐1 a vyjadřují relativní vzdálenost v rámci velikosti okna. Grafům 9 v objektu Axes s handlerem ha (pokud je vynechán použije se aktivní objekt Axes) lze změnit implicitní automatické měřítko na vlastní hodnoty příkazem
axis(ha,[xmin,xmax,ymin,ymax])
Další možnosti použití příkazu axis viz help axis. Vytvořený graf lze doplnit o mřížku – příkaz grid, nadpis – příkaz title(text), popis osy x– xlabel(text), popis osy y – ylabel(text), legendu – legend(text1, text2, …) atd. Blíže viz help graph2d. Většina výše uvedených příkazů je použita v následujícím příkladu, jehož řešení je uvedeno ve dvou variantách. Každá varianta vytvoří stejné okno. V každém okně tři objekty Axes obsahující různé grafy. V první variantě jsou použity pře‐ devším jednodušší „high level“ funkce, v druhé variantě jsou více využity expli‐ citní nastavení vlastností objektů >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
% ------------- první varianta ---------------------------% data spirála polární souřadnice th=0:0.01:4*pi; % úhel ro=th; % poloměr % data spirála kartézské souřadnice xs=th.*cos(th); ys=th.*sin(th); % x, y subplot(2,2,1); % první Axes % první graf - spirála kartézské plot(xs,ys,'b','LineWidth',2) title('Spirála x,y',... 'FontSize',14) % nadpis grid % mřížka legend('kartézské s.',... 'Location','SouthWest') xlabel('osa x'), ylabel('osa y') subplot(2,2,2); % druhý Axes % první graf - spirála polární hp=polar(th,ro,'r'); set(hp,'LineWidth',2) title('Spirála \theta, \rho',... 'FontSize',14); grid % mřížka subplot(2,1,2); % třetí Axes hold on % režim přidávání % první graf - spirála kartézské plot(xs,ys,'b','LineWidth',2) % druhý graf - vývoj souřadnic plot(th,xs,'r-.',th,ys,'g--',...
9
Všechny grafy v objektu Axes sdílejí stejné souřadnice, tj. mají stejné měřítko
KŘP/IMSW Modelování ve výpočtových software
3‐8 (24) 17.8.11
František Dušek KŘP FEI Univerzita Pardubice
'LineWidth',2) >> title('Tři průběhy',... 'FontSize',14) % nadpis >> grid % mřížka >> legend('xs,ys','\theta,xs','\theta,ys') Spirála x,y
10
Spirála θ, ρ 90 20
120
osa y
5
60
10
150
30
0 180
0
-5 210
-10
240
kartézské s. -15 -10
-5
0
330
5
10
270
300
15
osa x
Tři průběhy
15
xs,ys
10
θ,xs θ,ys
5 0 -5 -10 -15 -10
>> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
-5
0
5
10
15
% ------------- druhá varianta --------------------% data spirála polární souřadnice th=0:0.01:4*pi; % úhel ro=th; % poloměr % data spirála kartézské souřadnice xs=th.*cos(th); ys=th.*sin(th); % x,y hf=figure; % další okno ha(1)=axes('Position',[0.1,0.55,0.35,0.35]); %subplot(2,2,1); % první Axes ha(2)=axes('Position',[0.55,0.55,0.35,0.35]); %subplot(2,2,2); % druhý Axes ha(3)=axes('Position',[0.1,0.1,0.8,0.35]); %subplot(2,1,2); % třetí Axes % *** grafy % první Axes - spirála kartézské hl(1)=plot(ha(1),xs,ys,'b'); % druhý Axes - spirála polární hl(2)=polar(ha(2),th,ro,'r'); % třetí Axes první graf - spirála kartézské hl(3)=plot(ha(3),xs,ys,'b'); set(ha(3),'NextPlot','add') % hold on % režim přidávání % třetí Axes druhý graf - vývoj souřadnic hl(4:5)=plot(ha(3),th,xs,'r-.',th,ys,'g--'); % hromadné nastavení mřížky set(ha,'XGrid','on'), set(ha,'YGrid','on') % hromadné nastavení tlouštky čar set(hl,'LineWidth',2) % *** nadpisy ht(1)=title(ha(1),'Spirála x,y'); ht(2)=title(ha(2),'Spirála \theta, \rho'); ht(3)=title(ha(3),'Tři průběhy'); % hromadné nastavení velikosti textu
KŘP/IMSW Modelování ve výpočtových software
3‐9 (24) 17.8.11
František Dušek KŘP FEI Univerzita Pardubice
>> >> >> >> >> >> >> >>
set(ht,'FontSize',14) % *** legendy le(1)=legend(ha(1),'kartézské s.'); set(le(1),'Location','SouthWest') le(2)=legend(ha(3),'xs,ys','\theta,xs','\theta,ys'); % *** popisy os hx(1)=xlabel(ha(1),'osa x'); hy(1)=ylabel(ha(1),'osa y');
3.2.2 3D grafy (třírozměrné grafy) Jako 3D grafy se označují grafy zobrazující nějaký útvar v prostoru. Přehled příkazů MATLABu pro práci s 3d grafy viz help graph3d. Podle formy dat potřebných pro zobrazení útvaru jsou v podstatě dva druhy útvarů. První – prostorová křivka („provázek v prostoru“) – je reprezentován uspořádanými trojicemi bodů {x,y,z} (v MATLABu trojice vektorů x, y, z) a příkaz pro vy‐ kreslení h=plot3(x,y,z)
Stejně jako v případě příkazu plot, tak se graf vytvoří v aktuálním objektu Axes. Pokud objekt Figure s objektem Axes neexistuje tak se vytvoří. Příklad použití je uveden na konci kapitoly. Složitější 10 je situace v případě, že útvar, který chceme vykreslit, je plocha v prostoru. V dalším se budeme zabývat pouze jednodušší variantou, kdy pro každý bod roviny x‐y existuje pouze jeden bod plochy. V tomto případě může být vykreslovaná plocha pro potřeby vykreslení popsána maticí Z výšek plochy nad rovinou x‐y v obdélníkové síti bodů a polohou těchto bodů (vektory x, y). Situace je znázorněna na obrázku. Plochu pak můžeme vykreslit jako drátový model (podobně jako na obrázku) příkazem h=mesh(x,y,Z)
x
nebo s vyplněnými plochami příkazem h=surf(x,y,Z)
Na rozdíl od 2D grafů je poněkud složitější příprava matice Z pro všechny kombinace hodnot z vektorů x a y. Máme‐li k dispozici funkční předpis z=f(x, y), můžeme využít funkci MATLABu
z x1
x2
y1
x3
y2
[X,Y]=meshgrid(x,y)
x4
y3
x5
y4
x6
y5
x7
y6
ina rov -y x
která nám z původních vektorů x, y vytvoří matice X, Y takové, že po dosazení (v MATLABu) do původní funkce vytvoří matici Z tj. Z=f(X,Y). Pozor na to, že ač se do funkce dosadí matice nejde o maticové operace tj. je potřeba použít operace prvek po prvku.
y
10
Složitější z pohledu přípravy dat popisujících danou plochu.
KŘP/IMSW Modelování ve výpočtových software
3‐10 (24) 17.8.11
František Dušek KŘP FEI Univerzita Pardubice
V následujícím příkladě ukážeme vykreslení prostorové křivky popsané parametricky zadanou funkcí
y (t ) = t sin(2t ) z (t ) = t 2 pro 0 ≤ t ≤ 4π
x(t ) = t cos(t )
a plochy popsané rovnicí
z ( x, y ) = cos( xy) 2π 2 − x 2 − y 2 >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
pro − π ≤ x ≤ π a − π2 ≤ y ≤
π 2
t=0:0.1:4*pi; x=t.*cos(t); y=t.*sin(2*t); z=t.^2; subplot(2,1,1) plot3(x,y,z,'LineWidth',2) title('plot3','FontSize',14) grid x=-pi:0.3:pi; y=-pi/2:0.3:pi/2; [X,Y]=meshgrid(x,y); Z=cos(X.*Y).*(X.^2+Y.^2); subplot(2,2,3) mesh(x,y,Z) % drátový model title('mesh','FontSize',14) xlabel('osa x'), ylabel('osa y'), zlabel('osa z') subplot(2,2,4) surf(x,y,Z) % vyplněné plochy title('surf','FontSize',14) xlabel('osa x'), ylabel('osa y'), zlabel('osa z')
plot3 200
100
0 15
10
5
0
-5
-10
-15
-5
-10
10
10
0
0
-10 -20 2
osa y
5
-10 -20 2
0 -2
-5
15
surf
osa z
osa z
mesh
0
10
5
0
osa y
osa x
5
0
0 -2
-5
osa x
KŘP/IMSW Modelování ve výpočtových software
3‐11 (24) 17.8.11
František Dušek KŘP FEI Univerzita Pardubice
3.2.3 Speciální grafy Kromě základních 2D grafů (plot, polar) a 3D grafů (plot3, mesh, surf) MATLAB obsahuje řadu dalších, specializovaných grafů viz help specgraph. Některé z nich jsou dále uvedeny včetně příkladu použití. h=stairs(x,y) schodovitý průběh křivky
1
Příklad Vykreslete průběh funkce y=sin(x) na intervalu 0 ≤ x ≤ 2π v 120 bodech a pomocí schodové funkce v 12 bodech
0.6 0.4 0.2
Řešení >> x=linspace(0,2*pi,120); >> >> >> >> >> >> >> >>
plot stairs
0.8
x12=linspace(0,2*pi,12); h=plot(x,sin(x)); set(h,'LineWidth',2) hold on h=stairs(x12,sin(x12),'ro-'); set(h,'LineWidth',2) grid legend('plot','stairs')
0
-0.2
-0.4
-0.6
-0.8
-1
0
1
2
3
4
5
6
7
1
h=area(x,y) graf s vyplněnou plochou pod
křivkou
0.6
Příklad Vykreslete průběh funkce y=sin(x) na intervalu 0≤x≤2π s pomocí funkce area v 12 bodech
0.4
0.2
0
-0.2
Řešení >> x12=linspace(0,2*pi,12); >> >> >> >> >> >>
area 0.8
h=area(x12,sin(x12)); set(h,'FaceColor',[.6,.9,1.0]) grid set(h,'LineWidth',2) h=legend('area'); set(h,'FontSize',14)
-0.4 -0.6
-0.8 -1
0
1
2
3
4
5
6
h=bar(x,y) graf s vertikálními sloupci h=barh(x,y) graf s horizontálními sloupci
Příklad Vykreslete průběh funkce y=sin(x) na intervalu 0≤x≤2π s pomocí funkce area v 24 bodech
1 bar 0.5
0
Řešení >> x24=linspace(0,2*pi,24); >> >> >> >> >> >> >> >> >> >>
subplot(2,1,1) h=bar(x24,sin(x24)); set(h,'FaceColor',[.1,.2,.3]) legend('bar') grid subplot(2,1,2) h=barh(x24,sin(x24)); set(h,'FaceColor',[.3,.2,.1]) legend('barh') grid
KŘP/IMSW Modelování ve výpočtových software
-0.5
-1 -1
0
1
2
3
4
5
6
7
8 barh 6 4 2 0 -2 -1
3‐12 (24) 17.8.11
-0.8
-0.6
-0.4
-0.2
0
0.2
0.4
0.6
0.8
1
František Dušek KŘP FEI Univerzita Pardubice
h=pie(x,v,p)
koláčový graf 2D
h=pie3(x,v,p)
koláčový graf 3D
a1
a2
a7 a3
A4
Příklad Vykreslete koláčový graf 2D a 3D podle zadaných dat s barevnou paletou „summer“
a6 a5
Řešení >> x=[1,2,3,4,5,6,7]; >> v=[0,0,0,1,0,0,0]; >> p={'a1','a2','a3','A4',... 'a5','a6','a7'}; >> subplot(2,1,1) >> h=pie(x,v,p); >> subplot(2,1,2) >> h=pie3(x,v,p); >> colormap summer
a7 a1 a2 a6
a3
A4
a5
h=errorbar(x,y,e,ls)
graf se sloupci velikosti ±ei u každého bodu {xi, yi}, volitelný řetězec ls určuje barvu, značku a typ čary stejně jako u příkazu plot 5.5
5
Příklad Vykreslete graf podle zadaných dat s chybovými úsečkami, černá čára síla čary 3, označení bodů kolečkem velikosti 12 bodů
4.5
4
3.5
Řešení >> y=[5,4,3,2,3,4,5]; >> >> >> >> >> >>
x=[1,2,3,4,5,6,7]; e=1./y; h=errorbar(x,y,e,'ko-'); grid set(h,'MarkerSize',12) set(h,'LineWidth',3)
3
2.5
2
1.5
0
1
2
3
4
5
6
7
8
N=hist(x,M)
histogram, graf četnosti výskytu čísel ve vektoru x v rozsazích (xmax‐xmin)/M, funkce vrací počet čísel v každém rozsahu. Je‐li vý‐ stupní parametr vynechán vykreslí se histogram
Příklad Nakreslete histogram 10000 čísel s rovnoměrným a normálním rozdě‐ lením N(0,1) ve 12 oblastech Řešení >> x1=rand(1,10000); >> >> >> N1
>> >> >> N2
>>
x2=randn(1,10000); subplot(2,1,1); N1=hist(x1,12) = 835 840 829 826 807 821 864 894 805 839 835 805 hist(x1,12) subplot(2,1,2); N2=hist(x2,12) = 3 32 222 765 1768 2523 2440 1522 560 140 23 2 hist(x2,12)
1000 800 600 400 200 0
0
0.1
0 -4
-3
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
4
5
3000 2500 2000 1500 1000 500 -2
-1
0
1
2
3
KŘP/IMSW Modelování ve výpočtových software
3‐13 (24) 17.8.11
František Dušek KŘP FEI Univerzita Pardubice
[C,h]=contour(x,y,Z)
řezy plochy v prostoru rovnoběžné s rovinou x‐
y, vykresleny jsou obrysy [C,h]=contourf(x,y,Z)
řezy plochy v prostoru rovnoběžné s rovinou x‐y, vykresleny jsou plochy
z ( x, z ) = xe
Vykreslete graf funkce
0 -0.2
-0.5 3
2
− x2 − y 2
a její řezy jako obrysy a jako plochy
1
0
-1
-2
-1
-2
2
1
0
-0.4
3 2
Řešení >> x=-2:0.2:2;
1
-0 .1
0
-0.2 -0.3 -0 .4
-0 .3
-0.2
-0 .1
-1 -2 -2
-1.5
-1
0.4
-0.5
0.1
0.2 0.3
0.3
0.2
0
y=-2:0.2:3; [X,Y]=meshgrid(x,y); Z=X.*exp(-X.^2-Y.^2); subplot(3,1,1) mesh(x,y,Z) colorbar subplot(3,1,2) [C,h]=contour(x,y,Z); set(h,'ShowText','on') grid subplot(3,1,3) [C,h]=contourf(x,y,Z); colorbar
-0 .1
>> >> >> >> >> >> >> >> >> >> >> >> >>
0.2
0
0.1
Příklad
0.4 0.5
0
0.5
0.1
1
1.5
2
3
0.4
2
0.2
1
0
0
-0.2
-1 -2 -2
-1.5
-1
-0.5
0
0.5
1
1.5
2
-0.4
h=fill(x,y,c,…)
jeden nebo více vyplněných 2D polygonů, parametr c určuje barvu výplně
h=fill3(x,y,z,c,…)
jeden nebo více vyplněných 3D polygonů, pa‐
rametr c určuje barvu výplně h=patch(x,y,z,c,…)
přidá jeden nebo více vyplněných 2D nebo 3D polygonů do aktivního objektu Axes, parametr c určuje barvu výplně
Příklad Nakreslete červený a žlutý trojúhelník v rovině (jeden graf) a v prostoru (druhý graf). Potom přidejte třetí zelený trojúhelník do obou grafů
4
3
2
1
Řešení >> x1=[1,2,1]; y1=[1,2,3]; >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
z1=[1,2,0]; x2=[3,4,4]; y2=[2,1,3]; z2=[2,0,1]; x3=[1.5,2.5,3.5]; y3=[4.5,2.5,4.5]; z3=[1.5,-1.5,1.5]; subplot(2,1,1) fill(x1,y1,'r',x2,y2,'y') grid axis([0,5,0,4]) subplot(2,1,2) fill3(x1,y1,z1,'r',x2,y2,z2,'y') grid axis([0,5,0,4,-2,2]) subplot(2,1,1), patch(x3,y3,'g') subplot(2,1,2), patch(x3,y3,z3,'g')
KŘP/IMSW Modelování ve výpočtových software
0
0
0.5
1
1.5
2
2.5
3
3.5
4
4.5
5
2
0
-2 4
3‐14 (24) 17.8.11
3
2
1
0
0
1
2
3
4
5
František Dušek KŘP FEI Univerzita Pardubice
3.3 Editace a export grafů Kromě možnosti měnit vlastnosti grafických objektů obecným příkazem set(hObject, PropertyName, PropertyValue). MATLAB poskytuje nástroje k editaci vytvořeného grafu přímo v grafu. Nejprve ale připomeňme základní editaci prostřednictvím příkazu set. Při jeho použití je potřeba znát název vlastnosti (PropertyName) a možné hodnoty (PropertyValue). Název vlastnosti je možné zjistit příkazem a možné hodnoty odhadnout nebo zjistit v nápovědě. Následující příklad ukazuje, jak zjistit vlastnosti objektů Line a rodičovského objektu Axes grafu vytvořeného příkazem plot. >> >> >> hl
x=0:0.1:2*pi; ys=sin(x); yc=cos(x); hl=plot(x,ys,x,yc) % objekty: 1xFigure, 1xAxes 2xLine = 174.0016 % handlery objektů Line 175.0011 >> ha=get(hl(1),'Parent') % handler rodičovského objetu Axes ha = 173.0011 >> ha=get(hl(2),'Parent') % obou objektů Line je stejný ha = 173.0011 % vlastnosti objektu Axes >> get(ha) PlotBoxAspectRatioMode = auto ActivePositionProperty = Projection = orthographic outerposition Position = ALim = [0 1] [0.13 0.11 0.775 0.815] ALimMode = auto TickLength = [0.01 0.025] AmbientLightColor = [1 1 1] TickDir = in Box = on TickDirMode = auto CameraPosition = TightInset = [3.5 0 17.3205] [0.0464286 0.0404762 CameraPositionMode = auto 0.00892857 0.0190476] CameraTarget = [3.5 0 0] Title = [176.001] CameraTargetMode = auto Units = normalized CameraUpVector = [0 1 0] View = [0 90] CameraUpVectorMode = auto XColor = [0 0 0] CameraViewAngle = [6.60861] XDir = normal CameraViewAngleMode = auto XGrid = off CLim = [0 1] XLabel = [177.001] CLimMode = auto XAxisLocation = bottom Color = [1 1 1] XLim = [0 7] CurrentPoint = XLimMode = auto [ (2 by 3) double array] XMinorGrid = off ColorOrder = XMinorTick = off [ (7 by 3) double array] XScale = linear DataAspectRatio = [3.5 1 1] XTick = DataAspectRatioMode = auto [ (1 by 8) double array] DrawMode = normal XTickLabel = 0 1 2 3 4 5 6 7 FontAngle = normal XTickLabelMode = auto FontName = Helvetica XTickMode = auto FontSize = [10] YColor = [0 0 0] FontUnits = points YDir = normal FontWeight = normal YGrid = off GridLineStyle = : YLabel = [178.001] Layer = bottom YAxisLocation = left LineStyleOrder = YLim = [-1 1] LineWidth = [0.5] YLimMode = auto MinorGridLineStyle = : YMinorGrid = off NextPlot = replace YMinorTick = off OuterPosition = [0 0 1 1] YScale = linear PlotBoxAspectRatio = [1 1 1]
KŘP/IMSW Modelování ve výpočtových software
3‐15 (24) 17.8.11
František Dušek KŘP FEI Univerzita Pardubice
YTick = [ (1 by 11) double array] YTickLabel = [ (11 by 4) char array] YTickLabelMode = auto YTickMode = auto ZColor = [0 0 0] ZDir = normal ZGrid = off ZLabel = [179.001] ZLim = [-1 1] ZLimMode = auto ZMinorGrid = off ZMinorTick = off ZScale = linear ZTick = [-1 0 1] ZTickLabel = ZTickLabelMode = auto ZTickMode = auto
BeingDeleted = off ButtonDownFcn = Children = [ (2 by 1) double array] Clipping = on CreateFcn = DeleteFcn = BusyAction = queue HandleVisibility = on HitTest = on Interruptible = on Parent = [1] Selected = off SelectionHighlight = on Tag = Type = axes UIContextMenu = [] UserData = [] Visible = on
% vlastnosti objektů Line >> get(hl(1)) DisplayName: '' Annotation: [1x1 hg.Annotation] Color: [0 0 1] LineStyle: '-' LineWidth: 0.5000 Marker: 'none' MarkerSize: 6 MarkerEdgeColor: 'auto' MarkerFaceColor: 'none' XData: [1x63 double] YData: [1x63 double] ZData: [1x0 double]
>> get(hl(2)) DisplayName: '' Annotation: [1x1 hg.Annotation] Color: [0 0.5000 0] LineStyle: '-' LineWidth: 0.5000 Marker: 'none' MarkerSize: 6 MarkerEdgeColor: 'auto' MarkerFaceColor: 'none' XData: [1x63 double] YData: [1x63 double] ZData: [1x0 double]
BeingDeleted: 'off' ButtonDownFcn: [] Children: [0x1 double] Clipping: 'on' CreateFcn: [] DeleteFcn: [] BusyAction: 'queue' HandleVisibility: 'on' HitTest: 'on' Interruptible: 'on' Selected: 'off' SelectionHighlight: 'on' Tag: '' Type: 'line' UIContextMenu: [] UserData: [] Visible: 'on' Parent: 173.0011 XDataMode: 'manual' XDataSource: '' YDataSource: '' ZDataSource: ''
BeingDeleted: 'off' ButtonDownFcn: [] Children: [0x1 double] Clipping: 'on' CreateFcn: [] DeleteFcn: [] BusyAction: 'queue' HandleVisibility: 'on' HitTest: 'on' Interruptible: 'on' Selected: 'off' SelectionHighlight: 'on' Tag: '' Type: 'line' UIContextMenu: [] UserData: [] Visible: 'on' Parent: 173.0011 XDataMode: 'manual' XDataSource: '' YDataSource: '' ZDataSource: ''
Editace přímo v grafu je možná dvojím způsobem. První způsob, s omezenými možnostmi změn vlastností, je standardní způsob používaný v OS Windows. Po kliknutí na příslušný objekt v grafu pravým tlačítkem myši, výběru vlastnosti KŘP/IMSW Modelování ve výpočtových software
3‐16 (24) 17.8.11
František Dušek KŘP FEI Univerzita Pardubice
v menu se provede změna 11 její hodnoty. Tento postup je možný až po povole‐ ní režimu editace tlačítkem 1.se šipkou Edit Plot (též Tools->Edit Plot) na nástrojové liště tlačítek (Toolbar) – viz Obrázek 3‐1.
Druhý způsob spočívá v použití nástrojů Property Editor a případně Inspector. První nástroj se spustí volbou položky menu View->Property Editor. Po jeho spuštění se objeví další okno zobrazující (a umožňující editaci) některých vlastností aktuálně vybraného objektu. Všechny vlastnosti vybrané‐ ho objektu jsou pak přístupné v nástroji Inspector, který spustíme pomocí tlačítka 2 More Properties … v pravém horním rohu okna Property Editor. Dále je možné využít nástrojů View->Plot Browser a View>Figure Palette. Záhlaví okna (objekt Figure) grafu obsahuje další funkce a nástroje. Tlačítko se šipkou do kruhu.3 Rotate 3D (též Tools->Rotate 3D)) povoluje režim otáčení 12 grafu v okně pomocí myši (i v případě 2D grafů), tlačítko 4 s ručkou Pan (též Tools->Pan) dovoluje posouvat graf atd. Položka menu Insert obsa‐ huje možnosti vložit či odebrat další objekty grafu (včetně pomocí myši vytvá‐ řených objektů 13 Line, Arrow atd.), položka Tools obsahuje (krom již zmíně‐ ných nástrojů též přístupných z tlačítkové lišty) další nástroje pro editaci grafu jako je zvětšování/zmenšování grafu, rozmisťování a zarovnávání objektů atd.
4
3
Plot Browser
Figure Palette
Object Browser
1
2 Property Editor
Obrázek 3‐1 Editace grafu
11
Výhodou tohoto postupu je, že je možné vybrat pouze přípustné hodnoty dané vlastnosti.
12
Mění interaktivně vlastnosti Camera… objektu Axes.
13
Objekty lze vytvořit také příkazem annotation(ObjectType), kde parametr ObjectType může nabýt hodnot 'rectangle', 'ellipse', 'textbox', 'line', 'arrow', 'doublearrow', nebo'‐ textarrow'.
KŘP/IMSW Modelování ve výpočtových software
3‐17 (24) 17.8.11
František Dušek KŘP FEI Univerzita Pardubice
Položka menu Edit->Copy Figure kopíruje graf do schránky (ClipBoard) a umožňuje tak graf vložit do dalších programů. Vlastnosti kopírování lze nasta‐ vit v položce menu Edit->Copy Options… . Hotový graf lze exportovat do různých formátů v položce menu File->Save As… a následným výběrem požadovaného formátu. Vlastnosti exportu lze nastavit v položce menu File>Export SetUp… . Je možné uložit obrázek v následujících grafických formá‐ tech:
MATLAB Figure
.fig nativní vektorový formát, umožňuje opět obrá‐ zek načíst a dále upravovat Adobe Illustrator file .ai vektorový formát Adobe Illustrator 88 (fonty nejsou vloženy, pouze vektorové obrázky, 72 dpi) Bitmap File .bmp rastrový formát Windows Bitmap, 24‐bit barvy, formát zavedený s Windows 3.0 EPS file .eps vektorový formát Encapsulated PostScript (EPS) jediný podporuje barevný prostor CMYK, nej‐ vhodnější pro DTP Enhanced Metafile .emf vektorový formát Enhanced Windows Metafile, nejvhodnější pro import do Microsoft aplikací (nativní formát Windows) JPEG image .jpg komprimovaný (ztrátově) rastrový formát Joint Photographic Experts Group, 24‐bit barvy, implicitní komprese 75 (100 je minimální komprese), pro jinou kompresy (např. 95) je nutné použít řádkový příkaz print –djpeg95 soubor.jpg Paintbrush 24‐bit file .pcx komprimovaný rastrový formát programu Pa‐ intbrush, poměrně rozšířen Portable Bitmap File .pmb nekomprimovaný rastrový formát, 2‐bit barvy (černobílý),UNIX Portable Dokument Format .pdf formát firmy Adobe používaný pro elektronické publikace Portable Greymap file .pgm nekomprimovaný rastrový formát, 8‐bit barvy (stupně šedi),UNIX Portable Network Graphics file .png komprimovaný (bezztrátově) rastrový formát navržený pro webovou grafiku, 24‐bit barvy Portable Pixmap File .pxm nekomprimovaný rastrový formát, 24‐bit barvy (TrueColor),UNIX Portable inKmap file .pkm rastrový formát, UNIX TIFF image .tif rastrový formát Tagged Image File Format, 24‐ bit, je podporován většinou grafických programů TIFF no compression image .tif bez komprese Kromě uvedené možnosti exportu je možné použít i příkaz print, který jednak umožňuje u některých formátů nastavit parametry a jednak dovoluje další ex‐ portovat do dalších formátů např. print –dhpgl soubor.hpg vektorový formát HPGL (Hewlett Packard Gra‐
phics Language), jazyk pro ovládání ploterů (např. HP7475A) print –dhdf soubor.hdf rastrový formát Hierarchical Data Format
KŘP/IMSW Modelování ve výpočtových software
3‐18 (24) 17.8.11
František Dušek KŘP FEI Univerzita Pardubice
3.4 Příklady na procvičení V kapitole 3.4.1 jsou zadání a v kapitole 3.4.2 řešení jednoduchých příkladů využívající znalosti z prvních tří bloků. Předpokládá se, že při řešení příkladů má čtenář k dispozici MATLAB a aktivně využívá nápovědu k programu.
3.4.1 Zadání příkladů Př01. Řešení soustavy lineárních rovnic. Je dána následující soustava lineárních rovnic 3x1‐2x2+3x4=1‐x1 2x2‐3x3+2x4=2‐x2 ‐x1+3x2+2x3=3‐x3 4x1 ‐x3 +x4=4‐x4 nalezněte řešení a) použitím inverzní matice b) pomocí levého maticového dělení c) pomocí Crammerova pravidla d) využitím LU dekompozice a následnou manuální dvojnásobnou Gaussovou eliminací Př02. Vytvoření grafu aproximace zadaných bodů. Jsou dány body bi={xi,yi},.i=1,..,5 b={[‐2,7], [‐1,7], [0.5,1], [1,3], [3,‐1]} a) určete hodnoty parametrů k, q přímky popsané rovnicí y=k*x+q takové, kte‐ rá dané body prokládá nejlépe ve smyslu minima sumy kvadrátů odchylek b) do grafu vyneste původní body b jako červená kolečka velikosti 12 bodů a 100 bodů odpovídajících nalezené přímce (čárkovaná modrá čára), tloušťka čar 3 body c) na ose x nastavte rozsah od ‐5 do +5 a na ose y od ‐5 do 10 a graf opatřete mřížkou, nadpisem (14 bodů Bold), legendou a popisem os (12 bodů) Př03 Tvorba různých druhů grafů, využití handlerů objektů. Vytvořte řádkový vektor vr naplněný 1000 náhodnými čísly rovnoměrně rozlo‐ ženými v rozsahu ‐1 až 1 a řádkový vektor vn naplněný 1000 náhodnými čísly normální rozložení N(0,1) a vytvořte vektor v tvořený součinem odpovídají‐ cích hodnot ve vektorech vn, vr. a) vytvořte jedno okno obsahující 6 grafů uspořádaných do dvou řad a třech sloupců, handlery jednotlivých objektů uložte do matice H odpovídající struk‐ tury b) s využitím matice handlerů H vytvořte grafy hodnot ve vektorech vr, vn a v (hodnoty ve vektorech jsou y‐nové souřadnice, za x‐ové souřadnice považu‐ jeme index hodnoty ve vektoru) umístěné v horní řadě grafů. Hodnoty jsou znázorněny jako izolované body kolečko. Každý graf označte nadpisem „Rov‐ noměrné“, „Gaussovo“ a „Součin“. Nastavte měřítko v ose x od 0 do 1000, v ose y od ‐4 do +4. c) s využitím matice handlerů H vytvořte histogramy (12 sloupců) hodnot ve vektorech vr, vn a v umístěné v dolní řadě grafů. KŘP/IMSW Modelování ve výpočtových software
3‐19 (24) 17.8.11
František Dušek KŘP FEI Univerzita Pardubice
Př04 Vytvoření chybového grafu, práce s grafem. Vytvořte vektor x (10 hodnot na intervalu ‐2≤x≤+2), spočítejte vektor y podle vztahu y(x)=x5‐4x4+x+1. Vytvořte vektor e obsahující 10 náhodných čísel s normálním rozložením N(0,1). Do jednoho grafu vyneste pospojované pů‐ vodní body (červené hvězdičky velikosti 16, síla čáry 2) s chybovými úsečkami ± dvojnásobek směrodatné odchylky čísel ve vektoru e a samostatné body získané jako součet vektorů y a e (modrá kolečka velikosti 16 a tloušťka čáry 2). Graf opatřete mřížkou. Př05 Vykreslení průběhů matematických funkcí. Vytvořte jedno okno obsahující čtyři grafy uspořádané do dvou řádků a dvou sloupců. Grafy budou obsahovat průběhy dále uvedených funkcí (síla čary 2) a budou opatřeny nadpisem s názvem grafu a) Descartův list
x(t ) =
3at 1+ t3
y (t ) =
složený ze dvou částí první část (modrá) ‐0.4 ≤ t1 ≤ 999.5 druhá část (červená) ‐1002 ≤ t2 ≤ ‐2.1 b) Bernouliova lemniskáta
x(t ) =
(
3at 2 a=2 1+ t3 1000 bodů logaritmicky 1000 bodů logaritmicky
at 1 + t 2 1+ t4
)
y (t ) =
(
)
at 1 − t 2 1+ t4
a=2
‐ 10 ≤ t ≤ 10 1000 bodů r=1 c) Cykloida r=1 x(t ) = rt − d sin (t ) y (t ) = r − d cos(t ) 1000 bodů 0 ≤ t ≤ 4π tři průběhy pro d=2.5 (červený), d=1 (modrý) a d=0.5 (zelený), doplnit legen‐ du c) Epicykloida
⎛R+r ⎞ t⎟ x(t ) = (R + r ) cos(t ) − d cos⎜ ⎝ r ⎠
⎛R+r ⎞ t⎟ y (t ) = (R + r )sin(t ) − d cos⎜ ⎝ r ⎠
pro R=12, r=4 , d=3 0 ≤ t ≤ 2π
1000 bodů
Př06 Tvorba 3D grafů, práce s handlery grafických objektů. Vytvořte jeden graf obsahující dvě plochy popsané funkcemi
z1 ( x, y ) =
xy 1 + x2 + y2
z2 ( x, y ) =
4 cos( xy 3) 1 + x2 + y 2
První plochu vykreslete jako drátový model a druhou s vyplněnými plochami a doplňte popisy os (řez písma Bold). V aktivním objektu Axes nalezněte handlery všech objektů typu (vlastnost „Type“) plocha (hodnota „Surface“) a ploše odpovídající druhé funkci nastavte Phongovo stínování („FaceLighting“, „phong“) a interpolaci barev („FaceColor“, „interp“). Vytvořte osvětlení v bodu [‐2,2,3] (příkaz light) a nastavte způsob výpočtu osvětlení (příkaz lighting) na Goraudův
KŘP/IMSW Modelování ve výpočtových software
3‐20 (24) 17.8.11
František Dušek KŘP FEI Univerzita Pardubice
3.4.2 Řešení příkladů Př01. Řešení soustavy lineárních rovnic. a)
b)
>> >> >> xa
>> x1 >> x2 >> x3 >> x4
A=[4,-2,0,3; 0,3,-3,2;-1,3,3,0;4,0,1,5]; b=[1;2;3;4]; xa=inv(A)*b b) >> xb=A\b = 0.0390 xb = 0.0390 0.6104 0.6104 0.4026 0.4026 0.6883 0.6883 x1=det([b,A(:,2:4)])/det(A) = 0.0390 x2=det([A(:,1),b,A(:,3:4)])/det(A); = 0.6104 x3=det([A(:,1:2),b,A(:,4)])/det(A); = 0.4026 x4=det([A(:,1:3),b])/det(A) = 0.6883
Ax = b A = LU d)
LUx { = b ⇒ Ly = b a Ux = y y
>> [L,U]=lu(A) % dolni a horni troj.matice L = 1.0000 0 0 0 0 1.0000 0 0 -0.2500 0.8333 1.0000 0 1.0000 0.6667 0.5455 1.0000 U = 4.0000 -2.0000 0 3.0000 0 3.0000 -3.0000 2.0000 0 0 5.5000 -0.9167 0 0 0 1.1667 >> y=zeros(4,1); x=y; % sloupce >> % Gaussova eliminace L*y=b >> y(1)=b(1)/L(1,1); >> y(2)=(b(2)-L(2,1)*y(1))/L(2,2); >> y(3)=(b(3)-L(3,1)*y(1)-L(3,2)*y(2))/L(3,3); >> y(4)=(b(4)-L(4,1)*y(1)-L(4,2)*y(2)-L(4,3)*y(3))/L(4,4); >> y y = 1.0000 2.0000 1.5833 0.8030 >> % Gaussova eliminace U*x=y >> x(4)=y(4)/U(4,4); >> x(3)=(y(3)-U(3,4)*x(4))/U(3,3); >> x(2)=(y(2)-U(2,4)*x(4)-U(2,3)*x(3))/U(2,2); >> x(1)=(y(1)-U(1,4)*x(4)-U(1,3)*x(3)-U(1,2)*x(2))/U(1,1); >> x x = 0.0390 0.6104 0.4026 0.6883 ⎡− 2 1⎤ ⎡7⎤
Př02. Vytvoření grafu aproximace zadaných bodů.
b={[‐2,7], [‐1,7], [0.5,1], [1,3], [3,‐1]} y=kx+q 7=‐2k+q 7=‐k+q 1=0.5k+q
KŘP/IMSW Modelování ve výpočtových software
3‐21 (24) 17.8.11
⎢ −1 ⎢ ⎢0.5 ⎢ ⎢1 ⎢⎣ 3
⎢7⎥ 1⎥⎥ ⎡k ⎤ ⎢ ⎥ 1⎥ ⎢ ⎥ = ⎢ 1 ⎥ ⎥ ⎣q ⎦ ⎢ ⎥ 1⎥ ⎢3⎥ ⎢⎣− 1⎥⎦ 1⎥⎦ František Dušek KŘP FEI Univerzita Pardubice
b)
c)
3=k+q ‐1=3k+q
>> x=[-2,-1,0.5,1,3]; 10 >> y=[7,7,1,3,-1]; >> A=[x',ones(5,1)]; >> p=A\y'; >> k=p(1), q=p(2) 5 k = -1.7297 q = 3.9189 >> xx=linspace(min(x),max(x),100); >> yy=k*xx+q; >> hl=plot(x,y,'or',xx,yy,'b--'); 0 >> set(hl(1),'MarkerSize',12) >> set(hl,'LineWidth',3) >> axis([-5,5,-5,10]) >> grid -5 -5 -4 >> legend('body','přímka') >> ht=title('Proložení přímkou'); >> set(ht,'FontSize',14,'FontWeight','Bold') >> xlabel('osa x','FontSize',12) >> ylabel('osa y','FontSize',12)
Proložení přímkou body přímka
osa y
a)
-3
-2
-1
0
1
2
3
4
5
osa x
Př03 Tvorba různých druhů grafů, využití handlerů objektů. a) b) c)
>> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
vr=20*rand(1000,1)-10; vn=randn(1000,1); v=vr.*vn; H(1,1)=subplot(2,3,1); H(1,2)=subplot(2,3,2); H(1,3)=subplot(2,3,3); H(2,1)=subplot(2,3,4); H(2,2)=subplot(2,3,5); H(2,3)=subplot(2,3,6); plot(H(1,1),vr,'o') title(H(1,1),'Rovnoměrné') plot(H(1,2),vn,'o') title(H(1,2),'Gaussovo') plot(H(1,3),v,'o') title(H(1,3),'součin') axis(H(1,:),[0,1000,-4,4]) hist(H(2,1),vr,12) hist(H(2,2),vn,12) hist(H(2,3),v,12)
Rovnoměrné
Gaussovo
součin
4
4
4
2
2
2
0
0
0
-2
-2
-2
-4
0
500
1000
120
-4
0
500
-4
1000
200
400
150
300
100
200
50
100
0
500
1000
0
2
100 80 60 40 20 0 -1
0
0 -5
1
0
0 -2
5
Př04 Vytvoření chybového grafu, práce s grafem.
>> x=linspace(-1.2,1.2,10); >> y=x.^5+x.^4-4*x.^2+1; >> e=randn(1,10); >> ep=zeros(size(y))+std(e); >> h=errorbar(x,y,2*ep,'ro-'); >> set(h,'LineWidth',2,… 'MarkerSize',16) >> hold on >> h=plot(x,y+e,'b*'); >> set(h,'LineWidth',2,… 'MarkerSize',16) >> grid
4
2
0
-2
-4
-6
-8 -1.5
KŘP/IMSW Modelování ve výpočtových software
3‐22 (24) 17.8.11
-1
-0.5
0
0.5
1
1.5
František Dušek KŘP FEI Univerzita Pardubice
Př05 Vykreslení průběhů matematických funkcí. >> subplot(2,2,1), a=2; a)
b)
c)
d)
>> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
t1=logspace(-1,3,1000)-0.5; %-0.49 az 999.5 x1=3*a*t1./(1+t1.^3); y1=3*a*t1.^2./(1+t1.^3); plot(x1,y1,'b','LineWidth',2) hold on t2=-logspace(-1,3,1000)-2; %-2.1 az -1002 x2=3*a*t2./(1+t2.^3); y2=3*a*t2.^2./(1+t2.^3); plot(x2,y2,'r','LineWidth',2) title('Descartuv list'), grid subplot(2,2,2), a=2; t=linspace(-10,10,1000); a=2; x=a*t.*(1+t.^2)./(1+t.^4); y=a*t.*(1-t.^2)./(1+t.^4); plot(x,y,'LineWidth',2) title('Bernouliova lemniskáta') grid subplot(2,2,3) Descartuv list 4 t=linspace(0,4*pi,1000); 2 r=1; d=2*r; x=r*t-d*sin(t); y=r-d*cos(t); 0 plot(x,y,'b','LineWidth',2) -2 hold on d=r; -4 -4 -2 0 x=r*t-d*sin(t); y=r-d*cos(t); plot(x,y,'r','LineWidth',2) Cykloida 3 d=r/2; 2 x=r*t-d*sin(t); y=r-d*cos(t); plot(x,y,'g','LineWidth',2) 1 title('Cykloida'),grid 0 legend('d=2r','d=r','d=r/2') -1 subplot(2,2,4) -5 0 5 R=5; r=1; d=r*2; Rrt=(R+r)/r*t; x=(R+r)*cos(t)-d*cos(Rrt); y=(R+r)*sin(t)-d*sin(Rrt); plot(x,y,'LineWidth',2) title('Cykloida'), grid
Bernouliova lemniskáta 1
0.5
0
-0.5
2
4
-1 -2
-1
0
1
2
5
10
Cykloida 10 d=2r d=r d=r/2
5
0
-5
10
15
-10 -10
-5
0
Př06 Tvorba 3D grafů, práce s handlery grafických objektů.
x=-4:0.2:4; y=-4:0.2:4; [X,Y]=meshgrid(x,y); Z=X.*Y./sqrt(1+X.^2+Y.^2); mesh(x,y,Z), hold on Z=4*cos(X.*Y/3)./sqrt(1+X.^2+Y.^2); surf(x,y,Z) xlabel('osa x','FontWeight','Bold') ylabel('osa y','FontWeight','Bold') zlabel('osa z','FontWeight','Bold') h=findobj(gca,'Type','surface'); set(h(1),'FaceLighting','phong', ... 'FaceColor','interp') >> light('Position',[-2 2 3]); >> lighting gouraud
>> >> >> >> >> >> >> >> >> >> >>
KŘP/IMSW Modelování ve výpočtových software
3‐23 (24) 17.8.11
František Dušek KŘP FEI Univerzita Pardubice
Pojmy k zapamatování Okruhy problémů: soustavy lineárních rovnic, základní 2D a 3D grafy, spe‐ ciální grafy, grafické objekty, editace grafů, export grafů Použité nástroje:
Property Editor, Inspector, Plot Browser, Figure Pallete
Příkazy a funkce: axes, axis, bar, barh, clf, contour, contourf, det, errorbar, figure, fill, fill3, gca, gcf, grid, hist, hold, inv, legend, lu, mesh, meshgrid, norm, patch, pie, pinv, plot, plot3, print, rank, set, stairs, surf, title, xlabel, ylabel
Otázky na procvičení 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Co je to přeurčená soustava lineárních rovnic, co se považuje za její řešení a jak se získá v MATLABu? Jak zjistíme v MATLABu hodnost matice a k čemu ji využijeme? Jakou funkcí MATLABu zjistíme, že matice je singulární? Co se označuje pojmem dekompozice matice a jaká dekompozice je využi‐ ta při řešení soustavy n lineárních rovnic o n neznámých? Je dána funkce popisující plochu v prostoru z(x,y)=f(x,y). Jak připravíte matici Z pro příkaz mesh(x,y,Z)? Co označuje pojem Handle Graphics? K čemu slouží funkce get a set? Jak se získá handle aktivního okna? Jaká funkce usnadňuje vytvoření matice s polohou bodů pro vykreslení 3D grafu pomocí funkce mesh či surf? Jak vložíme graf vytvořený v MATLABu např. do dokumentu Wordu?
Odkazy a další studijní prameny •
•
on‐line dokumentace k programu nebo www.mathworks.com/help/ – části „Systems of Linear Equations“, „Basic Plotting Commands“, „Crea‐ ting 3‐D Graphs“, „Creating Specialized Plots“, „Organization of Graphics Objects“, „Accessing Object Handles“, „Editing Plots“, „Overview of Prin‐ ting and Exporting“ elektronická učebnice Learning MATLAB 7– www.mathworks.com/academia/student_version/learnmatlab_sp3.pdf (část „Graphics“)
KŘP/IMSW Modelování ve výpočtových software
3‐24 (24) 17.8.11
František Dušek KŘP FEI Univerzita Pardubice
4 Skripty a funkce Studijní cíl Čtvrtý blok se zabývá dvěma tématy. V prvním tématu se budeme zabývat funkcemi MATLABu pro práci s polynomy a zmíníme se o problematice interpo‐ lace. Druhá část tohoto bloku je věnována skriptům, funkcím a programovým konstrukcím.
Doba nutná k nastudování
2 ‐ 3 hodiny
Průvodce studiem Předpokládá se, že čtenář je seznámen s prostředím MATLABu, základními příkazy a komplexními čísly. Dále se předpokládají znalosti základů programo‐ vání. Při studiu je vhodné mít spuštěný MATLAB a jednotlivé příkazy či funkce hned vyzkoušet a případně získat podrobnější informace využíváním nápovědy k programu. Na závěr jsou uvedeny řešené příklady na procvičení. V textu jsou použity následující typografické konvence: Calibri 11, Bold, Italic nové pojmy či informace k zapamatování Calibri 11 označení klávesy Courier New 10, Bold názvy nástrojů MATLABu Courier New 10, Bold upřesnění nápovědy (help téma) Courier New 10 názvy příkazů, funkcí a objektů Courier New 10 označení části příkazu, která se může vynechat Courier New 10, Italic názvy proměnných použitých v programu Courier New 9 příkaz příkazové řádky / výpis programu Courier New 9 výpis programu – klíčová slova Courier New 9 výpis programu – řetězec Courier New 9 výpis programu – komentář
4.1 Operace s polynomy Operace s polynomy nejsou maticové operace. Využívá se možností MATLABu pracovat s proměnnými typu vektor. Polynom je reprezentován koeficienty u jednotlivých mocnin. Musí být uvedeny koeficienty u všech mocnin (včetně koeficientů s nulovou hodnotou, které se v normálním zápise vynechávají). Konvence – koeficienty jsou uspořádány sestupně (koeficient u nejvyšší moc‐ niny je v položce s nejnižším indexem). Standardně se používá zápis ve formě řádkového vektoru. Koeficienty mohou být také komplexní čísla. Obecně lze tuto konvenci pro polynom stupně N zapsat jako N
pN ( x) = ∑ ak x k
p=[aN, aN‐1, … , a2, a1, a0]
k =0
a konkrétní příklady zápisu v MATLABu jsou KŘP/IMSW Modelování ve výpočtových software
4‐1 (22) 28.8.11
František Dušek KŘP FEI Univerzita Pardubice
p( x) = 7 x + 5x − 4 x + 2 x r (c) = c − 1 s(t ) = (1 + i )s + 2s − 3 + 2i 7
5
4
p=[7 0 5 ‐4 0 2 0 0]
2
5
3
r=[1, 0, 0, 0, 0, ‐1] s=[1+1i, 0, 2, ‐3+2i]
MATLAB obsahuje řadu funkcí pro operace s polynomy a funkcí pro interpolaci (viz help polyfun). Dále jsou uvedeny některé funkce pro práci s polynomy případně funkce, které mají polynomy jako parametry. x=roots(p) určení vektoru kořenů 1 x polynomu p Úloha jsou‐li známy koeficienty ak poly‐ nomu pN urči kořeny xi Příklad x 3 + 2 = Řešení >> p=[1 0 0 2];
N
N
k =0
i =1
p N ( x) = ∑ ak x k = a N ∏ ( x − xi )
>> x=roots(p) x = -1.2599 0.6300 + 1.0911i 0.6300 - 1.0911i
= (x + 1.2599)( x − 0.63 − 1.0911i )( x − 0.63 + 1.0911i ) p=poly(x) vytvoření polynomu p, který má kořeny ve N −1 vektoru x p N ( x ) = x N + ak x k k =0 N Úloha jsou‐li známy kořeny xi urči koeficienty ak polynomu (x − xi ) = pN i =1 Příklad ( x − 0.5)( x − 0.5)( x − 1 − 07i )( x − 1 + 0.7i ) = Řešení >> x=[0.5,0.5,1+0.7i,1-0.7i];
∑
∏
>> p=poly(x) p = 1.0000 -3.0000
3.7400 -1.9900
0.3725
= x − 3 x 3 + 3.74 x 2 − 1.99 x + 0.3725 4
N y=polyval(p,x) vyčíslení polynomu v da‐ y ( x ) = ak x k ných bodech (hodnoty y polynomu p v bodech k =0 daných vektorem x) Úloha jsou‐li dány koeficienty ak a body xi urči hodnoty yi 4 3 Příklad p( x) = −0.1x + 0.2 x + 2 x − 1 x={‐1,‐0.3,‐0.1,0,0.2,0.5,1} Řešení >> x=[-1,-0.3,-0.1,0,0.2,0.5,1];
∑
>> p=[-0.1,0.2,0,2,-1]; >> y=polyval(p,x) y =-3.3000 -1.6062 -1.2002 -1.0000 -0.5986
0.0188
{xi , y(xi )}
1.1000 N
∑
p N ( x ) = ak x dp=polyder(p) derivace polynomu k =0 N −1 Úloha jsou‐li dány koeficienty ak urči dp N = dp N −1 ( x) = bk x k koeficienty bk dx k =0 k
∑
1
Takové hodnoty nezávisle proměnné, pro které je hodnota polynomu rovna 0. Polynom N‐tého stupně má vždy N kořenů. Kořeny mohou být násobné. Polynom s reálnými koeficienty může mít také komplexní kořeny. Pokud takovýto polynom má komplexní kořeny, pak jsou vždy po dvoji‐ cích komplexně sdružených čísel.
KŘP/IMSW Modelování ve výpočtových software
4‐2 (22) 28.8.11
František Dušek KŘP FEI Univerzita Pardubice
(
Příklad Nalezněte derivaci daného polynomu Řešení >> p=[4 3 0 1 -1]; >> dp=polyder(p) dp =
16
9
0
)
d 4 x 4 + 3x 3 + x − 1 = dx = 16 x 3 + 9 x 2 + 1
1
ip=polyint(p) integrace polynomu (absolutní člen výsledného poly‐ nomu ip je nula) N p N ( x ) = ak x k k =0 Úloha jsou‐li dány koeficienty ak urči koeficienty bk N +1 k
∑
Příklad
∫ (4 x
4
∫p
)
+ 3 x 3 + x − 1 dx =
N
dx = ip N +1 ( x ) = ∑ bk x k =1
Řešení >> p=[4 3 0 1 -1]; >> ip=polyint(p) ip = 0.8000 0.7500
0
0.5000 -1.0000
0
= 0.8 x + 0.75 x + 0.5 x 2 − x 5
4
p=polyfit(x,y,N) proložení 2 daných bodů polynomem p stupně N N Úloha je dáno M bodů o souřadnicích {xi, yi} a y ( x ) = ak x k {xi , yi } stupeň N≤M‐1, urči takové koeficienty ak poly‐ k =0 nomu y(x), aby součet kvadrátů rozdílů yi‐y(xi) byl i = 1K M M ≥ N + 1 minimální Příklad x={‐1, ‐0.3,‐0.1,0, 0.2,0.5, 1} y={‐10,‐3, ‐1, 0,‐2, ‐5, ‐10} N=4, zakreslit výsledky do grafu Řešení >> x=[-1, -0.3,-0.1,0, 0.2,0.5, 1];
∑
0
původní body body polynomu
-2
-4
>> y=[-10,-3, -1, 0,-2, -5, -10]; >> p=polyfit(x,y,4) p = 13.6396 -0.8826 -22.9936 0.8947 -0.6409 >> xx=linspace(min(x),max(x),50); >> yy=polyval(p,xx); >> plot(x,y,'rd',xx,yy,'b'), grid >> legend('původní body','body polynomu')
-6
-8
-10
-12 -1
-0.8
-0.6
-0.4
-0.2
0
0.2
0.4
0.6
0.8
1
p=conv(a,b) konvoluce (polynom p je součin dvou polynomů a*b) na nb k a ( x ) = a x b ( x ) = bk x k b k nb Úloha jsou‐li dány koeficienty ak a na k k =0 k =0 urči koeficienty ck N p N ( x ) = a × b = ck x k N = na + nb k =0
∑
∑
∑
( x) ( x) ( x) 644a7 448 64b7 48 64b7 48 4 3 3 3 Příklad 4 x + 3 x + x − 1 x − x − 1 x − x − 1 =
(
)(
)(
)
Řešení >> a=[4 3 0 1 -1]; >> b=[1 0 -1 -1]; >> p=conv(a,conv(b,b)) p = 4 3 -8 -13 -3 9 10
6
1
-1
-1
= 4 x10 + 3x 9 − 8 x 8 − 13x 7 − 3x 6 + 9 x 5 + 10 x 4 + 6 x 3 + x 2 − x − 1 2
Vytvoření polynomu p stupně N, který optimálně (ve smyslu minima kvadrátu odchylek) pro‐ kládá body o souřadnicích {xk, yk} daných dvojicí vektorů x, y
KŘP/IMSW Modelování ve výpočtových software
4‐3 (22) 28.8.11
František Dušek KŘP FEI Univerzita Pardubice
[q,r]=deconv(b,a) dekonvoluce – podíl dvou polynomů (q je podíl dvou polynomů b/a, r je zbytek) Úloha jsou‐li dány koeficienty ak a bk polynomů a(x) a b( x) r ( x) = q ( x) + b(x), pak urči koeficienty qk a rk polynomů a ( x) a( x) ( x) 644b7 448 q(x) a r(x) 3 4 x 4 + 3x3 + x − 1 1 x4 −2x4 − 31 = a( x) Příklad Vyčíslete podíl dvou daných polynomů Řešení >> b=[4 3 0 1 -1]; r ( x) >> a=[1 0 -1 -1]; >> [q,r]=residue(b,a) q = 4 3 r = 0 0 4 8
64748 4x2 + 8x + 2 = 41x2+33 + x3 − x − 1 q( x)
2
[r,p,k]=residue(b,a) rozklad racionálně lomené funkce 3 na parciální zlomky [b,a]=residue(r,p,k) vytvoření racionálně lomené funkce z parciál‐ ních zlomků na nk Úloha jsou‐li dány koeficienty b( x) rj b( x ) = = + kjx j na aj a bj urči koeficienty rj, pj a kj , a ( x) x − p j =1 j =0 j x − pj jsou‐li dány koeficienty rj, pj a j =1 kj urči koeficienty aj a bj Příklad určete pro danou racionálně lomenou funkci rozklad na součet parciál‐ ních zlomků
∏(
)
∑
∑
( x) 6444444444444b7 4444444444448 7 6 5 4 x + 3.5 x + 2.25 x − 2.875 x − 2.375 x 3 + 1.125 x 2 + 0.625 x − 0.25 = 4 3 2 + 24 +4 −4 − 04 x5 4 x4 0.4 5 x4 14 .75 14 .4375 x4 .3125 1 2x4−4 44 43 a( x)
Pozor ‐ jmenovatel obsahuje dvojnásobný kořen ‐0.5, takže je potřeba použít složitější tvar rozvoje (Heavisideův rozvoj) – viz help residue nebo také http://en.wikipedia.org/wiki/Partial_fraction Řešení >> a = [1, 2, 0.5, -1.75, -1.4375, -0.3125]; >> b =[1, 3.5, 2.25, -2.875, -2.375, 1.125, 0.625, -0.25]; >> [r,p,k]=residue(b,a) r = -0.1360 - 0.5184i -0.1360 + 0.5184i 0.3137 0.5833 0.2500 p = -1.0000 + 0.5000i -1.0000 - 0.5000i 1.0000 -0.5000 -0.5000 k = 1.0000 1.5000 -1.2500
3
Racionálně lomená funkce je funkce tvořená podílem dvou polynomů
KŘP/IMSW Modelování ve výpočtových software
4‐4 (22) 28.8.11
František Dušek KŘP FEI Univerzita Pardubice
r1
r2
6447448 6447448 − 0.136 − 0.5184i − 0.136 + 0.5184i x 4 1.2 5 x4 .3 25 + =1 +4 − 14 + + x − (− 1 + 0.5i ) x − (− 1 − 0.5i ) k ( x) 14243 14243 2
p1
r3
p2
r4
678 678 } 0.3137 0.5833 0.25 = + + + 2 x − ({ + 1) x − (− 0.5) ⎡ ⎤ 123 p3 ⎢ x − (− 0.5)⎥ p4 3⎥ ⎢ 12 p5 ⎦ ⎣ − 0.2721x + 0.2463 0.3137 0.5833 0.25 = x 2 + 1.5 x − 1.25 + + + + 2 x + 2 x + 1.25 x −1 x + 0.5 (x + 0.5)2 r5
y=filter(b,a,u) číslicový filtr – odezva filtru popsaného vektory a, b na
diskrétní signál u při nulových počátečních podmínkách Úloha jsou‐li dány koeficienty ak a bk polynomů a(z‐1) a b(z‐1) diskrétního pře‐ nosu P(z‐1) =
( ) ( )
b z −1 bm + bm−1 z −1 + bm−2 z −2 + K + b0 z − m = odpovídajícího di‐ a z −1 1 + an−1 z −1 + an−2 z −2 + K + a0 z −n y (k ) + an −1 y (k − 1) + K + a0 y (k − n) =
ferenční rovnici
= bmu (k ) + bm −1u (k − 1) + K + b0u (k − m)
, pak urči průběh
signálu y jako odezvu na signál u při nulových počátečních podmínkách Příklad Určete průběh diskrétního výstupního signálu systému popsaného diferenční rovnicí y(k) ‐ 2.3364 y(k‐1) + 1.8196 y(k‐2) ‐0.4724 y(k‐3)= ‐0.0404 u(k‐1) + 0.1682 u(k‐2) ‐ 0.1170 u(k‐3) jako odezvu na diskrétní vstupní signál tvořený jednou periodou obdélníkového signálu (perioda je 2 sec) se vzorko‐ váním 0.25 s. Do grafu vyneste průběh vstupního (červené hvězdičky) i vý‐ stupního (modrá kolečka0 signálu jako izolované body. Graf opatřete mříž‐ kou, nadpisem, legendou a popisem os. Řešení >> bd=[0 -0.0404 0.1682 -0.1170]; ad=[1 -2.3364 1.8196 -0.4724]; T=0.025; % vzorkování Pe=2.0; % perioda % počet vzorků na Pe/2 N=round(Pe/2/T); t=0:T:(2*N-1)*T; u=[ones(N,1);zeros(N,1)]; y=filter(bd,ad,u); plot(t,u,'*r',t,y,'ob') grid legend('u','y') h=title('filter'); set(h,'FontSize',14) xlabel('cas (s)') ylabel('u,y')
KŘP/IMSW Modelování ve výpočtových software
filter
1.2
u y 1
0.8
0.6 u,y
>> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
0.4
0.2
0
-0.2
4‐5 (22) 28.8.11
0
0.2
0.4
0.6
0.8
1 cas (s)
1.2
1.4
1.6
1.8
2
František Dušek KŘP FEI Univerzita Pardubice
4.2 Interpolace Interpolace znamená nalezení hodnoty neznámé funkce mezi jejími zadanými (známými) body – interpolační funkce zadanými body prochází. Tím se interpo‐ lace liší od aproximace, kdy aproximační funkce nemusí zadanými body pro‐ cházet. Jednou z nejčastěji používaných aproximačních funkcí je polynom. V MATLABu je pro získání polynomu, který aproximuje zadané body ve smyslu nejmenší kvadratické vzdálenosti, používána nám již známá funkce polyfit. N body lze proložit polynom maximálně stupně N‐1. V tomto případě dostaneme interpo‐ lační křivku, která prochází všemi N body. Skutečnou (jednorozměrnou) interpolaci poskytuje funkce yi = interp1(x,y,xi,method)
kde x, y jsou vektory obsahující souřadnice zadaných bodů a xi je vektor x‐ ových souřadnic, ve kterých chceme získat interpolované hodnoty yi. Volitelný parametr method je řetězec určující jaká metoda interpolace se má použít. Možné jsou následující metody 'nearest' náhrada hodnotou nejbližšího zadaného bodu 'linear' náhrada přímkou spojující dva vedlejší body 'spline' náhrada kubickými spline 'cubic' náhrada po částech spojitých kubických spline Podobně dvourozměrnou interpolaci poskytuje funkce Zi = interp2(X,Y,Z,Xi,Yi,method)
kde X, Y a Z jsou matice (viz funkce meshgrid) obsahující souřadnice zada‐ ných bodů a hodnoty funkce ‐ plochy Z(x,z) a Xi, Yi jsou matice x‐ových a y‐ ových souřadnic, ve kterých chceme získat interpolované hodnoty matice Zi. Volitelný parametr method je řetězec určující jaká metoda interpolace se má použít. Následující příklad na úloze interpolovat jednu jednorozměrnou a jednu dvou‐ rozměrnou funkci ukazuje použití popisovaných funkcí. Je ukázán výsledek interpolace 7 bodů funkce y=sin(x) všemi metodami funkce interp1 ve formě grafu s 5 průběhy. Použití dvourozměrné interpolace je ukázáno na interpolaci 6x6 bodů funkce z(x,y)=cos(xy) do 30x30 interpolovaných bodů. >> >> >> >> >> >> >> >> >> >> >> >> >> >>
x=linspace(-pi,pi,7); xi=linspace(-pi,pi,100); y=sin(x); plot(x,y,'ok','LineWidth',3,'MarkerSize',12); hold on p=polyfit(x,y,6); y1=polyval(p,xi); plot(xi,y1,'r','LineWidth',2) y2=interp1(x,y,xi,'nearest'); plot(xi,y2,'c','LineWidth',2) y3=interp1(x,y,xi,'linear'); plot(xi,y3,'m','LineWidth',2); y4=interp1(x,y,xi,'spline'); plot(xi,y4,'g','LineWidth',2); y5=interp1(x,y,xi,'cubic'); plot(xi,y5,'b','LineWidth',2);
KŘP/IMSW Modelování ve výpočtových software
4‐6 (22) 28.8.11
František Dušek KŘP FEI Univerzita Pardubice
>> axis([-3.2,3.2,-1.1,1.1]), grid >> po={'sin','polynom','nearest','linear',… 'spline','cubic'}; >> legend(po,'Location','NorthWest') >> title('Interpolace','FontSize',16) Interpolace sin polynom nearest linear spline cubic
1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 -3
>> >> >> >> >> >> >> >> >> >> >> >> >> >>
-2
-1
0
1
2
3
x =linspace(-3*pi/4,3*pi/4,6); xi=linspace(-3*pi/4,3*pi/4,30); y =x; yi=xi; [X,Y]=meshgrid(x,y); [Xi,Yi]=meshgrid(xi,yi); Z =cos(X.*Y); subplot(2,1,1), surf(x,y,Z) title('cos(x.y) 5x5 bodu','FontSize',12) Zi=interp2(X,Y,Z,Xi,Yi,'nearest'); subplot(2,2,3), surf(xi,yi,Zi) title('nearest 30x30 bodu','FontSize',12) Zi=interp2(X,Y,Z,Xi,Yi,'spline'); subplot(2,2,4), surf(xi,yi,Zi) title('spline 30x30 bodu','FontSize',12) axis([-4,4,-4,4,-1,1]) cos(x.y) 5x5 bodu 1
0
-1 3
2
1
0
-1
-2
-3
-3
nearest 30x30 bodu 1
0
0
5
0
3
2
1
spline 30x30 bodu
1
-1 5
0
-1
-2
0 -5 -5
KŘP/IMSW Modelování ve výpočtových software
-1 4
2
0
-2
-4 -4
-2
4‐7 (22) 28.8.11
0
2
4
František Dušek KŘP FEI Univerzita Pardubice
4.3 Skripty a uživatelské funkce Programy jsou v MATLABu realizovány pomocí skriptů a funkcí. Program je představován posloupnosti příkazů a programových konstrukcí 4 zapsaných do textového souboru s příponou .m – tzv. m‐file. Pokud je soubor s příponou .m umístěn v aktuální složce či složce, která je zařazena do seznamu prohledáva‐ ných složek (viz příkaz path či nástroj pathtool), potom po uvedení jména souboru (bez přípony .m) do příkazového řádku se příkazy uvedené v souboru postupně provedou stejně jako bychom je zapsali do příkazového řádku. Takto vytvořený soubor se nazývá skript (script). Důležité je zapamatovat si, že skript využívá pracovní prostor, v rámci kterého byl spuštěn. To znamená, že: ‐ příkazy uvedené ve skriptu mohou využívat existující proměnné v pracovním prostoru (workspace) v jehož kontextu byl skript spuštěn ‐ proměnné vytvořené příkazy skriptu po jeho ukončení v pracovním prostoru také zůstanou ‐ pokud příkaz skriptu odkazuje na neexistující proměnnou, tak dojde k chybě ‐ pokud se v rámci skriptu vytvoří proměnná se jménem proměnné, které již existovalo, tak je původní proměnná přepsána. Následující skript – dva příkazy zapsané pomocí libovolného jednoduchého textového editoru (např. notepad) nebo editoru 5 MATLABu do souboru schs.m sh=(exp(v)-exp(-v))/2; % Hyperbolic sine of argument in radians ch=(exp(v)+exp(-v))/2; % Hyperbolic cosine of argument in radians
počítá po vyvolání příkazem >> schs
hodnotu hyperbolický sinus a cosinus proměnné v a výsledek uloží do proměn‐ ných sh a ch. Proměnná v (vždy stejného názvu) musí před voláním skriptu existovat a výsledek je uložen vždy do proměnných (vždy stejného názvu) sh a ch. Funkce je opět textový soubor s příponou .m obsahující opět příkazy a progra‐ mové konstrukce stejně jako skript. Jediný rozdíl je v tom, že první řádek sou‐ boru s příkazy začíná klíčovým slovem function a příkazy mohou (ale nemusí) být ukončeny klíčovým slovem end. Zdánlivě malý rozdíl (klíčové slovo function) oproti skriptu má dalekosáhlé důsledky. Příkazy funkce pracují s proměnnými ve vlastním pracovním prostoru. Propojení mezi pracovním pro‐ storem funkce a pracovního prostoru, v jehož kontextu je funkce volána je pomocí vstupních a výstupních parametrů funkce uvedených za klíčovým slo‐ vem function. Obecná syntaxe hlavičky funkce (prvního řádku) je následující
function [ou1,ou2,…]=nazev_funkce(in1,in2,…)
4
programové konstrukce se samozřejmě mohou používat i v rámci příkazového řádku ale obvyk‐ le to nemá význam
5
Editor MATLABu je možné spustit příkazem edit, nebo prvním tlačítkem New Script na ná‐ strojové liště, nebo klávesovou zkratkou Ctrl+n, nebo položkou Menu File -> New -> Script
KŘP/IMSW Modelování ve výpočtových software
4‐8 (22) 28.8.11
František Dušek KŘP FEI Univerzita Pardubice
Počet vstupních i výstupních (na rozdíl od funkcí v standardních programova‐ cích jazycích) parametrů není omezen a může být i nulový. Za určitých okolnos‐ tí je dokonce možné volat funkci s menším počtem vstupních i výstupních pa‐ rametrů než je uvedeno v hlavičce funkce. Název funkce by se měl shodovat se jménem souboru, do kterého funkci uložíme. Je sice možné 6 uložit funkci do souboru s jiným názvem, ale při volání je nutné použít jméno souboru s danou funkcí. S tím, že je rozhodující jméno souboru (nikoliv název funkce uvedený v hlavičce), souvisí určité porušení filosofie MATLABu. V názvech proměnných se rozlišují velká a malá písmena zatímco v názvech uživatelem vytvořených funkcí 7 se (zatím 8 , R2010b) nerozlišuje. Důvod je konvence OS Windows, která sice dovoluje používat v názvech souborů velká i malá písmena, ale (na rozdíl od UNIXu) různá velikost písma v názvu souboru neznamená různé soubory. Proto také není možné v MATLABu rozlišit dvě různé funkce (názvy souborů) podle velikosti písma.
Následuje příklad funkce s názvem schf – příkazy a komentáře zapsané do textového souboru schf.m pomocí editoru MATLABu function [sh,ch]=schf(v) % výpočet hyperbolický sinus a cosinus % [sh,ch]=schf(v) sh=(exp(v)-exp(-v))/2; % Hyperbolic sine of argument in radians ch=(exp(v)+exp(-v))/2; % Hyperbolic cosine of argument in radians end
počítá po vyvolání příkazem >> [b,c]=schf(a)
hodnotu hyperbolický sinus a cosinus použité vstupní proměnné a (konstanta, skalár, vektor, matice, výraz) a výsledek uloží do použitých proměnných b (sinh) a c (cosh). S tím, že uživatelem vytvářené funkce se ukládají do souboru, souvisí další pro‐ blém. Pokud uživatel vytvoří funkci se jménem již existující funkce, která funk‐ ce se provede při použití jména, které mají dvě různé funkce? Odpověď souvisí 6
Jedinou „výhodou“ tohoto postupu je znepřehlednění vytvářeného programu.
7
Názvy „vestavěných“ funkcí (též funkce jádra) musí být malými písmeny. Např. příkaz sin(1) je dobře a SIN(1) vyvolá chybu >> SIN(1) ??? Undefined function or method 'SIN' for input arguments of type 'double'.
8
Objeví se sice varovné hlášení, ale funkce je správně zavolána. Např. následující příkaz sice vyvolá varovné hlášení ale příkaz se standardně provede >> SUBPLOT(111) Warning: Could not find an exact (case-sensitive) match for 'SUBPLOT'. E:\MATLAB\R2010b\toolbox\matlab\graph2d\subplot.m is a caseinsensitive match and will be used instead. You can improve the performance of your code by using exact name matches and we therefore recommend that you update your usage accordingly. Alternatively, you can disable this warning using warning('off', 'MATLAB:dispatcher:InexactCaseMatch'). This warning will become an error in future releases.
KŘP/IMSW Modelování ve výpočtových software
4‐9 (22) 28.8.11
František Dušek KŘP FEI Univerzita Pardubice
s již zmiňovaným seznamem prohledávaných složek. Při požadavku na volání funkce se tato vyhledává v seznamu prohledávaných složek v pořadí jak je se‐ znam uspořádán. Který soubor s funkcí se najde první, ta funkce se vykoná. Funkce jádra – vestavěné funkce (built-in function), mají přednost před ostatními funkcemi tvořenými textovými soubory.
4.3.1 Další obecné vlastnosti funkcí Některé z dále uvedených vlastnosti budou uvedeny až v příkladech na procvi‐ čení protože jejich použití má význam až v souvislosti s programovými kon‐ strukcemi, které budou uvedeny až v kapitole 4.4. Nápověda k funkci (help) Kromě toho, že se ve skriptech a funkcích mohou používat komentáře 9 , je možné pomocí komentářů vytvořit i základní nápovědu (help) k funkci či skrip‐ tu. Pokud za prvním řádkem s hlavičkou funkce případně hned od prvního řád‐ ku následují souvisle řádky začínající znakem %, pak se tyto řádky vypíší v případě, že použijeme příkaz help nazev_funkce. Výpis je končí posled‐ ním komentářovým řádkem před řádkem, který nezačíná procentem a obsahu‐ je nějaký příkaz. Tento systém je použit nejen pro uživatelské a standardní funkce MATLABu ale i pro vestavěné funkce. Např. pro funkci jádra sin existu‐ je soubor sin.m obsahující pouze nápovědu k funkci %SIN Sine of argument in radians. % SIN(X) is the sine of the elements of X. % % See also ASIN, SIND. % % %
Copyright 1984-2005 The MathWorks, Inc. $Revision: 5.7.4.7 $ $Date: 2005/06/21 19:28:14 $ Built-in function.
Subfunkce a zahnízděné funkce Co se stane, když do jednoho souboru umístíme několik funkcí (klíčových slov function)? Jméno souboru by mělo být shodné se jménem první (také název hlavní, primární, základní) funkce. Zvenku bude možné volat pouze tuto první funkci. Ostatní funkce mohou být umístěny dvěma způsoby. Je‐li jedna funkce ukončena tím že následuje funkce další (klíčové slovo function), jde o tzv. subfunction. V tomto případě může libovolná funkce uvnitř souboru volat jakoukoliv jinou funkci uvnitř souboru (tj. funkce na stejné úrovni) i všechny ostatní funkce mimo soubor. Zvně souboru však může být volána (je viditelná) pouze první funkce. Pracovní prostory funkcí jsou odděleny. V případě, že je jedna funkce (funkce musí být v tomto případě ukončena klí‐ čovým slovem end) vytvořena uvnitř jiné funkce, jde o tzv. zahnízděnou funkci (nested function). Zahnízděná funkce může být volána pouze z funkce, ve které je vytvořena případně z dalších funkcí vytvořených ve stejné funkci. Volat může jakoukoliv funkci na stejné úrovni a všechny funkce na vyšších úrovních. 9
Pokud je v textu znak % (procento), pak text do konce řádku se považuje za komentář a nemá na provádění příkazu žádný vliv.
KŘP/IMSW Modelování ve výpočtových software
4‐10 (22) 28.8.11
František Dušek KŘP FEI Univerzita Pardubice
Zahnízděná funkce má přístup do pracovních prostorů všech funkcí, do nichž je zahnízděna.
Následující příklad ukazuje pět funkcí umístěných v souboru A.m. Funkce A je základní a jediná, kterou je možné volat z příkazového řádku. Funkce A, B a C jsou vůči sobě subfunkce a mohou se vzájemně volat. Jejich pracovní prostory jsou oddělené. Funkce Ca, Cb jsou zahnízděné ve funkci C a zároveň jsou vůči sobě subfunkce. Lze je volat pouze z funkce C případně může volat jedna dru‐ hou. Funkce Ca, Cb mohou volat jakoukoliv z uvedených funkcí a mohou pra‐ covat s proměnnými v pracovním prostoru funkce C. function y=A(xA) % základní funkce, pouze A je možné volat zvnějšku % může být volána z B i C % může volat B i C y=C(xA)+B(xA); end % end není nutné uvádět function y=B(xB)% fce C může volat subfunkce A i B % subfunkce, není možné volat B zvnějšku % může být volána z A i C % může volat A i C y=sin(xB)/3; % subfunkce může volat libovolnou funkci end % end není nutné uvádět function y=C(xC)% fce C může volat subfunkce A i B % subfunkce, není možné volat C zvnějšku % může být volána z A i B % může volat A i B x1=2; x2=B(xC)/3; function y=Ca % zahnízděná funkce v C, není možné volat z A i B % může být volána z C i Cb % může volat A i B % má přístup k proměnným fce C y=x1+x2; end % end musí být uvedeno x3=Ca; function y=Cb % zahnízděná funkce v C, není možné volat z A i B % může být volána z C i Ca % může volat A i B % má přístup k proměnným fce C y=B(x1)+x3; end % end musí být uvedeno y=Cb; end % end není nutné uvádět
Globální a persistentní 10 proměnné Standardně jsou pracovní prostory oddělené 11 a není možné v kontextu jedno‐ ho pracovního prostoru používat (přistupovat) k proměnným v jiném pracov‐ ním prostoru. Další standardní chování je, že když pracovní prostor zanikne (např. při ukončení funkce), zaniknou i všechny v něm existující proměnné. Za 10
Česky by byl asi možný název „trvale existující“ nebo nadneseně „nezničitelné“ proměnné
11
Výjimkou jsou již zmíněné zahnízděné funkce (nested function)
KŘP/IMSW Modelování ve výpočtových software
4‐11 (22) 28.8.11
František Dušek KŘP FEI Univerzita Pardubice
určitých okolností lze pro vyjmenované proměnné toto standardní chování změnit.
Zachovat proměnnou (včetně její hodnoty) i po zániku příslušného pracovního prostoru je možné pomocí příkazu persistent název_proměnné. Pokud použijeme uvedený příkaz např. ve funkci, zůstane příslušná proměnná zacho‐ vána v paměti i po ukončení funkce (zániku jejího pracovního prostoru). Při novém volání dané funkce bude příslušná proměnná k dispozici s původní hod‐ notou. Možné využití by mohlo být např. ke zjištění, kolikrát byla příslušná funkce volána. Globální a lokální proměnné jsou pojmy známé ze standardních programova‐ cích jazyků. Proměnné vytvářené uvnitř funkcí odpovídají lokálním proměn‐ ným. Globální proměnné MATLABu vytvořené pomocí příkazu global mají trochu jiné vlastnosti než globální proměnné v programovacích jazycích. Pro‐ měnné vytvořené příkazem global název_proměnné jsou společné pouze v těch pracovních prostorech, ve kterých je příkaz použit, nikoliv ve všech pra‐ covních prostorech. V MATLABu je tedy možné vytvořit „společnou“ proměn‐ nou pouze mezi dvěma (či více) konkrétními pracovními prostory. Speciální proměnné dostupné uvnitř funkcí V MATLABu existuje možnost jak zjistit – uvnitř funkce – počet vstupních a výstupních parametrů konkrétně použitých při volání příslušné funkce. Uvnitř funkce jsou dostupné předdefinované proměnné nargin a nargout, které obsahují hodnoty představující aktuální počet vstupních (nargin) a výstupních (nargout) parametrů použitých při volání dané funkce.
4.4 Programové konstrukce Po obecných vlastnostech funkcí se dostáváme k programovým konstrukcím tj. speciálním příkazům umožňujícím větvení (rozhodování) či opakování posloup‐ nosti standardních příkazů. MATLAB má poměrně omezený (nicméně dostaču‐ jící) repertoár programových konstrukcí. K dispozici jsou tři konstrukce pro větvení a dvě konstrukce pro cykly.
4.4.1 Programové konstrukce pro větvení První konstrukce pro větvení if … end (rozhodování) je ve dvou variantách if expr % je-li true statement1; statement2; … else % jinak (false) statement3; statement4; … end
KŘP/IMSW Modelování ve výpočtových software
if expr1 % je-li true statement1; statement2; … elseif expr2 % jinak je-li true statement3; statement4; … else % jinak (false) statement5; statement6; … end
4‐12 (22) 28.8.11
František Dušek KŘP FEI Univerzita Pardubice
Výraz (expression) za if (elseif) by správně měl být boolovský tj. nabývat pouze hodnot „true“ nebo „false“. V případě, že výsledkem výrazu je numeric‐ ká skalární hodnota, je za „true“ považována nenulová hodnota a za „false“ nulová hodnota. Je‐li výsledkem výrazu vektorová či maticová proměnná, pak je za „true“ považováno, když všechny prvky jsou nenulové a za „false“ pokud aspoň jedna hodnota je nulová. % rovno if a==0 x=1; else x=b/a; end
% nerovno if a~=0 x=b/a; else x=1; end
% logické and if (a>0)&&(b>0) x=sqrt(a*b); end
x=randn(1); if x>0, disp('x je větší než 0') elseif x<0, disp('x je menší než 0') else disp('x je menší než 0') end x=randn(1,5) např. x = ‐0.8880 0.1001 ‐0.5445 0.3035 ‐0.6003 v5=abs(x)<=0.5 v5 = 0 1 0 1 0 v1=abs(x)<=1 v1 = 1 1 1 1 1 if abs(x)<=0.5 disp('-0.5<=x<=0.5') elseif abs(x)<=1 disp('-1<=x<=1') end
Syntaxe druhé konstrukce pro větvení switch … case … end (přepínač) je následující switch expression case value1 statement1; statement2; … case value2 statement3; statement4; … … otherwise statement5; statement6; … end
% výsledek musí být buď číslo či řetězec % jedna z možných hodnot výrazu
% jedna z možných hodnot výrazu
% v případě hodnoty neuvedené v některém case
Výsledek výrazu za příkazem switch musí být buď skalární číslo, nebo řetězec. Větev otherwise je nepovinná. Příkazy v ní uvedené se provádí pouze v případě, že výsledek výrazu není žádná z hodnot uvedených ve větvích case. x=input('Zadej celé číslo od 1 do 3 nebo slovo ahoj'); switch x case 1 s='Zadáno číslo 1'; case 2 s='Zadáno číslo 2'; case 3 s='Zadáno číslo 3'; case 'ahoj'
KŘP/IMSW Modelování ve výpočtových software
4‐13 (22) 28.8.11
František Dušek KŘP FEI Univerzita Pardubice
s='Zadáno ahoj'; otherwise s='Zadáno něco jiného'; end disp(s)
Třetí konstrukce větvení je speciální příkaz try … catch … end umožňující zachytit výjimky (exception) při provádění bloku příkazů. Tato konstrukce je asi nejvíce využívána při práci se soubory či periferními zařízeními try statement1; statement2; … catch variablename statement3; statement4; … end
Do proměnné variablename je uložen objekt typu MException. Pomocí této proměnné lze zjistit, o jakou výjimku jde.
4.4.2 Programové konstrukce pro cykly V MATLABu jsou k dispozici dvě programové konstrukce pro tvorbu cyklů. Nej‐ častěji je asi používán cyklus s daným počtem opakování for … end for variablename=initval:step:endval statement1; statement2; … end
Na následujícím příkladě ukážeme, kromě použití cyklu for…end také nepří‐ jemný důsledek (prodloužení doby provádění) jinak příjemné vlastnosti MATLABu že není nutné deklarovat datový typ proměnných. Vytvořme skript, který pomocí dvou do sebe vnořených cyklů spočítá matici hodnot funkce z(x,y)=cos(xy) pro všechny kombinace hodnot vektorů x a y a určeme, jak dlou‐ ho trvá provádění cyklů. Pak určíme dobu provádění v případě, že doplníme vytvoření výstupní matice s nulovými hodnotami. clear % výmaz všech proměnných N=1000; % počet hodnot ve vektorech x,y x=linspace(-pi,pi,N); y=x; tic % časová značka - start % Z=zeros(N,N); % jednorázové vytvoření matice Z for r=1:N % cykl přes hodnoty x for s=1:N % cykl přes hodnoty y Z(r,s)=cos(x(r)*y(s)); end end t=toc % odečtení času od startu
Na daném počítači trvalo provádění skriptu bez vytvoření nulové matice při trojím spuštění 3.1779, 3.0223 a 3.1066 sec. V modifikaci s vytvořením nulové matice pak 0.1967, 0.2309 a 0.1826 sec tj. cca 6% původního času ačkoliv sle‐ dovaná část obsahuje jeden příkaz navíc. KŘP/IMSW Modelování ve výpočtových software
4‐14 (22) 28.8.11
František Dušek KŘP FEI Univerzita Pardubice
V MATLABu existuje ještě varianta parfor…end (ve stejné syntaxi jako for…end) umožňující paralelní vykonávání příkazů uvedených v těle cyklu. Není garantováno pořadí provádění příkazů v cyklu. Na vícejádrovém proceso‐ ru nepřináší významnější zrychlení neboť standardní knihovny MATLABu již paralelní výpočty (pokud je to možné) podporují. Při použití s nainstalovaným Parallel Computing Tbx umožňuje výpočet příkazů na různých procesorech v clusteru.
Druhou možností jak v MATLABu vytvořit cyklus je konstrukce while … end tj. cyklus s podmínkou na začátku. Příkazy uvnitř cyklu jsou prováděny, pokud je podmínka splněna (true) while expression statement1; statement2; … end
Jako příklad uveďme funkci odmocnina počítající hodnotu odmocniny ze za‐ daného čísla a s požadovanou přesností ε podle rekurentního (iteračního) vztahu
x= a
⎞ 1⎛ a xi +1 = ⎜⎜ + xi ⎟⎟ x = x∞ 2 ⎝ xi ⎠
function x=odmocnina(a,eps) % výpočet odmocniny z a s požadovanou přesností eps % podle vztahu x=(a/x+x)/2 % % x=odmocnina(a,eps) % if a<0,disp('záporná hodnota'),return end x=a; % počáteční odhad výsledku e=abs(a-x*x); % počáteční chyba while e>eps % pokud je chyba větší než přesnost x=(a/x+x)/2; % upřesni odhad e=abs(a-x*x); % aktuální chyba end % opakuj
4.4.3 Další klíčová slova související s cykly S programovými konstrukcemi a funkcemi souvisí klíčová slova pro předčasné ukončení funkce a cyklu. Klíčové slovo return ukončuje funkci. Je obvykle používáno v jedné větvi programové konstrukce pro větvení if…else…end. Předčasné ukončení funkce s výpisem červeného (chybového) hlášení je též možné pomocí příkazu error(text). Klíčové slovo continue je používáno k předčasnému ukončení jedné iterace cyklu na rozdíl od klíčového slova break ukončující celý cyklus. Následující funkce zprac vypočítá pomocí volání subfunkce zpr odmocninu ze všech kladných čísel ze zadaného vektoru, nulové hodnoty ignoruje a při prv‐ ním výskytu záporné hodnoty zpracování ukončí. Je‐li zadaná matice, funkce
KŘP/IMSW Modelování ve výpočtových software
4‐15 (22) 28.8.11
František Dušek KŘP FEI Univerzita Pardubice
vrací prázdnou hodnotu. Obě uvedené funkce jsou uloženy v jednom souboru s názvem zprac.m
function v=zprac(p) % základní funkce [r,s]=size(p); % rozměry vstupního parametr i=1; % počítadlo výsledků if (r>1)&&(s>1), % p je matice disp('matice'), v=[]; return end p=p(:); % převeď vektor na sloupcový for k=1:length(p), if p(k)==0, % je-li hodnota =0 continue % jdi na další prvek elseif p(k)<0, % je/li hodnota <0 break % ukonči cykl else % jinak zpracuj v(i)=zpr(p(k)); i=i+1; % další výsledek end % konec rozhodování if end % konec cyklu for end % nepovinné označení konce funkce function x=zpr(a) % subfunkce x=sqrt(a); end % nepovinné označení konce funkce
4.5 Příklady na procvičení V kapitole 4.5.1 jsou zadání a v kapitole 4.5.2 řešení jednoduchých příkladů na problematiku prvních čtyř bloků. Předpokládá se, že při řešení příkladů má čtenář k dispozici MATLAB a aktivně využívá nápovědu k programu.
4.5.1 Zadání příkladů Př01. Vykreslení průběhu polynomu procházejícího zadanými body. Je dáno 6 bodů o souřadnicích {[‐1.1, 3.2], [‐0.9, 3.0], [‐0.2, ‐0.5], [0.4, 1.2], [1.7, 2.5], [2.1, 1.3]}. Určete polynom procházející těmito body a nakreslete graf, kde dané body jsou vykresleny jako izolované body (červený trojúhelník s vrcholem vzhůru velikosti 12 bodů) a hodnoty polynomu (ve 200 bodech) jako modrou čáru tloušťky 2 body. Měřítko grafu o 10% více než jsou mini‐ mální a maximální hodnoty hodnot na ose x a y. Př02. Vytvoření funkce vracející kořeny zadaného polynomu. Vytvořte funkci, která pro polynom zadaný jako vstupní parametr vrátí dva vektory, jeden obsahující reálné kořeny a druhý obsahující komplexní kořeny. Pokud některý typ kořenů neexistuje, je vrácen prázdný vektor. Př03. Rozšíření funkce o část umožňující zjistit počet volání funkce. Funkci z příkladu Př02 doplňte o část, která umožňuje zjistit, kolikrát byla funk‐ ce volána. Aktuální počet volání bude vracen jako třetí parametr. (návod: po‐ užijte persistentní proměnnou, je potřeba řešit počáteční hodnotu – např. tes‐ továním existence položky struktury) KŘP/IMSW Modelování ve výpočtových software
4‐16 (22) 28.8.11
František Dušek KŘP FEI Univerzita Pardubice
Př04. Vykreslení průběhu kombinace polynomů a určení polohy extrémů.
Jsou dány polynomy p1(x) = x 3‐ 5x + 1, p2(x)=‐0.1x 4+ 2x 2‐ x a p3(x)=3x3‐1. a) určete polynom p(x)= p1(x)p3(x) + p2(x) a vytvořte graf závislosti p(x) na x pro ‐2 ≤ x ≤ 2 ve 100 bodech b) v grafu z příkladu a) doplňte označení všech extrémů červeným kolečkem (návod: derivace funkce je ve svých extrémech rovna nule) c) úlohu a) a b) řešte jako funkci, kde první tři vstupní parametry jsou polyno‐ my p1, p2 a p3, čtvrtý parametr je vektor o dvou položkách (xmin, xmax) a pátý parametr je volitelný. Pokud je uveden, znamená počet bodů pro výpočet, pokud není uveden, provede se výpočet pro 100 bodů. Je‐li uveden výstupní parametr, pak se vypočtené hodnoty do něj uloží, pokud není uveden tak se vykreslí graf dle b). Výpočet souřadnic bodů, kde má polynom p(x) na zada‐ ném intervalu extrémy, řešte formou subfunkce. Př05. Vytvoření funkce pro vykreslení složitějších polynomů s využitím sub‐ funkcí a vytvoření skriptu s jednoduchou komunikací s uživatelem a kontro‐ lou zadaných dat. Vytvořte funkci, která má jeden parametr 1≤n≤5 a která vytvoří jedno okno obsahující dva grafy pod sebou. Do jednoho grafu vykreslí na intervalu ‐ 1≤x≤1 všechny Čebyševovy polynomy Tn(x) od stupně 1 do stupně n. Do dru‐ hého grafu nakreslí na intervalu ‐1≤x≤1 všechny Leganderovy polynomy Pn(x) od stupně 1 do stupně n. Uvnitř funkce vytvořte dvě subfunkce, jedna bude pro zadaný stupeň n a vektor hodnot x vracet hodnoty Čebyševova polyno‐ mu a druhá Legendrova polynomu. Funkci použijte ve skriptu, který se po spuštění zeptá na stupeň polynomu n, přečte odpověď, kterou převede na celé číslo a zkontroluje, zda je zadaná hodnota v povoleném intervalu 1≤n≤5. V případě, že je zadaná hodnota mimo povolený rozsah, provede dotaz a kontrolu znova. Čebyševův polynom (prvního druhu) stupně n je dán vztahem
Tn ( x) =
[
] [
]
n n 1⎧ ⎫ 2 2 ⎨ x + x −1 + x − x −1 ⎬ 2⎩ ⎭
Legendrovy polynomy prvního až pátého stupně jsou popsány vztahy
P1 ( x) = x P4 ( x) =
1 8
P2 ( x) =
(35 x
4
1 2
(3x
2
− 30 x 2 + 3
)
−1
)
KŘP/IMSW Modelování ve výpočtových software
P3 ( x) =
1 2
P5 ( x) =
1 8
(5x − 3x ) (63x − 70 x 3
5
4‐17 (22) 28.8.11
3
+ 15 x
)
František Dušek KŘP FEI Univerzita Pardubice
4.5.2 Řešení příkladů Př01. Vykreslení průběhu polynomu procházejícího zadanými body. Má‐li polynom procházet 6 body, musí být právě pátého stupně >> x=[-1.1 -0.9 -0.2 0.4 1.7 2.1]; >> y=[3.2 3.0 -0.5 1.2 2.5 1.3]; >> p=polyfit(x,y,5) p = 1.2963 -3.3235 -2.5411 7.5626 1.7359 -0.4699 >> xx=linspace(min(x),max(x),200); >> yy=polyval(p,xx); >> hl=plot(x,y,'r^',xx,yy,'b-'); >> set(hl(1),'MarkerSize',12) >> set(hl(2),'LineWidth',2) >> axis([1.1*min(x),1.1*max(x),… 1.1*min(yy),1.1*max(yy)]) >> grid >> legend('body','polynom')
body polynom
4.5 4 3.5 3 2.5 2 1.5 1 0.5 0 -0.5 -1
-0.5
0
0.5
1
1.5
2
Př02. Vytvoření funkce vracející kořeny zadaného polynomu. koreny.m ==================================================== function [r,k]=koreny(p) % výpočet kořenů polynomu kor=roots(p); % všechny kořeny nkor=length(kor); % počet kořenů r=[]; nr=0; % reálné kořeny k=[]; nk=0; % komplexní kořeny for n=1:nkor, % přes všechny kořeny if isreal(kor(n)), % je-li reálný nr=nr+1; % povyš počítadlo r(nr)=kor(n); % ulož do výsledků else % je-li komplexní nk=nk+1; % povyš počítadlo k(nk)=kor(n); % ulož do výsledků end % konec if end % konec for =================================================== koreny.m
Příklad použití >> p=[1 2 -3 4 5]; >> [r,k]=koreny(p) r = -3.1825 k = 0.9556 + 1.1148i
-0.7287 0.9556 - 1.1148i
Př03. Rozšíření funkce o část umožňující zjistit počet volání funkce. function [r,k,poc]=koreny(p) % výpočet kořenů polynomu persistent per % kontrola, zda existuje položka s názvem 'Counter' if ~isfield(per,'Counter'), per.Counter=0; % pokud ne, první volání, inicializace end per.Counter=per.Counter+1; poc=per.Counter;
… KŘP/IMSW Modelování ve výpočtových software
4‐18 (22) 28.8.11
František Dušek KŘP FEI Univerzita Pardubice
Př04. Vykreslení průběhu kombinace polynomů a určení polohy extrémů. >> p1=[1 0 -5 1]; >> p2=[-0.1 0 2 -1 0]; >> p3=[3 0 0 -1];
řešení bodu a >> px >> >> >> >> >>
px=conv(p1,p3) = 3 0 -15 2 0 5 -1 p=px+[0,0,p2]; x=linspace(-2,2,100); y=polyval(p,x); plot(x,y,'LineWidth',2) grid
10
0
-10
-20
řešení bodu b
-30
>> pd=polyder(p); >> kd=roots(pd) kd = -1.8719 1.7465 0.5167 -0.1956 + 0.3054i -0.1956 - 0.3054i % pouze reálné kořeny >> xe=kd(1:3); >> ye=polyval(p,xe); >> hold on >> h=plot(xe,ye,'ro'); >> set(h,'MarkerFaceColor','red')
-40
-50
-60
-70
-80 -2
-1.5
-1
-0.5
0
0.5
1
1.5
2
řešení bodu c (obě funkce jsou uloženy v souboru SoucPol.m) SoucPol.m =================================================== function yy=SoucPol(p1,p2,p3,xr,N) % výpočet polynomu yy(x)=p1*p3+p2, případně vykreslení % průběhu na zadaném rozsahu včetně označení poloh extrémů % kontrola na nutný počet vstupních parametrů if nargin<4, % výpis textu a ukončení funkce error('málo vstupních parametrů'); end px=conv(p1,p3); % součin polynomů nx=length(px); % stupeň px n2=length(p2); % stupeň p2 z=zeros(1,abs(nx-n2)); % vektor doplňujících nul % součet polynomů (vektory musí mít stejnou délku) if nx==n2, p=px+p2; elseif nx>n2, p=px+[z,p2]; else p=[z,px]+p2; end % kontrola na volitelný vstupní parametr if nargin==4, N=100; end x=linspace(xr(1),xr(2),N); y=polyval(p,x); % průběh polynomu % kontrola na volitelný výstupní parametr if nargout==0, % není-li výstupní parametr [xe,ye]=ext(p,xr); % výpočet polohy extrémů h=plot(x,y,'b',xe,ye,'ro'); grid set(h(1),'LineWidth',2) set(h(2),'MarkerFaceColor','red') else y=yy; % numerický výsledek end end % nepovinný konec funkce SoucPol
KŘP/IMSW Modelování ve výpočtových software
4‐19 (22) 28.8.11
František Dušek KŘP FEI Univerzita Pardubice
function [x,y]=ext(pol,roz) % výpočet souřadnic extrémů polynomu v daném rozsahu pd=polyder(pol); % derivace polynomu je polynom kd=roots(pd); % kořeny derivovaného polynomu % reálné kořeny = x-ové souřadnice extrémů rk=[]; irk=0; % vektor a počet reálných kořenů for k=1:length(kd), if ~isreal(kd(k)), % je-li komplexní kořen continue % pak další krok cyklu else % je-li reálný kořen irk=irk+1; % povyš počítadlo rk(irk)=kd(k); % a ulož do vektoru end end rk=sort(rk); % seřáď podle velikosti % výběr pouze hodnot rk z rozsahu xr % vektor indexů vyhovujících hodnot k=(rk>=roz(1))&(rk<=roz(2)); x=rk(k); % x-ové souřadnice extrémů y=polyval(pol,x); % y-ové souřadnice extrémů end % nepovinný konec funkce ext =================================================== SoucPol.m
Př05. Vytvoření funkce pro vykreslení složitějších polynomů s využitím sub‐ funkcí a vytvoření skriptu s jednoduchou komunikací s uživatelem a kontro‐ lou zadaných dat. Polynomy.m ================================================== function Polynomy(n) % vykteslení Čebyševových a Legendrových polynomů do stupně n x=-1:0.01:1; x=x'; % první graf subplot(2,1,1) yc=zeros(length(x),n); % pro hodnoty polynomů lc={}; % pro legendu for s=1:n, yc(:,s)=Cebysev(x,s); lc{s}=sprintf('T_%1d(x)',s); end plot(x,yc,'LineWidth',2) grid legend(lc,'Location','SouthEast','Orientation','horizont'); h=title('Cebysevovy polynomy T_n(x)'); set(h,'FontSize',14,'FontWeight','bold') % druhý graf subplot(2,1,2) yl=zeros(length(x),n); % pro hodnoty polynomů ll={}; % pro legendu for s=1:n, yl(:,s)=Legendre(x,s); ll{s}=sprintf('P_%1d(x)',s); end plot(x,yl,'LineWidth',2) grid legend(ll,'Location','SouthEast','Orientation','horizont'); h=title('Legendrovy polynomy P_n(x)'); set(h,'FontSize',14,'FontWeight','bold') end function Tn=Cebysev(x,n) % výpočet Čebyševova polynomu stupně n pro hodnoty x
KŘP/IMSW Modelování ve výpočtových software
4‐20 (22) 28.8.11
František Dušek KŘP FEI Univerzita Pardubice
Tn=((x+sqrt(x.^2-1)).^n+(x-sqrt(x.^2-1)).^n)/2; end function Pn=Legendre(x,n) % výpočet Legendrova polynomu stupně n pro hodnoty x switch n case 1 p=[1 0]; % P1 case 2 p=[3 0 -1]/2; % P2 case 3 p=[5 0 -3 0]/2; % P3 case 4 p=[35 0 -30 0 3]/8; % P4 case 5 p=[63 0 -70 0 15 0]/8; % P5 otherwise p=1; end Pn=polyval(p,x); end ================================================== Polynomy.m
Skript pro volání funkce s kontrolou n=0; while (n<1)||(n>5) disp('Volba stupně polynomů') n=input('Zadej stupeň polynomů 1<=n<=5: '); n=fix(n); % pouze celé číslo end Polynomy(n)
výsledný graf pro n=5 Cebysevovy polynomy T (x) n
1 0.5
0 -0.5 T1(x) -1 -1
-0.8
-0.6
-0.4
-0.2
T2(x) 0
T3(x) 0.2
0.4
T4(x) 0.6
T5(x) 0.8
1
Legendrovy polynomy P (x) n
1 0.5
0 -0.5 P1(x) -1 -1
-0.8
-0.6
-0.4
-0.2
KŘP/IMSW Modelování ve výpočtových software
P2(x) 0
P3(x) 0.2
0.4
4‐21 (22) 28.8.11
P4(x) 0.6
P5(x) 0.8
1
František Dušek KŘP FEI Univerzita Pardubice
Pojmy k zapamatování Okruhy problémů: kořeny polynomu, násobení a dělení polynomů, apro‐ ximace daných bodů polynomem, skript, funkce, subfunkce, zahnízděné funkce, programové konstrukce, rozhodování a cykly Použité nástroje:
Příkazy a funkce: deconv, for … end, function, global, if … else … end, persistent, poly, polyder, polyfit, polyint, polyval, return, residue, roots, switch … case … end, try … catch … end, while … end
Otázky na procvičení 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Co můžeme říci obecně o kořenech polynomu s reálnými koeficienty (po‐ čet kořenů, vlastnost komplexních kořenů)? Jaká konvence platí pro zápis polynomu ve formě vektoru? Jak se provede násobení polynomů? Jaký je rozdíl mezi aproximací a interpolací? Čím se liší podmíněný příkaz (if…end) MATLABu od obdobných příkazů v jiných programovacích jazycích? Čím se liší globální proměnné MATLABu od globálních proměnných v ji‐ ných programovacích jazycích? Jakou vlastnost má proměnná vytvořená pomocí klíčového slova persistent? Jak vytvořím nápovědu k uživatelské funkci, kterou využívá standardní příkaz help? Jaký význam mají předefinované proměnné nargin a nargout? Vysvětlete, proč trvá postupné plnění matice v cyklu déle v případě, že příslušná matice není předem vytvořena? Jaký je rozdíl mezi použitím klíčového slova continue a break v těle cyk‐ lu?
Odkazy a další studijní prameny •
•
on‐line dokumentace k programu nebo www.mathworks.com/help/ – části „Polynomials“, „Functions and scripts“, „Nested Functions“, „Con‐ trol Flow“ elektronická učebnice Learning MATLAB 7– www.mathworks.com/academia/student_version/learnmatlab_sp3.pdf (část „Flow Control“, „Scripts and Functions“)
KŘP/IMSW Modelování ve výpočtových software
4‐22 (22) 28.8.11
František Dušek KŘP FEI Univerzita Pardubice
5 Tvorba grafického rozhranní v MATLABu Studijní cíl Tento blok je věnován základům tvorby grafického rozhranní jako sou‐ část aplikací vytvořených v programovém prostředí MATLAB. Program s gra‐ fickým rozhranním velmi zjednodušuje používání hotové aplikace uživatelům, kteří nemají zkušenosti s používáním MATLABu. Uživatelské grafické rozhraní (Graphical User Interface GUI) je velmi užitečné v případě tvorby samostatně spustitelných aplikací (standalone applications), které je možné dále distribu‐ ovat za stejných podmínek, jaké jsou stanoveny pro licenci na MATLAB Compi‐ ler, pomocí kterého byla vytvořena.
Doba nutná k nastudování
2 ‐ 3 hodiny
Průvodce studiem Při studiu tohoto bloku se předpokládá, že čtenář je obeznámen se složitějšími datovými typy MATLABu (struktura, pole buněk, objekt), se základy objektové‐ ho programování a s používáním standardních grafických prvků (Push Button, Check Box, Slider, Edit, Static Text, Axes atd.). Jsou ukázány (kapitola 5.1) prin‐ cipy tvorby grafického uživatelského rozhranní a na jednoduchém příkladě dva způsoby jeho vytvoření – pomocí nástroje GUIDE (kapitola 5.2.1) a pouze pro‐ gramově (kapitola 5.2.2). Na závěr (kapitola 5.3) je uveden příklad vytvoření GUI pomocí nástroje pro složitější úlohu. V textu jsou použity následující typografické konvence: Calibri 11, Bold, Italic Courier Courier Courier Courier Courier Courier Courier Courier Courier
New New New New New New New New New
10, Bold 10, Bold 10 10 10, Italic
9 9 9 9
nové pojmy k zapamatování názvy nástrojů MATLABu upřesnění nápovědy (help téma) názvy příkazů, funkcí a objektů označení části příkazu, která se může vynechat názvy proměnných použitých v programu výpis programu – standardní text výpis programu – klíčová slova výpis programu – řetězec výpis programu – komentář
5.1 Tvorba grafického rozhranní v MATLABu Programové prostředí MATLAB dovoluje vytvořit (bez potřeby dodatečných toolboxů) grafické rozhranní k uživatelskému programu. Je možné vytvořit samostatné okno se standardními prvky, jejichž vlastnosti je možné programo‐ vě měnit a události (pohyb myši a použití jejich tlačítek, stisk klávesy) těchto objektů spojit s vlastní programovou obsluhou. Obsluha události (funkce) se v terminologii MATLABu nazývá callback function. Výsledný program
KŘP/IMSW Modelování ve výpočtových software
5‐1 (13) 5.7.11
František Dušek KŘP FEI Univerzita Pardubice
s grafickým rozhranním je tvořen jedním či dvěma soubory stejného jména 1 . Základní soubor s příponou .m (existuje vždy) obsahuje vlastní program (sadu funkcí obsluhujících jednotlivé události). V inicializační (základní) funkci tohoto souboru může být vytvořeno celé grafické rozhranní programově. Druhý sou‐ bor s příponou .fig bude přítomen pouze v případě, že jsme grafické rozhranní vytvořili samostatně pomocí nástroje GUIDE. Tento soubor obsahuje popis grafického rozhranní (vlastnosti okna, použité grafické objekty jejich rozmístění a výchozí vlastnosti). Při použití nástroje GUIDE se kromě souboru s příponou .fig vygeneruje automaticky i základní soubor s inicializační funkcí a hlavičky callback funkcí použitých ovládacích prvků.
Základní soubor s příponou .m má předepsanou strukturu. Formálně je to sou‐ bor obsahující několik funkcí. První (povinná) funkce 2 je inicializační (základní) funkce. Obsahuje buď programové vytvoření okna (funkce figure) a definice grafických prvků (funkce uicontrol) nebo přípravu parametrů a volání funkce gui_mainfcn (v případě vytvoření pomocí GUIDE). Funkce gui_mainfcn zajistí vytvoření okna (s využitím definic připravených v souboru .fig) a zajistí volání uživatelem definovaných obsluh událostí při jejich výskytu. Funkce ob‐ sluhy událostí a případné další funkce jsou v obou případech uvedeny dále v základním souboru za inicializační funkcí (subfunction).
5.2 Princip tvorby programu s GUI Na následujících dvou jednoduchých příkladech programů MATLABu s grafickým rozhranním budou demonstrovány základní principy tvorby pro‐ gramů oběma způsoby. Činnost obou programů je stejná. Po spuštění se vytvo‐ ří okno s tlačítkem Konec, jehož stisknutí ukončí program. První příklad (soubo‐ ry Prikl01a.fig a Prikl01a.m) je vytvořen pomocí nástroje GUIDE, v druhém pří‐ kladě (Prikl01b.m) je grafické rozhranní vytvořeno programově.
5.2.1 Tvorba GUI pomocí GUIDE Pomocí příkazu guide zapsaného do příkazového řádku MATLABu se spustí interaktivní nástroj umožňující návrh grafické části programu (viz Obrázek 5‐1). Vzhled okna nástroje GUIDE s vytvořeným návrhem je zobrazen na Obrázku 5‐2. Programový kód (viz Výpis programu 5‐1) je vygenerován automaticky včetně anglických komentářů (pro zkrácení výpisu jsou v tomto textu komentáře vět‐ šinou odstraněny). Inicializační funkce Prikl01a je jednou volána bez vstup‐ ního parametru při spuštění (uživatelem) a opakovaně s jedním vstupním pa‐ rametrem při vzniku každé událostí okna (automaticky). V inicializační funkci je vytvořena / aktualizována datová struktura (gui_State) s šesti položkami. Tato struktura a hodnota vstupního parametru inicializační funkce (může být prázdný) jsou předány funkci MATLABu gui_mainfcn. Forma volání se liší
1
Podle potřeby mohou být součástí aplikace i další funkce v samostatných souborech
2
Pouze tuto funkci je možné volat standardním způsobem. Její název by měl být shodný se jmé‐ nem souboru.
KŘP/IMSW Modelování ve výpočtových software
5‐2 (13) 5.7.11
František Dušek KŘP FEI Univerzita Pardubice
podle toho, zda byla inicializační funkce volána s výstupními parametry (řádek 13) či nikoliv (řádek 15).
Obrázek 5‐1 Návrhové prostředí GUIDE
Položky datové struktury gui_State jsou naplněny názvem funkce (řádek 03 – použita předdefinovaná konstanta mfilename obsahující řetězec s názvem vykonávané funkce), příznakem používat pouze jedno okno (singleton) i při opa‐ kovaném volání funkce (řádek 04) a re‐ ferencemi (function handle) na funkce, které jsou volané při události spuštění / ukončení (řádek 05 / 06) programu. Po‐ ložka struktury .gui_Callback se ak‐ tualizuje podle hodnoty vstupního pa‐ rametru předávaného při voláních funk‐ Obrázek 5‐2 Vzhled programu Prikl01a ce po vzniku událostí. Vstupní parametr varargin inicializační funkce je dato‐ vého typu pole buněk (cell array) kde první prvek obsahuje název události (da‐ tový typ řetězec), který se převede (str2func) na referenci / ukazatel (functi‐ on handle) na funkci obsluhující tuto událost (řádky 09‐11). V programu je do‐ plněna obsluha pouze jedné události – stisknutí tlačítka (funkce pushbutton1_Callback). Funkce obsluhy událostí mají standardně tři parametry. První parametr hObject je reference (handle) na objekt, v rámci kterého událost vznikla. Druhý parametr eventData je rezervován pro budoucí použití. Třetí parametr handles je struktura obsahující reference (handle) grafických objektů okna a případně uživatelská data. Pomocí tohoto parametru se v obsluze stisku tlačít‐ ka zjistí handle okna programu. Handle okna se použije jako argument funkce close, která uzavře dané okno a tím ukončí program.
KŘP/IMSW Modelování ve výpočtových software
5‐3 (13) 5.7.11
František Dušek KŘP FEI Univerzita Pardubice
Výpis programu 5‐1 Tvorba GUI pomocí GUIDE Prikl01a.m ====================================================== 01 function varargout = Prikl01a(varargin) % PRIKL01A M-file for Prikl01a.fig % Begin initialization code - DO NOT EDIT 02 gui_Singleton = 1; 03 gui_State = struct('gui_Name', mfilename, ... 04 'gui_Singleton', gui_Singleton, 05 'gui_OpeningFcn', @Prikl01a_OpeningFcn, 06 'gui_OutputFcn', @Prikl01a_OutputFcn, 07 'gui_LayoutFcn', [] , ... 08 'gui_Callback', []); 09 if nargin && ischar(varargin{1}) 10 gui_State.gui_Callback = str2func(varargin{1}); 11 end 12 if nargout 13 [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); 14 else 15 gui_mainfcn(gui_State, varargin{:}); 16 end % End initialization code - DO NOT EDIT % --- Executes just before Prikl01a is made visible. 17 function Prikl01a_OpeningFcn(hObject, eventdata, handles, varargin) % Choose default command line output for Prikl01a 18 handles.output = hObject; % Update handles structure 19 guidata(hObject, handles); % --- Outputs from this function are returned to the % command line. 20 function varargout = Prikl01a_OutputFcn(hObject, eventdata, handles) % Get default command line output from handles % structure 21 varargout{1} = handles.output; % --- Executes on button press in pushbutton1. 22 function pushbutton1_Callback(hObject, eventdata, handles) 23 close(handles.figure1); ====================================================== Prikl01a.m
5.2.2 Programová tvorba GUI Druhá varianta programu – pouze s programovým vytvořením grafického roz‐ hranní – je uvedena na konci kapitoly (viz Výpis programu 5‐2). V tomto případě je nutné v inicializační funkci vytvořit všechny grafické objekty včetně vlastního okna. Okno je vytvořeno příkazem figure a jeho poloha příkazem movegui. Takto vytvořené okno však není ekvivalentní oknu z předchozího příkladu, ob‐ sahuje navíc řádek se standardním menu všech oken MATLABu (viz Obrázek 5‐3). Dalším principiálním rozdílem je, kromě již zmiňované nutnosti explicitní tvor‐ by grafických objektů (příkaz uicontrol), způsob předávání dat mezi jednotli‐ vými funkcemi a způsob spojení funkcí obsluh událostí s příslušnými událostmi (vlastnost Callback příslušného objektu).
KŘP/IMSW Modelování ve výpočtových software
5‐4 (13) 5.7.11
František Dušek KŘP FEI Univerzita Pardubice
V případě použití GUIDE je vše určeno konvencemi vyplýva‐ jícími z použití funkce gui_mainfcn. Data i iden‐ tifikace aktuální události se předávají pomocí parametrů funkcí. Data pomocí parametrů funkce obsluhy události, iden‐ tifikace aktuální události pomo‐ cí parametru inicializační funk‐ ce.
V případě programovém řešení jsou handle funkcí obsluhujících jednotlivé události zapsány přímo do vlastností odpovídajícího objektu a call‐ back funkce mají jen dva parametry (hObject, eventdata). Způsob předá‐ vání dat není stanoven. Je věcí programátora, jak předání dat vyřeší. V příkladě Prikl01b je použito jednoduché řešení – hnízdění funkcí 3 (nested function). V obsluze události (callback) stisku tlačítka (funkce konecbutton_Callback) je potřeba handle okna (proměnná f), který je však vytvořen v inicializační funkci. Protože je však tato callback funkce zahnízděná do základní funkce, je proměnná f globální (tj. viditelná) i v této funkci. Další možností by bylo využít první parametr hObject callback funkce, který obsahuje handle objektu, v rámci kterého událost vznikla. Vlastnost objektů Parent obsahuje handle rodičovského (Parent) objektu – v našem případě okna programu (objekt figure). Příslušný příkaz pro získání handle rodičovského objektu by mohl být např. Obrázek 5‐3 Vzhled programu Prikl01b
f = get(hObject,'Parent');
Druhý parametr eventdata je buď prázdný, nebo obsahuje strukturu s dalšími daty, pokud objekt, v rámci kterého událost vznikla, tato data generuje. Výpis programu 5‐2 Programová tvorba GUI Prikl01b.m ===================================================== 01 function Prikl01b % Příklad programového vytvoření GUI % Vytvoř okno na zadané pozici, které není viditelné 02 f = figure('Visible','off','Position', [360,500,450,285]); % Vytvoř tlačítko, s textem, na pozici, handle % funkce při stisku, v b je handle funkce 03 b = uicontrol('Style','pushbutton','String',... 04 'Konec','Position', [200,150,70,25],... 05 'Callback',@konecbutton_Callback); % Inicializace GUI. % nastav text do záhlaví okna
3
Hnízdění funkcí – definuje se funkce uvnitř jiné funkce. Všechny proměnné vnější funkce jsou globální vzhledem k zahnízděné funkci. Zahnízděnou funkci lze standardně volat pouze z vnější funkce. V uvedeném příkladu je volána prostřednictvím handle (callback funkce) v kontextu vnější funkce.
KŘP/IMSW Modelování ve výpočtových software
5‐5 (13) 5.7.11
František Dušek KŘP FEI Univerzita Pardubice
06 set(f,'Name','Prikl01b'); % nastav okno doprostřed obrazovky 07 movegui(f,'center'); % učiň okno viditelným 08 set(f,'Visible','on'); % Obsluha událostí (callback). Tato funkce má přístup k % proměnným v hlavní funkce - jde o hnízděnou (nested) funkci 09 function konecbutton_Callback(hObject, eventdata) 10 close(f); % zavři okno programu 11 end 12 end % konec základní funkce ===================================================== Prikl01b.m
5.3 Složitější příklad Tento příklad popisuje vytvoření grafického rozhranní k aplikaci počítající pa‐ rametry polynomiální aproximace maximálně 5. stupně funkce jedné proměn‐ né y=f(x), která je určena dvojicemi hodnot xi,yi uložených v textovém souboru. Stupeň aproximačního polynomu a název souboru s daty jsou volitelné. Kromě výpočtu parametrů polynomu je požadováno vykreslení původních dat ve for‐ mě izolovaných bodů a výsledné aproximace ve formě spojité křivky v zadaném počtu bodů. Měřítko kreslicí oblasti se má přizpůsobit načteným hodnotám.
5.3.1 Návrh vzhledu okna Po zadání příkazu quide se spustí průvodce GUIDE, který podle volby uživatele vytvoří oba soubory (Prikl02.m a Prikl02.fig) a přejde do návrhového režimu (viz Obrázek 5‐1). V návrhovém režimu se přetažením ovládacích a zobrazovacích prvků do pracovní oblasti vytvoří vizuální vzhled okna (grafického rozhranní) výsledné aplikace. Ukázka vzhledu vytvořeného grafického rozhranní aplikace v návrhovém prostředí je na Obrázku 5‐4.
Obrázek 5‐4 Návrhové okno s rozmístěním grafických objektů
KŘP/IMSW Modelování ve výpočtových software
5‐6 (13) 5.7.11
František Dušek KŘP FEI Univerzita Pardubice
Pro usnadnění orientace a identifikace jednotlivých prvků jsou v obrázku dopl‐ něna čísla označující umístění (pozici) jednotlivých prvků. Tabulka 1 uvádí se‐ znam všech 35 použitých grafických objektů s uvedením umístění objektu v okně (číslo v kolečku na Obrázku 5‐4), typu objektu (vlastnost Style), jedno‐ značného identifikátoru objektu (vlastnost Tag) a významu objektu v programu.
Tabulka 1 Seznam použitých objektů
Pozice Objekt (Style)
Identifikátor Význam (Tag)
1 16 4
uipanel1 uipanel2
20 3 30 31 35 10 11 12 13 14 15 24 25 26 32 33 34 2 5 6 7 8 9 17 18 19 21 22 23 32 33 34
Panel Push Button
Edit Axes
Static Text
Static Text
objekt sdružující další objekty související s daty objekt sdružující další objekty související s výpočtem pushbutton1 tlačítko pro načtení a zpracování dat funkce pushbutton1_Callback pushbutton2 tlačítko pro výpočet aproximačního polynomu funkce pushbutton2_Callback edit1 editační pole pro zadání názvu souboru s daty edit2 editační pole pro zadání stupně aproximačního polynomu edit3 editační pole pro zadání počtu bodů vykreslení aproximace axes1 oblast grafu pro vykreslení průběhů text2 „Soubor nenačten“ info o výsledku načtení dat text8 „123.456“ aktualizovaný počet dat v souboru text9 „123.456“ aktualizovaná minimální hodnota X text10 „123.456“ aktualizovaná maximální hodnota X text11 „123.456“ aktualizovaná minimální hodnota Y text12 „123.456“ aktualizovaná maximální hodnota Y text20 „123.456“ vypočtená hodnota parametru a0 apr. pol. text21 „123.456“ vypočtená hodnota parametru a1 apr. pol. text22 „123.456“ vypočtená hodnota parametru a2 apr. pol. text26 „123.456“ vypočtená hodnota parametru a3 apr. pol. text27 „123.456“ vypočtená hodnota parametru a4 apr. pol. text28 „123.456“ vypočtená hodnota parametru a5 apr. pol. text1 „Název souboru s daty“ význam vedlejšího pole text3 „Počet dat“ význam vedlejšího pole text4 „Min. hodnota X“ význam vedlejšího pole text5 „Max. hodnota X“ význam vedlejšího pole text6 „Min. hodnota Y“ význam vedlejšího pole text7 „Max. hodnota Y“ význam vedlejšího pole text14 „Stupeň aproximačního polynomu (<=5)“ význam vedlejší‐ ho pole text15 „Počet bodů vykreslení aproximace“ význam vedlejšího pole text16 „y(x)=a0+a1*x+a2*x^2+a3*x^3+a4*x^4+a5*x^5“ význam parametrů apr. pol. text17 „a0“ význam vedlejšího pole text18 „a1“ význam vedlejšího pole text19 „a2“ význam vedlejšího pole text23 „a3“ význam vedlejšího pole text24 „a4“ význam vedlejšího pole text25 „a5“ význam vedlejšího pole
Vlastnosti jednotlivých prvků či společné vlastnosti vybrané skupiny prvků se upravují pomocí nástroje Property Inspector. Jeho použití je ukázáno na Obrázku 5‐6, kde je vidět seznam názvů a aktuálních hodnot vlastností objektu KŘP/IMSW Modelování ve výpočtových software
5‐7 (13) 5.7.11
František Dušek KŘP FEI Univerzita Pardubice
PushButton. Seznam všech v návrhu použitých objektů je k dispozici v nástroji Object Browser (Obrázek 5‐7).
Obrázek 5‐5 Property Inspector
Obrázek 5‐6 Object Browser
5.3.2 Vytvoření programu aplikace Při použití nástroje GUIDE se vytvoří kostra programu v souboru .m včetně hlaviček všech callback funkcí obsluhujících události spojené s oknem a použi‐ tými objekty. Události můžeme rozdělit do tří skupin. První skupina jsou udá‐ losti spojené s existencí okna tj. callback funkce obsluhující tyto události se vytváří automaticky s kostrou programu. Příkladem budiž události otevření a ukončení okna aplikace, při jejichž výskytu jsou volané callback funkce _OpenningFcn() a _OutputFcn (viz řádky 12 a 27 ve výpisu Prikl02.m). Funkce _OpenningFcn() (událost otevření okna) je vyvolána až po vyvolání všech funkcí _CreateFcn() (událostí vytvoření objektu). KŘP/IMSW Modelování ve výpočtových software
5‐8 (13) 5.7.11
František Dušek KŘP FEI Univerzita Pardubice
Druhá skupina jsou událostí spojené s existencí objektu v návrhu tj. jejich ob‐ sluha (callback funkce) se vytvoří při vložení objektu do návrhového okna. Pří‐ kladem budiž objekt EditBox. Po jeho vložení se vytvoří dvě callback funkce (viz např. řádky 54 a 63 ve výpisu Prikl02.m). První – _CreateFcn() – je vola‐ ná při vytvoření prvku a druhá – _Callback – je volána při změně textu (vlastnost String). První funkce umožňuje např. v případě, že jde o zadávané číslo zajistit, jaká je při návrhu zadaná počáteční textová hodnota a provést konverzi na odpovídající číselnou hodnotu v příslušné proměnné. Druhá funkce umožňuje aktualizovat číselnou hodnotu odpovídající proměnné v okamžiku dokončení editace textového řetězce.
Třetí skupina jsou události, které se obsluhují až na vyžádání uživatele. Typic‐ kým příkladem je objekt PushButton, kde je možné zvolit callback pro několik událostí. Na řádku 29 je obsluha nejběžnější události – _CallBack(), která nastane při uvolnění stisknutého tlačítka. Další callback funkcí, která se vytváří až na požádání, je obsluha události vytvoření objektu – _CreateFcn(). Udá‐ lost vytvoření (a zrušení objektu s odpovídající callback funkcí _DeleteFcn()) je generována pro každý objekt okna ale pouze pro objekt EditBox je auto‐ maticky vytvářena callback funkce _CreateFcn(). Následuje výpis programové části aplikace, ze které byly odstraněny automa‐ ticky vkládané komentáře pro zkrácení výpisu. Tento kód je z větší části vytvo‐ řen automaticky. Doplněny jsou příkazy callback funkcí. Informace mezi jednot‐ livými funkcemi jsou předávány pomocí položek parametru (struktury) handles. Jsou využívány jednak automaticky přidávané položky (handle jednot‐ livých objektů) a jednak uživatelská položka (struktura) User obsahující všechna uživatelská data. Pokud se uvnitř funkce změní data v parametru (struktuře) handles, je potřeba zajistit aktualizaci voláním systémové funkce guidata(). Více viz help guidata. Výpis programu 5‐3 Tvorba GUI pomocí GUIDE složitější příklad Prikl02.m ======================================================= 001 function varargout = Prikl02(varargin) % PRIKL02 M-file for Prikl02.fig % Begin initialization code - DO NOT EDIT 002 gui_Singleton = 1; 003 gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @Prikl02_OpeningFcn, ... 'gui_OutputFcn', @Prikl02_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); 004 if nargin && ischar(varargin{1}) 005 gui_State.gui_Callback = str2func(varargin{1}); 006 end 007 if nargout 008 [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); 009 else 010 gui_mainfcn(gui_State, varargin{:}); 011 end % End initialization code - DO NOT EDIT
KŘP/IMSW Modelování ve výpočtových software
5‐9 (13) 5.7.11
František Dušek KŘP FEI Univerzita Pardubice
% --- Executes just before Prikl02 is made visible. 012 function Prikl02_OpeningFcn(hObject, eventdata, handles, varargin) % Choose default command line output for Prikl02 013 handles.output = hObject; % Vytvoření uživatelské struktury s potřebnými položkami a daty 014 n=str2double(get(handles.edit2,'String')); % stupeň polynomu 015 x.PN=n; % stupeň polynomu (aktualizuje edit2) 016 x.Pk=zeros(1,n+1); % vektor koef. Pol. (pushbutton2_Callback) 017 n=str2double(get(handles.edit3,'String')); 018 x.Px=n; % počet bodů aproximačního průběhu (akt. edit3) 019 x.Dn=2; % počet hodnot v souboru (pushbutton1_Callback) 020 x.DX=[0;10]; % vektor hodnot X (pushbutton1_Callback) 021 x.DY=[-1;1]; % vektor hodnot Y (akt. pushbutton1_Callback) 022 x.Dr=[0,10,-1,1]; % vek Xmin,Xmax,Ymin,Ymax 023 handles.User=x; % přidej položku User % Aktualizace hodnot v okně podle nastavených hodnot parametrů 024 AktVypPar(handles); % aktualizace výpisu parametrů aproximace 025 AktVypDat(handles); % akt. výpisu parametrů načtených dat 026 guidata(hObject, handles); % Update handles structure
% --- Outputs are returned to the command line. 027 function varargout = Prikl02_OutputFcn(hObject, eventdata, handles) % Get default command line output from handles structure 028 varargout{1} = handles.output; % --- Executes on button press in pushbutton1. 029 function pushbutton1_Callback(hObject, eventdata, handles) % načtení dat ze souboru s kontrolou 030 nazev=get(handles.edit1,'String'); % název souboru 031 try % kontrola načtení dat 032 data=load(nazev); % zkus načíst soubor 033 catch ME % je-li chyba 034 set(handles.text2,'String','Chyba viz okno MATLABu'); 035 disp(ME.message); % výpis do rádku okna MATLABu 036 return % konec obsluhy při chybě 037 end 038 [r,s]=size(data); % rozměry načtené matice 039 if s~=2, % nejsou-li dva sloupce 040 set(handles.text2,'String','Soubor nenačten viz MATLAB'); 041 disp('Musí být dva sloupce dat'); 042 return % konec obsluhy při chybě 043 else 044 x=handles.User; % uživatelská data 045 x.Dn=r; % počet dat 046 x.DX=data(:,1); x.DY=data(:,2); % vektor X a Y 047 x.Dr(1)=min(x.DX); x.Dr(2)=max(x.DX); % min,max pro X 048 x.Dr(3)=min(x.DY); x.Dr(4)=max(x.DY); % min,max pro Y 049 handles.User=x; % aktualizace uživ. dat 050 AktVypDat(handles); % aktualizace vypisu na obrazovce 051 guidata(hObject, handles); % Update handles structure 052 set(handles.text2,'String','Soubor načten'); 053 end 054 function edit2_Callback(hObject, eventdata, handles) % kontrola na platnost hodnoty stupeň polynomu 055 n=str2double(get(hObject,'String')); % aktuální hodnota 056 if isempty(n), n=1; % není-li číslo 057 elseif n>5, n=5; % je-li větší než 5 058 elseif n<0, n=0; % je-li menší než 0 059 end
KŘP/IMSW Modelování ve výpočtových software
5‐10 (13) 5.7.11
František Dušek KŘP FEI Univerzita Pardubice
060 set(hObject,'String',num2str(n,1)); % zpětný zápis 061 handles.User.PN=n; % ulož hodnotu 062 guidata(hObject, handles); % Update handles structure
063 function edit2_CreateFcn(hObject, eventdata, handles) 064 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) 065 set(hObject,'BackgroundColor','white'); 066 end % kontrola na platnost hodnoty stupeň polynomu 067 n=str2double(get(hObject,'String')); % aktuální hodnota 068 if isempty(n), n=1; % není-li číslo 069 elseif n>5, n=5; % je-li větší než 5 070 elseif n<0, n=0; % je-li menší než 0 071 end 072 set(hObject,'String',num2str(n,1)); % zpětný zápis 073 075 076 077 078 079 080 081
function edit3_Callback(hObject, eventdata, handles) n=str2double(get(hObject,'String')); % aktuální hodnota if isempty(n), n=10; elseif n<2, n=2; end set(hObject,'String',num2str(n,4)); % zpětný zápis handles.User.Px=n; % ulož hodnotu guidata(hObject, handles); % Update handles structure
082 function edit3_CreateFcn(hObject, eventdata, handles) 083 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) 084 set(hObject,'BackgroundColor','white'); 085 end % kontrola na platnost hodnoty počet bodů vykreslení aproximace 086 n=str2double(get(hObject,'String')); % aktuální hodnota 087 if isempty(n), n=100; 088 elseif n<0, n=3; 089 end 090 set(hObject,'String',num2str(n,5)) 091 function pushbutton2_Callback(hObject, eventdata, handles) 092 x=handles.User; % uživatelská data 093 k=polyfit(x.DX,x.DY,x.PN); % koeficienty apex. polynomu 094 handles.User.Pk=k; % ulož hodnotu 095 AktVypPar(handles); % aktualizace vypisu na obrazovce % vykreslení průběhu aproximace v zadaném počtu bodů 096 XX=linspace(x.Dr(1),x.Dr(2),x.Px); 097 YY=polyval(k,XX); % hodnoty aproximace 098 plot(handles.axes1,XX,YY,'r','LineWidth',2); % nakresli 099 guidata(hObject, handles); % Update handles structure % Dvě pomocné uživatelské funkce, předává se struktura handles 100 function AktVypPar(h) % Aktualizace výpisu hodnot koeficientů aproximačního polynomu 101 x=h.User; % uživatelská data 102 if x.PN>4, set(h.text28,'String',num2str(x.Pk(6),'%8.5f')); 103 else set(h.text28,'String','--------'); end 104 if x.PN>3, set(h.text27,'String',num2str(x.Pk(5),'%8.5f')); 105 else set(h.text27,'String','--------'); end 106 if x.PN>2, set(h.text26,'String',num2str(x.Pk(4),'%8.5f')); 107 else set(h.text26,'String','--------'); end 108 if x.PN>1, set(h.text22,'String',num2str(x.Pk(3),'%8.5f')); 109 else set(h.text22,'String','--------'); end 110 if x.PN>0, set(h.text21,'String',num2str(x.Pk(2),'%8.5f')); 111 else set(h.text21,'String','--------'); end
KŘP/IMSW Modelování ve výpočtových software
5‐11 (13) 5.7.11
František Dušek KŘP FEI Univerzita Pardubice
112 set(h.text20,'String',num2str(x.Pk(1),'%8.5f')); 113 return 114 function AktVypDat(h) % Aktualizace výpisu vlastností načtených dat a jejich vykreslení 115 x=h.User; % uživatelská data 116 set(h.text8 ,'String',num2str(x.Dn,'%5d')); % počet dat 117 set(h.text9,'String',num2str(x.Dr(1),'%8.3f')); % min. X 118 set(h.text10,'String',num2str(x.Dr(2),'%8.3f')); % max. X 119 set(h.text11,'String',num2str(x.Dr(3),'%8.3f')); % min. Y 120 set(h.text12,'String',num2str(x.Dr(4),'%8.3f')); % max. Y 121 set(h.axes1,'XLim',x.Dr(1:2)); % měřítko osy X 122 set(h.axes1,'YLim',x.Dr(3:4)); % měřítko osy X 123 cla(h.axes1); % vymaž oblast 124 plot(h.axes1,x.DX,x.DY,'*b','LineWidth',2); % nakresli 125 return ===================================================== Prikl02.m
Na posledním Obrázku 5‐7 je ukázka okna (grafického rozhranní aplikace) spuštěné aplikace po načtení souboru s daty (podle zvoleného názvu s kontro‐ lou, ř.32 load), jejich vyhodnocení (určení počtu a rozsahu načtených hodnot – ř. 38 size, výpočet hodnot koeficientů polynomu zvoleného stupně – ř.93 polyfit) a vykreslení původních dat a dat vypočtených podle určeného poly‐ nomu ve zvoleném počtu bodů (ř.98 a ř.124 plot, ř.97 polyval). Určený roz‐ sah hodnot je použit pro nastavení měřítka kreslicí oblasti.
Obrázek 5‐7 Ukázka vzhledu okna spuštěného programu
KŘP/IMSW Modelování ve výpočtových software
5‐12 (13) 5.7.11
František Dušek KŘP FEI Univerzita Pardubice
Pojmy k zapamatování Okruhy problémů: tvorba GUI pomocí GUIDE, programová tvorba GUI, funkce obsluhy událostí, předávání dat mezi funkcemi, zachycení chyb, práce s grafickými objekty, použití handle funkcí Použité nástroje:
GUIDE, Object Browser, Inspektor
Příkazy a funkce: cla, close, get, guidata, guide, gui_mainfcn, figure, ischar, isempty, isequal, ispc, load, movegui, num2str, polyfit, polyval, set, str2double, str2func, try … catch … end, uicontrol
Otázky na procvičení 1. 2. 3. 4. 5.
Co znamená zkratka GUI a jaký typ uživatelského rozhranní se standardně v aplikacích MATLABu používá? V čem vidíte největší výhodu návrhu GUI pomocí nástroje GUIDE? Co označuje pojem „callback function“? Jak je řešeno spojení obsluhy událostí s událostí příslušného objektu v případě použití nástroje GUIDE a jak v případě programového řešení? Jaké jsou možnosti předávání parametrů do obsluhy událostí?
Odkazy a další studijní prameny • •
on‐line dokumentace k programu nebo www.mathworks.com/help/ – část „Creating Graphical User Interfaces“ elektronická učebnice Learning MATLAB 7– www.mathworks.com/academia/student_version/learnmatlab_sp3.pdf (část „Creating Graphical User Interfaces“)
KŘP/IMSW Modelování ve výpočtových software
5‐13 (13) 5.7.11
František Dušek KŘP FEI Univerzita Pardubice
6 Funkce funkcí, kořen funkce Studijní cíl Tento blok je prvním ze tří, ve kterých se budeme zabývat čtyřmi důležitými matematickými úlohami 1 , pro které v MATLABu existuje obecné řešení. Všech‐ na tato obecná řešení jsou ve formě funkce a vyžadují jako jeden z parametrů uživatelem vytvořenou funkci popisující konkrétní řešenou úlohu. Proto se v šestém bloku budeme nejprve zabývat způsoby jak předat funkci jako para‐ metr do další funkce. Druhá část šestého bloku je pak věnována první matema‐ tické úloze – hledání kořene funkce jedné proměnné.
Doba nutná k nastudování
1 – 1,5 hodiny
Průvodce studiem Předpokládá se, že čtenář je seznámen s prostředím MATLABu, základními příkazy, tvorbou grafů a tvorbou skriptů a funkcí v rozsahu prvních čtyř bloků. Při studiu je vhodné mít spuštěný MATLAB a jednotlivé příkazy či funkce hned vyzkoušet a případně získat podrobnější informace využíváním nápovědy k programu. Na závěr jsou uvedeny řešené příklady na procvičení. V textu jsou použity následující typografické konvence: Calibri 11, Bold, Italic nové pojmy či informace k zapamatování Calibri 11 označení klávesy Courier New 10, Bold názvy nástrojů MATLABu Courier New 10, Bold upřesnění nápovědy (help téma) Courier New 10 názvy příkazů, funkcí a objektů Courier New 10 označení části příkazu, která se může vynechat Courier New 10, Italic názvy proměnných použitých v programu Courier New 9 příkaz příkazové řádky / výpis programu Courier New 9 výpis programu – klíčová slova Courier New 9 výpis programu – řetězec Courier New 9 výpis programu – komentář
6.1 Co označujeme pojmem funkce funkcí? Všechny čtyři matematické úlohy, kterými se budeme v blocích 6‐8 zabývat mají společné to, že jejich řešení je formulováno pro obecnou 2 funkci 3 popisu‐
1
a) úloha hledání kořene funkce b) úloha výpočtu určitého integrálu (včetně výpočtu dvojného a trojného) c) úloha numerického výpočtu soustavy obyčejných diferenciálních rovnic d) úloha hledání extrému funkce více proměnných
2
Např. postup (algoritmus) numerického výpočtu určitého integrálu je stejný bez ohledu na to jaký vztah integrujeme.
KŘP/IMSW Modelování ve výpočtových software
6‐1 (11) 15.9.11
František Dušek KŘP FEI Univerzita Pardubice
jící daný typ úlohy. Pro řešení každé úlohy je v MATLABu připravena samostat‐ ná funkce. Všechny tyto řešící funkce pak mají společné to, že vyžadují jako první vstupní parametr informaci o konkrétním popisu problému (dodaném uživatelem), pro který se má daná úloha řešit. V MATLABu je požadovaný předpis realizován nějakou funkcí, což znamená, že je potřeba předat odkaz na funkci (handle funkce). Samozřejmě možnost předat odkaz na funkci jako pa‐ rametr jiné funkci je obecně využitelná a lze ji použít i ve vlastních funkcích tj. nejen v již v MATLABu existujících.
Pokud je vstupní parametr jedné (řekněme vnější) funkce odkaz na jinou (řek‐ něme vnitřní) funkci, pak musí být zajištěno, aby vnější funkce volala vnitřní funkci se správným počtem vstupních parametrů. Pokud vytváříme obě funkce sami, pak to není problém. Pokud je však vnější funkce jednou vytvořená, pak je potřeba při tvorbě vnitřní funkce vědět jaký počet vstupních parametrů (a v jakém významu) vnější funkce vyžaduje (konvence). To znamená, že při tvorbě vnitřní uživatelské funkce určené pro použití jako parametr vnější funkce mu‐ síme dodržet počet a význam parametrů vnější funkcí vyžadovaných. Protože je často potřeba dodat do vnitřní funkce ještě další parametry, existuje mecha‐ nismus jak informovat vnější funkci, aby při volání vnitřní funkce předala doda‐ tečné parametry. O možnostech jak v MATLABu předávat odkaz na funkci po‐ jednává následující kapitola.
6.2 Funkce jako parametr jiné funkce V MATLABu existují tři možností jak předat informaci o funkci, která se má použít (odkaz na funkci), jako parametr jiné funkci. Všechny tři možnosti uká‐ žeme na stejném příkladě. Máme řešit úlohu výpočet přibližné hodnoty určité‐ ho integrálu obecné spojité funkce f(x) na zadaném intervalu
lichoběžní‐ kovou metodou podle vztahu
⎡1 ⎣2
Oint = ⎢ f (a) +
N −1
⎤
∑ f (x ) + 2 f (b)⎥⎦h i =1
1
i
xi = a + i.h h =
b−a . N
kde parametr N ovlivňuje přesnost výpočtu. Řešení představuje (vnější) funkce nazvaná OInt (viz kapitola 6.2.5) se syntaxí
oi=OInt(fce,a,b,N)
kde první parametr fce je odkaz na (v době vytváření funkce OInt neznámou) vnitřní funkci. Jediné co o vnitřní funkci víme je, že pro hodnotu (jediného) vstupního parametru vrací jeden výstupní parametr tj. je ve tvaru y=fce(x).
6.2.1 Použití názvu souboru obsahujícího funkci Nejjednodušší způsob jak předat vnější funkci odkaz na vnitřní funkci je tradiční způsob – jako skutečný parametr vnější funkce je použít název souboru (řetě‐ zec) obsahujícího vnitřní funkci. Vnitřní funkce musí mít přesně předpokládaný
3
Pojem funkce v této souvislosti představuje známý předpis, který pro zadané vstupní parametry vypočítá výstupní parametr.
KŘP/IMSW Modelování ve výpočtových software
6‐2 (11) 15.9.11
František Dušek KŘP FEI Univerzita Pardubice
počet parametrů. Potom výpočet určitého integrálu z uživatelské funkce ulo‐ žené v souboru SiCo.m
SiCo.m ======================================================= function v=SiCo(t) v=sin(t)+cos(t); ========================================================SiCo.m
na intervalu 0,2π pro N=20 se provede voláním funkce OInt >> vys=OInt('SiCo',0,2*pi,20);
Tento způsob volání je možné použít i pro standardní funkce MATLABu (pokud splňují požadavky na předpokládaný počet vstupních a výstupních parametrů), např. >> vys=OInt('sin',0,2*pi,20);
6.2.2 Použití handle existující funkce Druhý způsob předání odkazu na funkci je pomocí handle (reference) funkce (function handle). Ačkoliv tento způsob vypadá velmi podobně jako předchozí, jde o podstatně univerzálnější způsob využívající možnosti objektového přístu‐ pu. Využijeme‐li tento způsob pro řešení předchozích příkladů, jsou možné následující volání >> vys=OInt(@SiCo,0,2*pi,20);
nebo >> fh=@SiCo; >> vys=OInt(fh,0,2*pi,20);
Protože je handle funkce objektem je možné získat jeho vlastnosti pomocí funkce functions(handler) >> functions(fh) ans = function: 'SiCo' type: 'simple' file: 'C:\Dokumenty\MATLAB\SiCo.m' >> functions(@sin) ans = function: 'sin' type: 'simple' file: ''
6.2.3 Použití anonymní funkce Třetí způsob předání odkazu na funkci je pomocí tzv. anonymní funkce. Jde o rozšíření volání pomocí handle funkce. Rozšíření spočívá v tom, že na místě parametru vnější funkce se definuje nová bezejmenná 4 (anonymous function) funkce včetně hlavičky, parametrů a těla funkce. Hlavička anonymní funkce je tvořena znakem @ následovaným seznamem parametrů v kulatých závorkách. Pak, za mezerou, následuje příkaz tvořící tělo funkce. Odkaz na definici ano‐ 4
Název bezejmenná (anonymní) funkce je zvolen proto, že mezi znakem @ a následujícím se‐ znamem parametrů, kde by měl být název funkce, není nic
KŘP/IMSW Modelování ve výpočtových software
6‐3 (11) 15.9.11
František Dušek KŘP FEI Univerzita Pardubice
nymní funkce je také možné uložit do proměnné a tu pak používat ve významu funkce
>> f=@(x) sin(x)+cos(x) f = @(x)sin(x)+cos(x) >> functions(f) ans = function: '@(x)sin(x)+cos(x)' type: 'anonymous' file: '' workspace: {[1x1 struct]} >> f(1) ans = 1.3818
Protože v rámci těla funkce můžeme volat další funkce je použití tohoto typu předání odkazu na funkci pro řešení předchozích příkladů přímočaré. Dále je uvedeno několik rovnocenných variant výpočtu výše uvedeného příkazu využí‐ vajících anonymní funkci >> >> >> >>
vys=OInt(@(x) SiCo(x),0,2*pi,20); vys=OInt(@(x) sin(x)+cos(x),0,2*pi,20); f=@(x) sin(x)+cos(x); vys=OInt(f,0,2*pi,20);
6.2.4 Použití anonymní funkce s rozšířeným předáváním parametrů Pomocí odkazu na anonymní funkci lze do vnitřní funkce předat další paramet‐ ry, se kterými vytvořená vnější funkce nepočítá. Pokud bude uživatelská funkce SiCoP závislá na dalším parametru např. SiCoP.m ======================================================= function v=SiCoP(t,c) v=sin(c*t)+cos(t/c); ========================================================SiCoP.m
pak lze využít existující funkci OInt pro výpočet určitého integrálu. Je potřeba při volání vnější funkce OInt použít odkaz na anonymní funkci např. ve tvaru >> par=2; >> vys=OInt(@(x) SiCoP(x,par),0,2*pi,20); >> vys=OInt(@(x) sin(par*x)+cos(x/par),0,2*pi,20);
6.2.5 Návrh vnější funkce Pokud bychom vytvářeli funkci, která má jako parametr další funkci je potřeba v těle funkce rozlišit zda funkce v parametru je určená pomocí názvu souboru nebo pomocí odkazu. K tomuto účelu je možné využít logickou funkci isa(obj,class) dávající odpověď na otázku, zda příslušná proměnná (ob‐ jekt) je určeného typu (třídy). Pokud obsahuje příslušný parametr název soubo‐ ru (řetězec) je nutné ho pro další použití převést na odkaz na funkci (function handle) pomocí funkce str2func(string). Při kontrole parametrů je využita funkce error(text), která vrací řízení do příkazového řádku (předčasně ukončuje funkci) a vypisuje chybové hlášení s textem dodaným jako parametr. Funkce OInt pro výpočet určitého integrálu ze zadané funkce umožňující všechny varianty předání odkazu na funkci včetně kontroly platnosti parametru může vypadat např. jako KŘP/IMSW Modelování ve výpočtových software
6‐4 (11) 15.9.11
František Dušek KŘP FEI Univerzita Pardubice
OInt.m ======================================================= function p=OInt(fce,a,b,N) % výpočet určitého integrálu funkce y=fce(x) % na intervalu a<=x<=b v N+1 bodech
% !!! zjištění jak je předaný odkaz na funkci fce % a) je fce řetězec obsahující název souboru s funkcí if isa(fce,'char'), % je fce řetězec (pole znaků)? f=str2func(fce); % ano, vytvoř handle funkce if ~isa(f,'function_handle'), % je handle? error('nelze převést na handler funkce'); %není, konec end % b)je fce handler funkce elseif isa(fce,'function_handle'), % je fce handler f=fce; else error('parametr není odkaz na funkci'); % konec end % !!! výpočet určitého integrálu obdélníkovou metodou h=(b-a)/N; s=(f(a)+f(b))/2; for k=1:N-1, x=a+k*h; s=s+f(x); end p=s*h; ========================================================OInt.m
6.3 Výpočet kořene funkce Matematická úloha hledání kořene funkce f(x) představuje nalezení všech hodnot nezávisle proměnné x takových, pro které je funkční hodnota nulová tj. f(x)=0. Obecně může jít o komplexní funkci komplexní proměnné. My se ome‐ zíme na reálnou 5 funkci reálné proměnné. Kořeny (řešení) můžeme hledat v celém definičním oboru nebo jen pro zadaný interval nezávisle proměnné. Žádný kořen nemusí existovat, může být právě jeden, může jich být konečný počet či může být nekonečné mnoho kořenů. Obecné řešení, které by pro ja‐ koukoliv funkci našlo všechny kořeny, neexistuje 6 . Existuje ale řešení úlohy jak se zvolenou přesností nalézt kořen libovolné funkce pokud začneme s vyhledá‐ váním dostatečně blízko hledaného kořene. Toto řešení je v MATLABu realizo‐ váno pomocí funkce funkcí fzero (viz help fzero). x=fzero(fce,x0) určení kořene x* funkce fce(x) v okolí bodu x0 Úloha je‐li známa funkce y=fce(x) a hodnota x0 * urči takové x*, pro které je funkční hodnota nu‐ fce( x ) = 0 lová a vzdálenost x0 a x* je minimální Příklad fce( x ) = cos( x ) − x 5 Řešení >> f=@(x) cos(x)-x/5;
min x * − x0 * x
5
Funkční hodnoty reálné funkce nabývají hodnot pouze z oboru reálných čísel i pro hodnoty nezávisle proměnné z oboru komplexních čísel.
6
Výjimkou je určení kořenů speciálního typu komplexní funkce komplexní proměnné – polyno‐ mu. V MATLABu je funkce roots pro určení všech kořenů polynomu včetně polynomu s kom‐ plexními koeficienty.
KŘP/IMSW Modelování ve výpočtových software
6‐5 (11) 15.9.11
František Dušek KŘP FEI Univerzita Pardubice
>> x=fzero(f,1) x = 1.3064 >> y=f(x) y = 5.5511e-017
Nalezené řešení je sice správné, ale je však jediné? Jak určit počet kořenů a jak odhadnout přibližnou polohu jednotlivých kořenů? Je možné využít prostředky MATLABu pro vizualizaci – nakreslit si průběh funkce a počet a přibližnou polo‐ hu kořenů odhadnout. Pro danou funkci je potřeba určit interval, na kterém se mohou vyskytovat kořene a tento použít pro vykreslení průběhu funkce. V našem příkladu může funkce cos(x) nabývat pouze hodnot mezi ±1 a tudíž zbý‐ vající část – pro dosažení nuly při odečtení – musí též nabývat hodnot pouze mezi ±1. Z toho plyne, že stačí vyšetřovat pouze rozsah nezávisle proměnné ‐5 ≤ x ≤ 5. Po nakreslení průběhu funkce zjistíme, že existují tři kořeny s přibližnou polohou ‐4, ‐2 a 1. Kompletní řešení daného příkladu včetně „zkoušky“ a za‐ kreslení výsledků tedy může být např. >> f=@(x) cos(x)-x/5; >> t=-5:0.1:5; >>plot(t,f(t),'LineWidth',2) >> grid, hold on % odhad počtu, polohy kořenů >> x1=fzero(f,-4) x1 = -3.8375 >> y1=f(x1) y1 = -2.2204e-016 >> x2=fzero(f,-2) x2 = -1.9774 >> y2=f(x2) y2 = 0 >> x3=fzero(f,1) x3 = 1.3064 >> y3=f(x3) y3 = 5.5511e-017 >> h(1)=plot(x1,y1,'ro'); >> h(2)=plot(x2,y2,'ro'); >> h(3)=plot(x3,y3,'ro'); >> set(h,'MarkerSize',12) >> set(h,'LineWidth',2)
1.5
1
0.5
0
-0.5
-1
-1.5
-2 -5
-4
-3
-2
-1
0
1
2
3
4
5
KŘP/IMSW Modelování ve výpočtových software
6‐6 (11) 15.9.11
František Dušek KŘP FEI Univerzita Pardubice
6.4 Příklady na procvičení V kapitole 6.4.1 jsou zadání a v kapitole 6.4.2 řešení jednoduchých příkladů na probíranou problematiku. Pro řešení příkladů jsou nutné znalosti z prvních pěti bloků. Předpokládá se, že při řešení příkladů má čtenář k dispozici MATLAB a aktivně využívá nápovědu k programu.
6.4.1 Zadání příkladů Př01. Grafické řešení rovnice. S využitím pouze grafu nalezněte všechna řešení rovnice xe − x = x 2 − 1 s přes‐ ností na 0.01. Návod: nakreslete do jednoho grafu průběh funkce na levé a pravé straně rov‐ nice a pomocí zoomu zvětšete okolí jednotlivých průsečíků pro odhad jejich poloh. Jako řešení vykreslete okolí každého průsečíku ve vhodném měřítku, aby šlo vizuálně odečíst řešení s požadovanou přesností. Př02. Nalezněte všechny kořeny funkce: a)
(
)
2 1−sin( x ) − x3 y ( x) = x − 2 x + 2 e
b) y ( x ) =
5
∑ (− 1)
k
cos (n arccos ( x )) na intervalu ‐1 ≤ x ≤ 1
n =1
a hodnoty kořenů vypište jako text do grafu Návod: pro převedení čísla na řetězec použijte funkci sprintf a pro umístění textu do grafu použijte funkci text Př03. Řešení rovnice s parametrem. 2
Vyneste do grafu závislost řešení rovnice xp x+1 = 1 v závislosti na hodnotách parametru 0.2 ≤ p ≤ 4 pro volitelný počet parametrů rovnoměrně rozmístěný na uvedeném intervalu. Zároveň do druhého grafu vyneste průběh levé stra‐ ny rovnice a všechny průběhy levých stran pro zadané parametry a opatřete popisy a legendou obsahující hodnoty parametrů příslušných křivek. Průběh křivek vykreslete na intervalu 0 ≤ x ≤ 3. Návod: pro vektor zvolených hodnot parametru p v cyklu pro každou hodnotu parametru vykreslete levé strany a vyhledejte kořen anonymní funkce s předávanou hodnotou parametru. Legendu vytvořte pomocí pole buněk (cell array, funkce cell) s využitím funkce sprintf
KŘP/IMSW Modelování ve výpočtových software
6‐7 (11) 15.9.11
František Dušek KŘP FEI Univerzita Pardubice
Řešení příkladů 3
Př01. Grafické řešení rovnice xe − x = x 2 − 1 >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
x=-1:0.01:2; ls=x.*exp(-x); ps=x.^2-1; subplot(2,1,1) plot(x,ls,x,ps,'LineWidth',2) grid subplot(2,2,3) plot(x,ls,x,ps,'LineWidth',2) title('Prvni koren') axis([-.48,-.475,-.8,-.73]) grid subplot(2,2,4) plot(x,ls,x,ps,'LineWidth',2) title('Druhy koren') axis([1.165,1.17,0.3,0.4]) grid
2 1 0 -1 -2 -3 -1
-0.5
0
0.5
1
1.5
2
Druhy koren
Prvni koren 0.4 -0.74
0.38 0.36
-0.76
0.34 -0.78 0.32 -0.8 -0.48
-0.479
-0.478
-0.477
-0.476
0.3 1.165
-0.475
1.166
1.167
1.168
1.169
1.17
Př02. Nalezněte všechny kořeny funkce.
(
)
2 1−sin( x ) − x3 a) y ( x) = x − 2 x + 2 e
>> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
f=@(x) (x.^2-2*x+2).*exp(1-sin(x))-x.^3; x=0:0.1:5.3; h=plot(x,f(x),[0,5.3],[0,0]); hold on x1=fzero(f,1); y1=f(x1); h(3)=plot(x1,y1,'ro'); x1s=sprintf('x_1=%5.3f',x1); ht(1)=text(x1,5,x1s); x2=fzero(f,4); y2=f(x2); h(4)=plot(x2,y2,'ro'); x2s=sprintf('x_2=%5.3f',x2); ht(2)=text(x2-1,5,x2s); x3=fzero(f,5); y3=f(x3); h(5)=plot(x3,y3,'ro'); x3s=sprintf('x_3=%5.3f',x3); ht(3)=text(x3,5,x3s); set(h,'LineWidth',2) set(h(3:5),'MarkerSize',12) set(ht,'FontSize',12) set(ht,'FontWeight','bold') grid
b) y ( x ) =
5
∑ (− 1)
k
10
x1=1.047
5
x2=4.243
x3 =4.901
0
-5
-10
-15
-20
-25
-30
0
1
2
3
4
5
6
cos (n arccos ( x )) na intervalu ‐1 ≤ x ≤ 1
n =1
funkce, jejichž kořeny se hledají Ceby5.m ===================================================== function y=Ceby5(x) y=0; for k=1:5, y=y+(-1)^k*cos(k*acos(x)); end ====================================================== Ceby5.m
skript pro výpočet kořenů včetně zakreslení výsledků a výpisu textu, hodnoty odhadů x0 jsou doplněny po vykreslení grafu KŘP/IMSW Modelování ve výpočtových software
6‐8 (11) 15.9.11
František Dušek KŘP FEI Univerzita Pardubice
skript.m ===================================================== x=-1:0.01:1; 3 h=plot(x,Ceby5(x),[-1,1],[0,0]); 2.5 hold on % z grafu odečteno 5 přibližných poloh kořenů 2 x0=[-.9,-.3,0,0.8,0.9]; x3=0.000 1.5 for k=1:length(x0), x=fzero(@Ceby5,x0(k)); y=Ceby5(x); x2=-0.309 1 h(2+k)=plot(x,y,'ro'); x1=-0.866 xs=sprintf('x_%1d=%5.3f',[k,x]); 0.5 ht(k)=text(x,0.1+k/2,xs); 0 end
x5=0.866 x4=0.809
-0.5
set(h,'LineWidth',2) -1 set(h,'MarkerSize',12) set(ht,'FontSize',12) -1.5 set(ht,'FontWeight','bold') -2 grid -1 -0.8 -0.6 -0.4 -0.2 0 0.2 axis([-1,1.1,-2,3]) ===================================================== skript.m
0.4
0.6
0.8
1
Př03. Řešení rovnice s parametrem. skript.m ===================================================== % skript pro výpočet a vykreslení řešení rovnice s parametrem % anonymní funkce pro hledání kořenu rovnice f=@(x,q) x.*q.^(2./(x+1))-1; % anonymní funkce pro kreslení průběhu levé strany fp=@(x,q) x.*q.^(2./(x+1)); n=9; % počet hodnot parametru p=linspace(0.2,4,n); % hodnoty parametrů hl=zeros(1,n); % pro handlery křivek ko=zeros(1,n); % pro kořeny funkcí te=cell(1,n+1); % pole buněk pro text legendy x=0:0.01:3; % rozsah kreslení křivek % průběhy křivek subplot(1,2,1) plot([0,3],[1,1],'g'); % y(x)=1 (pravá strana) te{1}='y(x)=1'; % !!! složené závorky xlabel('x'), ylabel('y') title('Levá a pravá strana rovnice') hold on % další křivky přidávej for k=1:n, % křivky levé strany if k==1, ba='r'; % první červeně elseif k==n, ba='b'; % poslední modře else ba='k'; % ostatní černě end hl(k)=plot(x,fp(x,p(k)),ba); % kresli ko(k)=fzero(@(t) f(t,p(k)),1); % kořen te{k+1}=sprintf('p_{%02d}=%04.3f',[k,p(k)]); % text legendy end set(hl,'LineWidth',2) % všechny křivky tloušťka 2 legend(te,'Location','NorthWest') % legenda vlevo nahoře grid % kořeny v závislosti na parametru subplot(1,2,2), h=plot(p,ko,'v'); title('Řešení rovnice') xlabel('parametr p'), ylabel('řešení') set(h,'LineWidth',2) set(h,'MarkerSize',10) grid ===================================================== skript.m
KŘP/IMSW Modelování ve výpočtových software
6‐9 (11) 15.9.11
František Dušek KŘP FEI Univerzita Pardubice
Levá a pravá strana rovnice
Řešení rovnice
6
3 y(x)=1 p01=0.200 p02=0.675
5
2.5
p03=1.150 p04=1.625 p05=2.100
4
2
p06=2.575 p07=3.050 řešení
y
p08=3.525 3
p09=4.000
1.5
2
1
1
0.5
0
0
0.5
1
1.5 x
2
2.5
3
0
0
1
2 parametr p
3
4
KŘP/IMSW Modelování ve výpočtových software
6‐10 (11) 15.9.11
František Dušek KŘP FEI Univerzita Pardubice
Pojmy k zapamatování Okruhy problémů: funkce jako parametr jiné funkce, odkaz na funkci, anonymní funkce, ukončení funkce s výpisem chybového textu, kontrola typu proměnné, úloha hledání kořene funkce, umístění textu do grafu, použití pole buněk Použité nástroje:
Příkazy a funkce: cell, str2func, text
error,
fzero,
isa,
sprintf,
Otázky na procvičení 1. 2. 3. 4. 5.
Co mají společného „funkce funkcí“? Jak vytvoříme odkaz na funkci? Co zajišťuje funkce str2fcn? Jak naleznete graficky řešení rovnice? Kolik kořenů má polynom n‐tého stupně a jakou funkci MATLABu použije‐ te pro jejich nalezení? 6. Kolik kořenů, případně který kořen nalezne funkce MATLABu fzero? 7. Co je to anonymní funkce?
Odkazy a další studijní prameny • •
on‐line dokumentace k programu nebo www.mathworks.com/help/ – části „Types of Functions“, „Anonymous Functions“, „Function Handles“, „Data Types“ elektronická učebnice Learning MATLAB 7– www.mathworks.com/academia/student_version/learnmatlab_sp3.pdf (část „Cell Arrays“, „Types of Functions“)
KŘP/IMSW Modelování ve výpočtových software
6‐11 (11) 15.9.11
František Dušek KŘP FEI Univerzita Pardubice
7 Výpočet určitého integrálu a numerické řešení di‐ ferenciálních rovnic Studijní cíl V sedmém bloku se seznámíme s možnostmi MATLABu pro řešení dalších dvou důležitých matematických úloh ‐ numerický výpočtem určitých integrálů a oby‐ čejných diferenciálních rovnic. Výpočet určitých integrálů (jedno‐ i vícenásob‐ ných) je důležitý při řešení mnoha úloh – např. při určování délky křivky, obsa‐ hu rovinných útvarů, při určování povrchu, objemu a hmotnosti těles, při určo‐ vání těžiště či momentu setrvačnosti atd. Na řešení diferenciálních rovnic vede mnoho úloh z elektrotechniky, mechaniky, termodynamiky a zejména jsou využívány při popisu chování dynamických systémů. O významu soustav oby‐ čejných nelineárních diferenciálních rovnic svědčí i to že řešením pouze této úlohy se zabývá specializovaná nadstavba MATLABu zvaná SIMULINK, které se budeme později věnovat v blocích 9‐12.
Doba nutná k nastudování
1 ‐ 2 hodiny
Průvodce studiem Předpokládá se, že čtenář je seznámen s prostředím MATLABu, základními příkazy, tvorbou grafů a tvorbou skriptů a funkcí v rozsahu prvních čtyř bloků. Ze šestého bloku jsou potřeba znalosti o předávání funkce jako parametru jiné funkce. Dále se předpokládají základní znalosti integrálního a diferenciálního počtu. Při studiu je vhodné mít spuštěný MATLAB a jednotlivé příkazy či funkce hned vyzkoušet a případně získat podrobnější informace využíváním nápovědy k programu. Na závěr jsou uvedeny řešené příklady na procvičení. V textu jsou použity následující typografické konvence: Calibri 11, Bold, Italic nové pojmy či informace k zapamatování Calibri 11 označení klávesy Courier New 10, Bold názvy nástrojů MATLABu Courier New 10, Bold upřesnění nápovědy (help téma) Courier New 10 názvy příkazů, funkcí a objektů Courier New 10 označení části příkazu, která se může vynechat Courier New 10, Italic názvy proměnných použitých v programu Courier New 9 příkaz příkazové řádky / výpis programu Courier New 9 výpis programu – klíčová slova Courier New 9 výpis programu – řetězec Courier New 9 výpis programu – komentář
KŘP/IMSW Modelování ve výpočtových software
7‐1 (20) 4.7.12
František Dušek KŘP FEI Univerzita Pardubice
7.1 Numerický výpočet určitého integrálu Další matematickou úlohou, pro kterou lze stanovit obecný postup řešení bez znalosti konkrétní funkce, je výpočet určitého integrálu. Problém b I1 = f ( x )dx je principiálně jednoduchý v případě jednorozměrného inte‐ grálu tj. pro jednorozměrnou funkci. V případě vícerozměrných a I 2 = f ( x, y )dxdy integrálů je problém komplikovanější v případě, že inte‐ grujeme přes jinou než obdélníkovou oblast (v případě S dvourozměrného) nebo oblast tvaru kvádru (v I3 = f ( x, y , z )dxdydz případě třírozměrného integrálu).
∫
∫∫
∫∫∫ V
Z pohledu řešení v MATLABu jde opět o funkci funkcí, kdy je řešící funkci dodán handle konkrétní funkce, která se má na zadaném intervalu či oblasti integro‐ vat. Pro výpočet jednotlivých integrálů jsou určeny následující základní řešící funkce (blíže viz help quadl, help dblquadl, help triplequad) I=quadl(f,a,b) výpočet určitého jednorozměrného integrálu z funkce f na intervalu od a do b I=dblquad(f,xmin,xmax,ymin,ymax) výpočet určitého dvou‐ rozměrného integrálu z funkce f na obdélníkové oblasti P vymezené rozsa‐ hem od xmin do xmax a od ymin do ymax I=triplequad(f,xmin,xmax,ymin,max,zmin,zmax) výpočet určitého třírozměrného integrálu z funkce f na kvadratické oblasti V vyme‐ zené rozsahem od xmin do xmax, od ymin do ymax a od zmin do zmax Defaultní přesnost určení určitého integrálu je ve všech případech 1e‐6. Uživa‐ telskou funkci f je potřeba vytvořit tak, aby akceptovala vektor pro proměnnou x (a skaláry pro případné další nezávisle proměnné y či z) a vracela odpovídající vektor funkčních hodnot.
7.1.1 Výpočet jednoduchého určitého integrálu ‐ příklady Při řešení některých úloh může být užitečná znalost geometrické interpretace určitého integrálu. Hodnota určitého integrálu nějaké funkce od bodu a do bodu b je plocha mezi osou x a průběhem funkce ohraničená kolmicemi v bodec a a b. Pozor ale, že plocha pod osou x se uvažuje jako záporná. Uveďme jako příklad výpočet obsahu kružnice o poloměru r (který dokážeme spočítat i bez určitého integrálu). Vyjdeme‐ li z Obrázku 7‐1 pak obsah kružnice je určen dvoj‐ násobkem plochy pod křivkou na obrázku tj. vztahem
y
x
+r
S = 2 ∫ r − x dx 2
2
‐r
−r
r f ( x) = r 2 − x 2
Řešení v MATLABu s ověřením pomocí vzorce pro výpočet obsahu kružnice pak může vypadat např. (pro případ r=10) jako
Obrázek 7‐1 Výpočet obsahu kružnice
KŘP/IMSW Modelování ve výpočtových software
7‐2 (20) 4.7.12
František Dušek KŘP FEI Univerzita Pardubice
>> r=10; >> P1=2*quadl(@(x) sqrt(r^2-x.^2),-r,r); >> P2=pi*r^2; >> e=P1-P2 e = -1.6325e-006
Jako další příklad uveďme výpočet hodnoty určitého integrálu z funkce sinus od 0 do 2π, kde umíme určit i bez výpočtu integrálu, že má vyjít 0. Víte proč? >> P=quadl(@sin,0,2*pi) P = 1.7588e-016
Jednoduchý určitý integrál je možné použít i pro výpočet objemu rotačních těles. Vznikne‐li nějaké těleso rotací křivky f(x) okolo osy x, pak je jeho objem určen vztahem B2=[0,0.5] B1=[‐1,0.5]
b
V = π ∫ f ( x)dx
B3=[1,0.5]
y
2
a
0.5 0.6 Chceme‐li tedy určit např. objem sudu s geometrickými rozměry podle x Obrázku 7‐2, pak je řešení velmi jedno‐ duché za předpokladu znalosti funk‐ ce popisující zaoblení sudu a vhodné 2 volby souřadného systému. Pokud budeme funkci zakřivení aproximovat Obrázek7‐2 Objem sudu polynomem 2. stupně (parabolou) procházející body B1 až B3 pak můžeme řešení v MATLABu napsat např. jako >> x=[-1,0,1]; y=[0.5,0.6,0.5]; >> p=polyfit(x,y,2); >> V=quadl(@(x) pi*polyval(p,x).^2,-1,1) V = 2.0232
Poslední příklad ukazuje použití určitého integrálu pro určení délky křivky v prostoru. Máme‐li křivku v prostoru popsanou parametrickými rovnicemi ve tvaru x = f x (t ) y = f y (t ) z = f z (t ) pak délka křivky je dána vztahem t =b
L=
∫
t =a
2
2
2
⎛ dx ⎞ ⎛ dy ⎞ ⎛ dz ⎞ ⎜ ⎟ + ⎜ ⎟ + ⎜ ⎟ dt ⎝ dt ⎠ ⎝ dt ⎠ ⎝ dt ⎠
1
Mějme křivku na Obrázku 7‐3 popsanou rovnicemi
( )
x = sin t 2 y = sin(t ) cos(t ) z = cos t 2
( )
( )
x′ = 2t cos t 2 y′ = cos 2 (t ) − sin 2 (t ) z′ = −2t sin t 2
0
-0.5
( )
-1 0.5
pak vykreslení průběhu křivky pro 0 ≤ t ≤ π a výpočet délky křivky je možné vypočítat např. jako >> >> >> >>
0.5
1 0.5
0 0 -0.5 -0.5
-1
t=linspace(0,pi,1000); Obrázek 7‐3 Křivka v prostoru x=sin(t.^2); y=sin(t).*cos(t); z=cos(t.^2); plot3(x,y,z), grid f=@(t) (2*t.*cos(t.^2)).^2 + (cos(t).^2-sin(t).^2).^2 + + (2*t.*sin(t.^2)).^2;
KŘP/IMSW Modelování ve výpočtových software
7‐3 (20) 4.7.12
František Dušek KŘP FEI Univerzita Pardubice
>> L=quadl(@(x) sqrt(f(x)),0,pi) L = 10.3071
7.1.2 Výpočet dvojného určitého integrálu – příklady Geometrická interpretace dvojného integrálu z funkce f(x,y) přes integrační oblast S(x,y) tj.
∫∫ f ( x, y)dxdy je objem omezený shora plochou danou funkcí S
f(x,y), zdola uzavřenou oblastí v rovině x‐y a z boků pláštěm kolmým na rovinu x‐y procházejícím hranicí oblasti S. Opět s konvencí, že objem pod rovinou x‐y je záporný. V případě pravoúhlé integrační oblasti a ≤ x ≤ b, c ≤ y ≤ d (úloha bd
∫∫ f (x, y)dydx ) je přímo použitelná funkce dblquad(f,a,b,c,d). a c
Jako příklad uveďme výpočet objemu části polokoule o poloměru r popsané funkcí f ( x, y ) = r 2 − x 2 − y 2 nad oblastí ‐ r /2 ≤ x ≤ + r /2, ‐ r /2 ≤ y ≤ +r/2 (viz Obrázek 7‐4). Matematická formulace pro uvedený příklad je r
V=
2
r
2
∫∫
r 2 − x 2 − y 2 dydx
−r 2 −r 2
Příkazy pro vykreslení vzniklého útvaru pro r=10 a výpočet jeho objemu jsou
10 8 6
>> r=10; x=-r/2:r/19:r/2; y=x; 4 >> [X,Y]=meshgrid(x,y); 2 >> Z=sqrt(r^2-X.^2-Y.^2); 0 10 >> Z1=Z*0; >> h=meshz(x,y,Z); 5 >> set(h,'LineWidth',1) 0 >> axis equal -5 -5 >> axis([-r,r,-r,r,0,r]) -10 -10 >> hold on >> surf(x,y,Z1) Obrázek 7‐4 Část polokoule >> f=@(x,y,p) sqrt(p^2-x.^2-y^2) >> V=dblquad(@(x,y) f(x,y,r),-r/2,r/2,-r/2,r/2) V = 910.9658
10 5 0
Pokud chceme spočítat objem celé polokoule o poloměru r (integrační oblastí je kruh o poloměru r) pak je matematická formulace problému
⎡ r 2 − x2 ⎤ V = ∫⎢ ∫ r 2 − x 2 − y 2 dy ⎥dx . Protože funkce dblquad má integrační ⎥⎦ −r ⎢ ⎣− r 2 − x2 r
meze konstantní a tedy volá vnitřní funkci pro body z obdélníkové1 integrační oblasti, není možné vnitřní funkci vytvořit pouhým přepisem matematického zadání jako v předchozím případě. Možné řešení je vnitřní funkci realizující matematickou funkci ze zadání rozšířit tak, aby pro hodnoty x, y mimo požado‐ 1
Tj. i pro body mimo požadovanou kruhovou integrační oblast, kde funkce není definována
KŘP/IMSW Modelování ve výpočtových software
7‐4 (20) 4.7.12
František Dušek KŘP FEI Univerzita Pardubice
vanou kruhovou integrační oblast vracela nulové hodnoty, tj. aby funkční hod‐ noty pro tyto body neovlivnily výslednou hodnotu integrálu. Příkladem takové funkce může být např. PoloKoule.m ==================================================== function z=PoloKoule(x,y,r) % výpočet výšky bodu polokoule o poloměru r nad rovinou x-y % pro zadaný bod [x,y] v=r^2-x.^2-y^2; z=zeros(size(v)); for k=1:length(v), % !!! x (tj. i v) může být vektor if v(k)>0, z(k)=sqrt(v(k)); end end ==================================================== PoloKoule.m
Využijeme‐li tuto funkci i pro vykreslení útvaru (Obrázek 7‐5), jehož objem zjišťujeme, pak můžeme zapsat např. skript r=10; x=-r:r/20:r; 10 y=x; 8 nx=length(x); 6 ny=length(y); 4 Z=zeros(nx,ny); 2 for k=1:nx, 0 10 for l=1:ny, Z(k,l)=PoloKoule(x(k),y(l),r); end end h=mesh(x,y,Z); set(h,'LineWidth',2) axis equal axis([-r,r,-r,r,0,r]) V=dblquad(@(x,y) PoloKoule(x,y,r),-r,r,-r,r);
10
5 5
0 0 -5
-5 -10
-10
Obrázek 7‐5 Polokoule
Jiná varianta vnitřní funkce s „chytřejším“ způsobem řešení rozhodování zda hodnoty leží v integrační oblasti, je ukázána dále PoloKoule.m ==================================================== function z=PoloKoule(x,y,r) % výpočet výšky bodu polokoule o poloměru r nad rovinou x-y % pro zadaný bod [x,y] v=max(r^2-x.^2-y^2,0); z=sqrt(v); ==================================================== PoloKoule.m
nebo přímo v definici anonymní funkce V=dblquad(@(x,y) sqrt(max(r^2-x.^2-y^2,0)),-r,r,-r,r); V = 2.0944e+003
7.1.3 Výpočet trojného určitého integrálu – příklady Geometrická interpretace trojného integrálu z funkce f(x,y,z) přes integrační oblast O(x,y,z) tj.
∫∫∫ f ( x, y, z)dxdydz
je hmota oblasti (objemu) O
O
KŘP/IMSW Modelování ve výpočtových software
7‐5 (20) 4.7.12
František Dušek KŘP FEI Univerzita Pardubice
s proměnnou hustotou popsanou funkcí f(x,y,z). Pokud je funkce f(x,y,z) v celé integrační oblasti jednotková, pak hodnota integrálu odpovídá objemu oblasti.
V případě pravoúhlé integrační oblasti a ≤ x ≤ b, c ≤ y ≤ d, e ≤ z ≤ f (úloha b d f
∫∫∫ f (x, y, z )dzdydx ) lze použít funkci triplequad(f,a,b,c,d,e,f). a c e
Použití funkce triplequad si ukážeme opět na příkladu – výpočtu hmoty tělesa s proměnnou hustotou pomocí trojného integrálu. Hmota tělesa je obecně dána vztahem
∫∫∫ ρ (x, y, z )dxdydz kde V je oblast v prostoru, přes V
kterou integrujeme, a ρ(x,y,z) je rozložení hustoty v prostoru. Integrační oblast V bude kvadratická 0 ≤ x ≤ a, 0 ≤ y ≤ b, 0 ≤ z ≤ c a rozložení hustoty v prostoru je popsáno vztahem ρ ( x, y , z ) =
1 1 + x2 + y2 + z 2
. Příkazy pro řešení pak
mohou být např. >> f=@(x,y,z) 1./sqrt(1+x.^2+y^2+z^2); >> M=triplequad(f,0,1,0,2,0,3) M = 2.8423
Využití určitých integrálů není omezeno jen pro výpočty objemu. Používají se pro výpočet plochy, povrchu, hmoty, statických momentů, polohy těžiště, mo‐ mentu setrvačnosti tělesa (plochy, křivky), pro výpočet např. práce po křivce v silovém poli atd.
7.2 Numerické řešení obyčejných diferenciálních rovnic V dalším textu se budeme zabývat pouze obyčejnými diferenciálními rovnicemi (Ordinary Differential Equation ODE) jejichž řešením je funkce jedné (nezávisle) proměnné. Parciálními diferenciálními rovnicemi, jejichž řešením je funkce více (nezávisle) proměnných se zabývat nebudeme. Diferenciální rovnice popisuje závislost mezi neznámou funkcí, jejími derivacemi a případně funkcemi nezá‐ visle proměnné a neznámé funkce. Obecným analytickým řešením je určení množiny (prostoru) všech funkcí2, které po derivování a dosazení splňují dife‐ renciální rovnici. Pro výběr jedné konkrétní funkce z prostoru řešení je potřeba zvolit bod v prostoru řešení, kterým má funkce (řešení) procházet. Protože nás obvykle zajímá řešení na určitém intervalu hodnot nezávisle proměnné tak se bod, kterým má procházet řešení nejčastěji volí buď na začátku či konci tohoto intervalu. Podle umístění vybraného bodu v prostoru řešení se pak diferenciál‐ ní rovnice označuje jako diferenciální rovnice s počátečními (začátku intervalu) či okrajovými (na konci intervalu) podmínkami. Řešení může být buď v tvaru analytickém (vyjádřeno funkcí, předpisem pro výpočet souřadnice bodu řešení 2
Prostor všech funkcí představujících řešení diferenciální rovnice je popsán (pokud v analytické podobě vůbec existuje) jednou funkcí, ve které se vyskytuje tolik blíže neurčených parametrů, kolikátého řádu daná diferenciální rovnice je. Počáteční či okrajové podmínky slouží k určení konkrétních hodnot těchto parametrů.
KŘP/IMSW Modelování ve výpočtových software
7‐6 (20) 4.7.12
František Dušek KŘP FEI Univerzita Pardubice
na základě hodnoty nezávisle proměnné) nebo numerickém (vyjádřené tabul‐ kou souřadnic bodů představujících řešení).
Analytické řešení diferenciální rovnice s počátečními či okrajovými podmínka‐ mi je tedy představováno funkcí, která pro hodnoty nezávisle proměnné umožní spočítat odpovídající funkční hodnotu. Analytické řešení obyčejných nelineárních diferenciálních rovnic existuje (v uzavřeném tvaru) pouze ve spe‐ ciálních případech. Pro obyčejné lineární3 diferenciální rovnice analytické řeše‐ ní existuje ale jeho získání je pracné a výsledná funkce může být značně složitá. Jako příklad analytického řešení ukažme řešení diferenciální rovnice
⎛ x2 ⎞ dy + y = xe − x s obecným řešením y ( x) = ⎜⎜ C + ⎟⎟e − x a konkrétním řešením 2⎠ dx ⎝ ⎛ x2 ⎞ y ( x) = ⎜⎜ 2 + ⎟⎟e − x pro počáteční podmínku y(x=0)=2. 2⎠ ⎝ Pokud nám však stačí znát pro zadané hodnoty nezávislé proměnné hodnoty, které jsou řešením dané diferenciální rovnice s počátečními (či okrajovými) podmínkami, pak můžeme použít numerické řešení diferenciální rovnice, které lze nalézt vždy (pokud vůbec řešení dané diferenciální rovnice existuje). Řeše‐ ním v tomto případě je tedy tabulka, kde pro každou hodnotu nezávisle pro‐ měnné je spočítána odpovídající funkční hodnota. MATLAB obsahuje několik různých metod (algoritmů) numerického výpočtu obyčejných diferenciálních rovnic opět ve formě funkce funkcí. Aby bylo možné použít tyto funkce pro obyčejnou diferenciální rovnici libovolného stupně4, vyžadují zápis diferenciální rovnice ve tvaru soustavy diferenciálních rovnic prvního stupně. Soustavu N obyčejných diferenciálních rovnic prvního stupně včetně počátečních či okrajových podmínek
dy1 dy2 dyN
dx
= f1 ( x, y1 , y2 ,K, yN )
y1 ( x = x0 ) = y10 y2 ( x = x0 ) = y20
dx
= f 2 ( x, y1 , y2 ,K, yN )
dx
= f N ( x, y1 , y2 ,K, yN ) yN ( x = x0 ) = yN 0
M
M
lze zapsat ve formálně stejném maticovém zápisu
dY = f (x, Y) Y0 = Y(x = x0 ) dx kde
x je označení nezávisle proměnné, Y = [y1(x), y2(x), … , yN(x)]T je vektor (neznámých) funkcí řešících diferen‐ ciální rovnici,
3
Obyčejná lineární diferenciální rovnice obsahuje pouze lineární kombinace (sčítání/odečítání, násobení konstantou) neznámé funkce a jejich derivací a případně funkce nezávisle proměnné.
4
Stupeň či řád diferenciální rovnice je určen řádem nejvyšší derivace, která se v diferenciální rovnici vyskytuje.
KŘP/IMSW Modelování ve výpočtových software
7‐7 (20) 4.7.12
František Dušek KŘP FEI Univerzita Pardubice
f = [f1(x, y1(x), y2(x), … , yN(x), … , fN(x, y1(x), y2(x), … , yN(x)] T je vektor funkcí popisujících výpočet hodnoty derivace příslušné funkce v závislosti na hodnotě nezávisle proměnné x a Y0 = [y1(x0), y2(x0), … , yN(x0)]T je vektor počátečních podmínek tj. hodnot neznámých funkcí pro hodnotu nezávisle proměnné x=x0.
Jestliže je počet rovnic a počet hledaných funkcí stejný a jsou známé počáteční podmínky pak lze pro takovou soustavu rovnic v MATLABu získat (poud řešení existuje) numerické řešení pro libovolné hodnoty x na intervalu x0 ≤ x ≤ xmax.
7.2.1 Převod diferenciální rovnice vyššího řádu na soustavu diferen‐ ciálních rovnic řádu prvního Velmi často máme nalézt řešení obyčejné diferenciální rovnice (ODE) vyššího stupně než prvého. Každou obyčejnou diferenciální rovnici n‐tého stupně lze převést na soustavu n diferenciálních rovnic prvního stupně, kde buď přímo jedna z funkcí, nebo kombinace několika nových funkcí představuje hledané řešení původní rovnice. Převod původní diferenciální rovnice vyššího řádu na soustavu diferenciálních rovnic řádu prvého není jednoznačný tj. k jedné ODE vyššího řádu lze nalézt (nekonečně) mnoho různých soustav ODE řádu prvého. Ukážeme si jeden z možných způsobů převodu, kdy jedna funkce je přímo ře‐ šením původní rovnice, a ostatní funkce jsou derivacemi řešení. Obecně lze každou ODE stupně N s počátečními podmínkami zapsat jako
⎛ dNy dy d 2 y d N −1 y ⎞ ⎜ ⎟ = f x y K , , , , , ⎜ dx N dx dx 2 dx N −1 ⎟⎠ ⎝ y ( x0 ) = y0
dy = y1 dx x= x0
d2y dx 2
= y2 x = x0
d N −1 y K dx N −1
= y N −1 x = x0
Zavedeme‐li substituce (nové funkce v1(x), …, vN‐1(x)) jako
v1 ( x0 ) =
dy = v1 dx dv1 = v2 dx M dv N −2 = v N −1 dx
⎛ d2y ⎞ ⎜⎜ = 2 ⎟⎟ ⎝ dx ⎠
dy dx
= y1 x = x0
d2y v2 ( x0 ) = 2 dx
= y2 x = x0
⎛ d N −1 y ⎞ d N −1 y ⎜⎜ = N −1 ⎟⎟ v N −1 ( x0 ) = N −1 dx ⎝ dx ⎠
= y N −1 x = x0
a původní rovnici s využitím substitucí přepíšeme jako
dv N −1 = f ( x , y , v1 , v 2 , K , v N −1 ) dx získáme soustavu N rovnic pro N funkcí včetně počátečních podmínek.
KŘP/IMSW Modelování ve výpočtových software
7‐8 (20) 4.7.12
František Dušek KŘP FEI Univerzita Pardubice
= v1 v1 ( x0 ) = v2 ( x0 ) = dx = v2 M dvN − 2 vN −1 ( x0 ) = dx = v N −1 dvN −1 y ( x0 ) = dx = f ( x, y , v1 , K , v N −1 ) dy
dx
dv1
y1 y2
y N −1 y0
Postup ukažme na příkladu ODE 3. stupně ve tvaru
(
)
y′′′ + 1 − x 2 y′′ + ( y′) + xy = sin( x ) 2
y (0) = 1 y′(0) = 2
y′′(0) = 3
Odpovídající soustava tří diferenciálních rovnic je po substituci
dy
= v1
v1 ( 0 ) = 2
dx
= v2
v2 (0) = 3
dx
= sin( x ) − xy − v12 − 1 − x 2 v 2
dx dv1 dv 2
(
)
y (0) = 1
7.2.2 Řešení soustavy diferenciálních rovnic prvního řádu Soustavu N diferenciálních rovnic pro N funkcí odpovídající ODE N‐tého řádu můžeme zapsat v maticovém tvaru např. jako
⎡ y ⎤ ⎢ v ⎥ ⎢ 1 ⎥ Y=⎢ M ⎥ ⎢ ⎥ ⎢v N − 2 ⎥ ⎢⎣ vN −1 ⎥⎦
v1 ⎡ dy dx ⎤ ⎡ ⎤ ⎡ y0 ⎤ ⎢ dv1 ⎥ ⎢ ⎥ ⎢ y ⎥ v2 dx ⎥ ⎢ ⎢ ⎥ ⎢ 1 ⎥ dY ⎥ Y0 = ⎢ M ⎥ = ⎢ M ⎥ = f ( x, Y ) = ⎢ M dx ⎢dv ⎥ ⎢ ⎥ ⎢ ⎥ N −2 vN −1 dx ⎥ ⎢ ⎥ ⎢ ⎢ y N −2 ⎥ ⎢⎣ dvN −1 dx ⎥⎦ ⎢⎣ f ( x, y, v1 ,K, vN −1 )⎥⎦ ⎢⎣ y N −1 ⎥⎦
Pro výše uvedený příklad obyčejné diferenciální rovnice třetího stupně je pak maticový zápis – je potřeba zvolit pořadí funkcí ve sloupcovém vektoru Y a pak ho dále dodržovat – např. pro předchozí příklad
⎡ y⎤ ⎡1 ⎤ ⎢ ⎥ Y = ⎢ v1 ⎥ Y0 = ⎢⎢2⎥⎥ ⎢⎣v2 ⎥⎦ ⎢⎣3⎥⎦ ⎡ dy dx = v1 ⎤ dY ⎢ dv1 ⎥ = ⎢ dx = v2 ⎥ = f ( x, Y ) dx 2 2 dv 2 ⎢⎣ dx = sin( x) − xy − v1 − (1 − x )v2 ⎥⎦ a jeho přepis do formy m‐funkce MATLABu je Funkce.m ======================================================= function dY=Funkce(x,Y) % zápis soustavy diferenciálních rovnic % pomocné proměnné pro přehlednost zápisu
KŘP/IMSW Modelování ve výpočtových software
7‐9 (20) 4.7.12
František Dušek KŘP FEI Univerzita Pardubice
y=Y(1); v1=Y(2); v2=Y(3); % vektor derivací musí být sloupcový dY=zeros(3,1); dY(1)=v1; dY(2)=v2; dY(3)=sin(x)-x*y-v1^2-(1-x^2)*v2; ======================================================= Funkce.m
Máme‐li diferenciální rovnici ve tvaru soustavy N rovnic pro N neznámých funkcí a známe‐li počáteční podmínky, je získání numerického řešení v MATLABu triviální. Použijeme některou z funkcí pro řešení obyčejných dife‐ renciálních rovnic – nejčastěji5 se používá funkce ode45 se základní syntaxí (blíže viz help ode45) [x,YN]=ode45(fce,X,Y0)
kde
dY=fce(x,Y) je funkce pro výpočet vektoru derivací dY na základě aktuální hodnoty nezávisle proměnné x a vektoru Y aktuálních hodnot hledaných funkcí, X=[x0, (x1, ..., xm,) xmax] je vektor minimálně dvou hodnot (počáteční a konečná) nezávisle proměnné, mezi kterými se má počítat řešení, případně vektor hodnot, ve kterých chceme získat řešení, Y0 je sloupcový vektor počátečních podmínek tj. hodnot jednotlivých funkcí pro hodnotu x0, x je sloupcový vektor6 hodnot nezávisle proměnné, ve kterých jsou počítány hodnoty funkcí uložené v odpovídajícím řádku matice YN (viz Tabulka 1) a YN je matice řešení, jednotlivé sloupce odpovídají hodnotám příslušných funkcí (viz Tabulka 1) Tabulka 1 Uspořádaní výstupních parametrů funkce ode45
x0 x1 ... xm xmax x
YN YN(:,1) YN(:,2) YN(:,3) y(x0) v1(x0) v2(x0) y(x1) v1(x1) v2(x1) ... ... ... y(xm) v1(xm) v2(xm) y(xmax) v1(xmax) v2(xmax)
... ... ... ... ...
YN(:,N) vN‐1(x0) vN‐1(x1) ... vN‐1(xm) vN‐1(xmax)
Význam sloupců matice řešení YN (průběhy jednotlivých funkcí představujících řešení) je dán volbou uspořádání vektoru Y při přípravě soustavy rovnic. Záleží pouze na uživateli, jak funkce uspořádá. Uspořádáním vektoru Y je dáno upo‐ 5
Funkce ode45, která implementuje jednokrokový algoritmus Runge‐Kutta 4‐5. řádu, se dopo‐ ručuje použít jako první volbu. Pokud nelze nalézt řešení nebo víme, že jde o ODE se speciálními vlastnostmi (např. tzv. stiff systémy) jsou k dispozici další funkce využívající jiné algoritmy řešení: ode23, ode113, ode15s, ode23s, ode23t a ode23tb.
6
Počet hodnot mezi počáteční a konečnou hodnotou nezávisle proměnné si určí výpočetní algo‐ ritmus sám v závislosti na průběhu řešení tak, aby bylo dosaženo zadané přesnosti a zároveň byl počet bodů minimální (tj. i minimální počet volání funkce výpočtu derivací = minimalizace výpo‐ četního času). V případě, že je zadán vektor hodnot nezávisle proměnné probíhá výpočet opět v bodech, který si algoritmus určí sám a do zadaných bodů jsou výsledky interpolovány.
KŘP/IMSW Modelování ve výpočtových software
7‐10 (20) 4.7.12
František Dušek KŘP FEI Univerzita Pardubice
řádání (význam) vektoru derivací dY i vektoru počátečních podmínek Y0. První řádek matice YN představuje počáteční podmínky uložené ve vektoru Y0. První a poslední hodnota vektoru x nezávisle proměnných je dána parametrem X při volání funkce ode45. Numerické řešení výše uvedeného příkladu
(
)
y′′′ + 1 − x 2 y′′ + ( y′) + xy = sin( x ) 2
y (0) = 1 y′(0) = 2
y′′(0) = 3
pro 0 ≤ x ≤ 1.5 s využitím m‐funkce Funkce.m včetně vykreslení průběhu všech tří funkcí lze získat příkazy MATLABu >> >> >> >> >> >> >> >>
Y0=[1;2;3]; [x,Y]=ode45('Funkce',[0,1.5],Y0); h=plot(x,Y,'LineWidth',2), grid set(h(1),'LineWidth',3) h=legend('y(x)','v_1=dy/dx','v_2=d^2y/dx^2'); set(h,'Location','SouthWest') hold on plot([0;0;0],Y0,'o','LineWidth',2)
a prvních deset hodnot (ze 45 celkem) numeric‐ kého řešení je 4
x 0 0.0215 0.0431 0.0646 0.0861 0.1236 0.1611 0.1986 0.2361 0.2736
y 1.0000 1.0437 1.0888 1.1351 1.1826 1.2679 1.3562 1.4470 1.5400 1.6347
v1 2.0000 2.0630 2.1226 2.1790 2.2319 2.3160 2.3896 2.4525 2.5048 2.5465
v2 3.0000 2.8482 2.6942 2.5382 2.3806 2.1024 1.8209 1.5373 1.2527 0.9687
2
0
-2
-4
-6
y(x) v1=dy/dx Obrázek 7‐6 Průběh řešení diferenciální rovnice 2 2 v2=d y/dx
-8
KŘP/IMSW Modelování ve výpočtových software
0
7‐11 (20) 4.7.12
0.5
1
1.5
František Dušek KŘP FEI Univerzita Pardubice
7.3 Příklady na procvičení V kapitole 7.3.1 jsou zadání a v kapitole 7.3.2 řešení jednoduchých příkladů na probíranou problematiku. Pro řešení příkladů jsou nutné znalosti z prvních čtyř bloků. Předpokládá se, že při řešení příkladů má čtenář k dispozici MATLAB a aktivně využívá nápovědu k programu.
7.3.1 Zadání příkladů Př01. Jednoduchý určitý integrál – nalezněte řešení 2π
∫
1
b) cos(n arccos( x ) )dx pro n=1, 2, 3, 4, 5
∫
2
a) cos ( x)dx
−1
0
Př02. Dvojný určitý integrál – nalezněte řešení π π
a)
∫π ∫π
1 + sin( x) cos( y )dxdy
− −
b)
∫∫ x sin( y) + y cos( x)dxdy kde oblast S je popsaná rovnicí x
2
+ y 2 ≤ 1 .
S
Př03. Trojný určitý integrál – nalezněte řešení π π π
a)
⎛ xyz
∫π ∫π ∫π cos⎜⎝
− − −
⎞⎟dxdydz
π3⎠
b) Pomocí trojného integrálu určete objem krychle o délce strany 2. Návod: využijte vzorec
∫∫∫ dxdydz pro výpočet objemu a integrační oblast V
tvaru krychle Př04. Využití určitých integrálů. a) Výpočet délky křivky. Vypočtěte délku spirály popsané parametrickými rov‐ nicemi x(t ) = t cos(t ) y (t ) = t sin(t ) pro 0 ≤ t ≤ 2π. Návod: využijte vztah pro výpočet délky křivky popsané parametrickými rovni‐ cemi L =
t2
∫ t1
2
2
⎛ dx ⎞ ⎛ dy ⎞ ⎜ ⎟ + ⎜ ⎟ dt . ⎝ dt ⎠ ⎝ dt ⎠
b) Výpočet objemu rotačního tělesa. Vypočtěte objem tělesa vzniklého rotací křivky y ( x) = xe − x kolem osy x pro 0 ≤ x ≤ 5. Návod: využijte vztah pro výpočet objemu rotačního tělesa, jehož plášť vznikne rotací křivky y=f(x) kolem osy x v mezích a ≤ x ≤ b V = π
b
∫f
2
( x)dx .
a
KŘP/IMSW Modelování ve výpočtových software
7‐12 (20) 4.7.12
František Dušek KŘP FEI Univerzita Pardubice
c) Výpočet plochy rovinného útvaru. Vypočtěte plochu elipsoidu popsaného rovnicí
x2 y2 + = 1 pomocí dvojného integrálu a výsledek ověřte výpočtem a 2 b2
s jednoduchým integrálem pro ekvivalentní popis parametrickými rovnicemi x(t ) = a cos(t ) y (t ) = b sin(t ) 0 ≤ t ≤ 2π pro a=2 a b=3. Návod: využijte vztahy pro výpočet plochy rovinného obrazce nad danou uza‐ vřenou oblastí O(x,y) S =
t2
∫∫ dxdy a S = ∫ f (t ) g ′(t )dt pokud je oblast da‐
t1 ná parametrickými rovnicemi x=f(t) a y=g(t) O( x, y )
Př05. Diferenciální rovnice – nalezněte řešení a nakreslete jeho průběh a)
dx + x2 = t 2 dt
x(t = 0) = 1 0 ≤ t ≤ 10
d 2z dz dz + x 2 = 2 z ( x = 0) = 1 = −1 0 ≤ x ≤ 6 b) 2 + x dx dx dx x=0 y′′ + y′ − x = 2te − t c) x′′ + 2 x′ + y = te −t
y (t = 0) = +1 y′(t = 0) = 2 x(t = 0) = −1 x′(t = 0) = 0 0≤t ≤5
Př06. Dráha střely – využití diferenciální rovnice Nakreslete dráhu střely v gravitačním poli země (g=9.81 m.s‐2)vystřelené pod úhlem α v prvních 10 s po opuštění hlavně (ústí hlavně je h0=1 m nad povr‐ ‐1 h chem, úsťová rychlost v0=800 m.s ) při uvažování odporu prostředí úměrného kvadrátu rychlosti (konstanta úměrnosti je k=0.004 m‐1). Průběh dráhy nakreslete pro hodnoty α=20°, 30°, 40°, v0 50°, 60° a 70° do jednoho grafu. Časový průběh výškové α (h) i délkové (x) souřadnice je x popsán dife‐ h0 renciálními rovnicemi ve tvaru
d 2h dh dh +k + g = 0 h(t = 0) = h0 2 dt dt dt d 2x dx dx +k + g = 0 x(t = 0) = 0 2 dt dt dt
KŘP/IMSW Modelování ve výpočtových software
dh = v0 sin(α ) dt t =0 dx = v0 cos(α ) dt t =0
7‐13 (20) 4.7.12
František Dušek KŘP FEI Univerzita Pardubice
Řešení příkladů Př01. Jednoduchý určitý integrál – nalezněte řešení 2π
∫
2 a) cos ( x)dx =3.1416 0
>> I=quadl(@(x) cos(x).^2,0,2*pi) I = 3.1416 1
b) cos(n arccos( x ) )dx pro n=1, 2, 3, 4, 5
∫
−1
>> ans ans ans ans ans
for n=1:5,quadl(@(x) cos(n*acos(x)),-1,1), end = 1.1126e-016 = -0.6667 = 9.6435e-017 = -0.1333 = 1.9547e-016
Př02. Dvojný určitý integrál – nalezněte řešení π π
a)
∫∫
1 + sin( x) cos( y )dxdy =37.8239
−π −π
>> I=dblquad(@(x,y) sqrt(1+sin(x)*cos(y)),-pi,pi,-pi,pi) I = 37.8239
b)
∫∫ xy cos(1 + xy)dxdy kde oblast S je popsaná rovnicí x
2
+ y2 ≤ 1
S
Dvojný integrál přes oblast S lze integrovat přes libovolnou obdélníkovou ob‐ last (zahrnující oblast S) pokud při vyhodnocení funkce pod integrálem je za‐ jištěno, že tato vrací hodnotu 0 pro hodnoty x a y mimo oblast S. Pro body v oblasti S platí ‐1 ≤ x ≤ 1 a současně y2 ≤ 1‐x2. Vytvoříme‐li tedy např. funkci Funkce.m ===================================================== function z=Funkce(x,y) % zápis funkce pod integrálem s kontrolou definičního oboru % parametr x může být vektor n=length(x); z=zeros(size(x)); for k=1:n, if (x(k)^2<=1) && (y^2<=1-x(k)^2), z(k)=x(k)*y*cos(1+x(k)*y); else z(k)=0; end end ===================================================== Funkce.m
pak se řešení nalezne příkazem (pro libovolné meze zahrnující oblast S) >> I=dblquad(@Funkce,-2,3,-3,5) I = -0.1080
KŘP/IMSW Modelování ve výpočtových software
7‐14 (20) 4.7.12
František Dušek KŘP FEI Univerzita Pardubice
Př03. Trojný určitý integrál – nalezněte řešení π π π
a)
⎛ xyz
∫π ∫π ∫π cos⎜⎝
− − −
⎞⎟dxdydz =243.5384
π3⎠
>> I=triplequad(@(x,y,z) cos(x*y*z/pi^3),-pi,pi,-pi,pi,-pi,pi) I = 243.5384
b) Pomocí trojného integrálu určete objem krychle o délce strany 2. Funkce pod integrálem musí pro všechny hodnoty x, y a z vracet hodnotu 1 a zároveň musí pro vektor hodnot x vracet vektor funkčních hodnot. Řešení tedy je např. >> I=triplequad(@(x,y,z) ones(size(x)),0,2,0,2,0,2) I = 8
Př04. Využití určitých integrálů. a) Vypočtěte délku spirály x(t ) = t cos(t )
y (t ) = t sin(t ) pro 0 ≤ t ≤ 2π.
výpočet potřebných derivací
d (t cos(t ) ) = cos(t ) − t sin(t ) dt
d (t sin(t ) ) = sin(t ) + t cos(t ) dt
výpočetní vztah t2
L=∫ t1
2
2
⎛ dx ⎞ ⎛ dy ⎞ ⎜ ⎟ + ⎜ ⎟ dt = ⎝ dt ⎠ ⎝ dt ⎠
2π
∫ [cos(t ) − t sin(t )] + [sin(t ) + t cos(t )] dt 2
2
0
příkazy MATLABu >> f=@(t) sqrt((cos(t)-t.*sin(t)).^2+(sin(t)+t.*cos(t)).^2); >> L=quadl(f,0,2*pi) L = 21.2563
b) Výpočet objemu rotačního tělesa. Vypočtěte objem tělesa vzniklého rotací křivky y ( x) = xe − x kolem osy x pro 0 ≤ x ≤ 5. b
5
( )
V = π ∫ f ( x)dx = π ∫ xe− x dx 2
a
0
2
příkazy MATLABu >> V=pi*quadl(@(x) (x.*exp(-x)).^2,0,5) V = 0.7832
c) Výpočet plochy rovinného útvaru O(x,y):
x2 y2 + = 1 pomocí dvojného a2 b2
integrálu a jednoduchým integrálem pro ekvivalentní popis parametrickými rovnicemi x (t ) = a cos(t ) y (t ) = b sin(t ) 0 ≤ t ≤ 2π pro a=2 a b=3. Chceme‐li použít dvojný integrál a oblast O(x,y) není obdélníková, je nutné zajistit, aby pomocná funkce pod integrálem vracela hodnotu 1 pouze pro
(
2 2 2 2 hodnoty x a y z oblasti O (jinak hodnotu 0) tj. x ≤ a ∧ y ≤ b 1 − x
2
a2
).
KŘP/IMSW Modelování ve výpočtových software
7‐15 (20) 4.7.12
František Dušek KŘP FEI Univerzita Pardubice
Pomocná funkce s parametry a,b Funkce.m ===================================================== function z=Funkce(x,y,a,b) % zápis funkce pod integrálem s kontrolou definičního oboru % parametr x může být vektor n=length(x); z=zeros(size(x)); for k=1:n, if (x(k)^2<=a^2) && (y^2<=b^2*(1-(x(k)/a)^2), z(k)=1; else z(k)=0; end end ===================================================== Funkce.m
příkazy MATLABu >> a=2; b=3; >> S1=dblquad(@(x,y) Funkce(x,y,a,b),-a,a,-b,b) S1 = 18.8495
Při použití jednoduchého integrálu a parametricky zadané oblasti je nutné určit derivaci g ′ = b cos(t ) a výpočetní vztah pak je S =
2π
∫ ab cos (t )dt 2
0
příkazy MATLABu >> S2=quadl(@(t) a*b*cos(t).^2,0,2*pi) S2 = 18.8496
Př05. Diferenciální rovnice – nalezněte řešení a nakreslete jeho průběh a)
dx + x2 = t 2 dt
x(t = 0) = 1 0 ≤ t ≤ 10
10
9
příkazy MATLABu
8
>> [t,X]=ode45(@(t,x) t^2-x^2,[0,10],1); >> plot(t,X) >> grid
7
6
5
d 2z dz + x + x2 = 2 2 dx dx dz = −1 b) z ( x = 0) = 1 dx x=0
4
3
2
1
0
0≤ x≤6
0
1
2
3
4
5
6
7
8
9
10
převod na soustavu dvou rovnic řádu prvního
⎡z⎤ ⎡ z (0) = 1 ⎤ Z = ⎢ ⎥ Z0 = ⎢ ⎥ ⎣v ⎦ ⎣v(0) = −1⎦ ⎤ dZ ⎡ z′ = v = dx ⎢⎣v′ = 2 − x 2 − xv ⎥⎦ KŘP/IMSW Modelování ve výpočtových software
7‐16 (20) 4.7.12
František Dušek KŘP FEI Univerzita Pardubice
zápis ve formě m‐funkce Funkce.m =========================== function dZ=Funkce(x,Z) % zápis soustavy dif. rovnic
2 z v 0
% pomocné proměnné pro přehlednost z=Z(1); v=Z(2); dZ=[v; 2-x^2-x*v]; =========================== Funkce.m
-2
-4
-6
příkazy MATLABu >> >> >> >> >> >>
-8
Z0=[1;-1]; [x,Z]=ode45('Funkce',[0,6],Z0); h=plot(x,Z); grid legend('z','v') set(h(1),'LineWidth',3)
y′′ + y′ − x = 2te − t c) x′′ + 2 x′ + y = te
−t
-10
-12
0
1
2
3
4
5
6
y (t = 0) = +1 y′(t = 0) = 2 x(t = 0) = −1 x′(t = 0) = 0 0≤t ≤5
převod na soustavu dvou rovnic řádu prvního
⎡y⎤ ⎢y ⎥ Z = ⎢ 1⎥ ⎢x⎥ ⎢ ⎥ ⎣ x1 ⎦
⎡ y ( 0) = 1 ⎤ ⎢ y (0) = 2 ⎥ ⎥ Z0 = ⎢ 1 ⎢ x(0) = −1⎥ ⎥ ⎢ ⎣ x1 (0) = 0 ⎦
⎡ y′ ⎢ dZ ⎢ y1′ = dx ⎢ x′ ⎢ ⎣ x1′
= y1 ⎤ −t = 2te + x − y1 ⎥⎥ ⎥ = x1 ⎥ = te −t − y − 2 x1 ⎦
zápis ve formě m‐funkce 3
Funkce.m =========================== function dZ=Funkce(t,Z) % zápis soustavy dif. rovnic
2
1
% pomocné proměnné pro přehlednost y=Z(1); y1=Z(2); x=Z(3); x1=Z(4); dZ=zeros(4,1); dZ(1)=y1; dZ(2)=2*t*exp(-t)+x-y1; dZ(3)=x1; dZ(4)=t*exp(-t)-y-2*x1; =========================== Funkce.m
0
-1
-2
-3
příkazy MATLABu >> >> >> >> >> >>
y y1 x x1
-4
0
0.5
1
1.5
2
2.5
3
3.5
4
4.5
5
Z0=[1;2;-1;0]; [x,Z]=ode45(@Funkce,[0,5],Z0); h=plot(x,Z); grid legend('y','y1','x','x1') set(h([1,3]),'LineWidth',3)
KŘP/IMSW Modelování ve výpočtových software
7‐17 (20) 4.7.12
František Dušek KŘP FEI Univerzita Pardubice
Př06. Dráha střely – využití diferenciální rovnice Nakreslete dráhu střely v gravitačním poli země (g=9.81 m.s‐2)vystřelené pod úhlem α v prvních 10 s po opuštění hlavně (ústí hlavně je h0=1 m nad povr‐ chem, úsťová rychlost v0=800 m.s‐1) při uvažování odporu prostředí úměrné‐ ho kvadrátu rychlosti (konstanta úměrnosti je k=0.004 m‐1). Průběh dráhy nakreslete pro hodnoty α=20°, 30°, 40°, 50°, 60° a 70° do jednoho grafu. Ča‐ sový průběh výškové (h) i délkové (x) souřadnice je popsán diferenciálními rovnicemi ve tvaru
d 2h dh dh +k + g = 0 h(t = 0) = h0 2 dt dt dt d 2x dx dx +k + g = 0 x(t = 0) = 0 2 dt dt dt
dh = v0 sin(α ) dt t =0 dx = v0 cos(α ) dt t =0
Převod na soustavu čtyř diferenciálních rovnic prvního stupně
⎡h⎤ ⎡h(0) = h0 ⎤ ⎢v ⎥ ⎢v (0) = v sin(α ) ⎥ 0 ⎥ Z = ⎢ h ⎥ Z0 = ⎢ h ⎢x⎥ ⎢ x(0) = 0 ⎥ ⎢ ⎥ ⎢ ⎥ ⎣v x ⎦ ⎣ x1 (0) = v0 cos(α )⎦
⎡h′ ⎢ dZ ⎢v′h = dx ⎢ x′ ⎢ ⎣v′x
= vh
⎤ = − g − k vh vh ⎥⎥ ⎥ = vx ⎥ = − k vx vx ⎦
zápis ve formě m‐funkce Funkce.m ===================================================== function dZ=Funkce(t,Z,k) % zápis soustavy diferenciálních rovnic % s parametrem k % pomocné proměnné pro přehlednost zápisu h=Z(1); vh=Z(2); x=Z(3); vx=Z(4); g=9.81; % vektor derivací musí být sloupcový dZ=zeros(4,1); dZ(1)=vh; dZ(2)=-g-k*abs(vh)*vh; dZ(3)=vx; dZ(4)=-k*abs(vx)*vx; ==================================================== Funkce.m
příkazy MATLABu (skript) skript.m ===================================================== % skript pro výpočet dráhy střely v0=800; % úsťová rychlost ko=0.004; % odpor prostředí h0=1; % výška ústí hlavně x0=0; % x-ová poloha ústí (vzdálenost) al=[20,30,40,50,60,70]; % náměr ve stupních % příprava pro vykreslení drah střely axes % prázdný graf hold on % režim překreslování te=cell(size(al)); % pro text legendy % pole buněk - řetězce pro barvy grafů co={'b','g','r','c','m','k','b','g','r','c','m','y','k'};
KŘP/IMSW Modelování ve výpočtových software
7‐18 (20) 4.7.12
František Dušek KŘP FEI Univerzita Pardubice
for k=1:length(al), alr=al(k)*pi/180; % převod na radiány vh0=v0*sin(alr); % poč. rychlost v h vx0=v0*cos(alr); % poč. rychlost v x Z0=[h0;vh0;x0;vx0]; % poč. podmínky [t,Z]=ode45(@(t,Z) Funkce(t,Z,ko), [0,20],Z0); x=Z(:,3); % časový průběh dráhy (vzdálenost) y=Z(:,1)'; % časový průběh dráhy (výška) hp=plot(x,y,co{k},'LineWidth',2); te{k}=sprintf('uhel %2d ^o',al(k)); end grid legend(te,'Location','NorthWest') ==================================================== skript.m
700 uhel 20 o uhel 30 o 600
uhel 40 o uhel 50 o uhel 60 o
500
uhel 70 o 400
300
200
100
0
-100
0
200
400
600
800
1000
1200
KŘP/IMSW Modelování ve výpočtových software
7‐19 (20) 4.7.12
František Dušek KŘP FEI Univerzita Pardubice
Pojmy k zapamatování Okruhy problémů: výpočet určitých integrálů (jednoduchý, dvojný a troj‐ ný), výpočet plochy a objemu, numerické řešení obyčejných diferenciál‐ ních rovnic Použité nástroje:
Příkazy a funkce:
dblquad, ode45, quadl, triplequad
Otázky na procvičení 1.
2. 3. 4. 5.
Uvádí se, že geometrická interpretace určitého integrálu nějaké funkce je plocha shora ohraničená danou funkcí a zdola osou x. V čem je tato před‐ stava nepřesná? Funkce MATLABu pro výpočet dvojného a trojného určitého integrálu nej‐ sou úplně obecné. Jaké mají omezení? Jaký je rozdíl mezi analytickým a numerickým řešením diferenciální rovni‐ ce? Proč je potřeba pro numerické řešení v MATLABu převést ODE vyššího řádu na soustavu ODE řádu prvého? Co je nutné kromě diferenciální rovnice ještě znát pro výpočet numerické‐ ho řešení?
Odkazy a další studijní prameny
•
on‐line dokumentace k programu nebo www.mathworks.com/help/ – části „Numerical Integration (Quadrature)“, „Ordinary Differential Equations“
KŘP/IMSW Modelování ve výpočtových software
7‐20 (20) 4.7.12
František Dušek KŘP FEI Univerzita Pardubice
8 Hledání extrému funkce (optimalizace) Studijní cíl V osmém bloku uvedeme řešení poslední důležité matematické úlohy – hledání extrému funkce. Na hledání extrému vede většina řešení optimalizačních úloh. Zabývat se budeme pouze dvěma základními funkcemi na hledání extrému funkce, které jsou k dispozici v základním MATLABu. Další specializované efek‐ tivnější funkce na hledávání extrému funkcí ve zvláštních případech jsou sou‐ částí Optimization Toolbox. V řešených příkladech na konci bude ukázáno i použití kombinací několika funkcí funkcí.
Doba nutná k nastudování
2 ‐ 3 hodiny
Průvodce studiem Předpokládá se, že čtenář je seznámen s prostředím MATLABu, základními příkazy, tvorbou grafů a tvorbou skriptů a funkcí v rozsahu prvních čtyř bloků. Ze šestého bloku jsou potřeba znalosti o předávání funkce jako parametru jiné funkce. Pro řešení příkladů jsou též potřeba znalosti řešení úloh hledání kořene funkce, výpočtu určitého integrálu a diferenciálních rovnic. Při studiu je vhodné mít spuštěný MATLAB a jednotlivé příkazy či funkce hned vyzkoušet a případně získat podrobnější informace využíváním nápovědy k programu. Pro odzkouše‐ ní příkazů z oblasti specializovaných optimalizačních výpočtů je potřeba mít instalován také Optimization Tbx. Na závěr jsou opět uvedeny řešené příklady na procvičení. V textu jsou použity následující typografické konvence: Calibri 11, Bold, Italic nové pojmy či informace k zapamatování Calibri 11 označení klávesy Courier New 10, Bold názvy nástrojů MATLABu Courier New 10, Bold upřesnění nápovědy (help téma) Courier New 10 názvy příkazů, funkcí a objektů Courier New 10 označení části příkazu, která se může vynechat Courier New 10, Italic názvy proměnných použitých v programu Courier New 9 příkaz příkazové řádky / výpis programu Courier New 9 výpis programu – klíčová slova Courier New 9 výpis programu – řetězec Courier New 9 výpis programu – komentář
KŘP/IMSW Modelování ve výpočtových software
8‐1 (20) 23.10.11
František Dušek KŘP FEI Univerzita Pardubice
8.1 Extrém funkce více proměnných Úloha hledání extrému funkce jedné či více proměnných znamená nalézt polo‐ hu (tj. souřadnice) největší (maximum) či nejmenší (minimum) hodnoty dané funkce. Obvyklý zápis úlohy pro funkci n proměnných y=f(x) x∈Rn je ve tvaru
x* = arg minn f (x)
pro minimum
x* = arg max f (x) n
pro maximum
x∈R
x∈R
Takto formulovaná úloha znamená nalezení globálního 1 extrému a je obecně neřešitelná tj. neexistuje postup řešení, který by garantoval nalezení globálního extrému v případě obecné nelineární funkce na celém definičním oboru. Proto se úloha nalezení extrému funkce obvykle zúžuje na nalezení lokálního extré‐ mu buď v okolí zadaného bodu, nebo na zadaném omezeném intervalu. S úlohou hledání extrému y=f(x) y E1 funkce na omezené oblasti E3 E5 (intervalu) je spojen pro‐ blém, že extrém může ležet E6 x x2 x4 na hranici oblasti (intervalu). Situace je ukázána na Obrázku a x1 x3 x5 x6 b 8‐1 kde je znázorněn průběh E2 funkce jedné proměnné E4 y=f(x), která má na intervalu Obrázek 8‐1 Extrémy funkce a ≤ x ≤ b šest extrémů E1 – E6 ale největší hodnota funkce (globální extrém funkce na intervalu) je v pravém krajním bodě intervalu. Samostatnou úlohou je hledání vázaného extrému tj. doplnění základní úlohy o dodatečnou podmínku, že extrém musí ležet na průniku dané funkce s další (omezující) funkcí. Další variantou základní úlohy je hledání extrému funkce v určité oblasti nezávisle proměnných tj. s omezením ve tvaru nerovností či s omezením pouze na celočíselné hodnoty nezávisle proměnných. Řešení může být buď analytické (souřadnice extrému jsou analytickým řešením rovnic vycházejících z podmínek pro existenci extrému aplikovaných na danou funkci), numerické (algoritmus jak vyčíslováním dané funkce v různých bodech určit polohu extrému s požadovanou přesností) nebo grafické, kde polohu ex‐ trému odečteme z grafu průběhu funkce 2 .
8.1.1 Základní funkce MATLABu pro hledání minima funkce V základním MATLABu jsou pouze dvě funkce pro numerický výpočet minima funkce – funkce 1
Globální extrém znamená největší (nejmenší) hodnota funkce na dané oblasti
2
Je zřejmé, že grafické řešení lze použít pouze pro funkce, jejichž průběh dokážeme nakreslit tj. pro funkce jedné a dvou proměnných (x∈R a x∈R2)
KŘP/IMSW Modelování ve výpočtových software
8‐2 (20) 23.10.11
František Dušek KŘP FEI Univerzita Pardubice
x=fminbnd(f,xmin,xmax)
pro vyhledání lokálního minima funkce jedné proměnné y=f(x) na intervalu xmin ≤ x ≤ xmax a funkce x=fminsearch(f,x0)
pro vyhledání lokálního minima funkce více proměnných y=f(x) v neomezeném okolí bodu x0. V případě funkce fminsearch nelze vymezit oblast (rozsah) nezávisle proměnných, v rámci které se bude hledat řešení. Bližší informace o obou funkcích viz help fminbnd a help fminsearch. V obou případech je nutné popsat funkci, jejíž minimum hledáme, vlastní uži‐ vatelskou funkcí. V prvním případě je argumentem uživatelské funkce jedna hodnota nezávisle proměnné (skalár) a v druhém případě vektor hodnot nezá‐ visle proměnných. Jak nalézt maximum funkce, y=f(x) y E1 když MATLAB nabízí pouze E3 E4* E5 funkce pro hledání minima? * E2 E6 Vyhledání minima je jednodu‐ x x2 x4 ché pokud si uvědomíme, že a x1 x3 x5 x6 b maximum funkce f(x) je mini‐ E E 2 6* mem funkce –f(x) a poloha E3* E4 E5* (hodnota x) je v obou přípa‐ y=f*(x)= - f(x) E1* dech stejná. Situaci ilustruje Obrázek 8‐2. Protože vždy musí‐ Obrázek 8‐ 2 Extrémy funkce me definovat funkci, jejíž ex‐ trém hledáme, stačí její jednoduchá modifikace pro vyhledání maxima. Výhodou řešení v prostředí MATLABu je, že máme k dispozici i všechny ostatní jeho možnosti. Je tedy snadné, pokud to úloha vůbec umožňuje (viz pozn. 2), nakreslit průběh funkce a určit počet a přibližnou polohu extrémů z grafu.
8.1.2 Použití základních funkcí fminbnd a fminsearch Vyhledání lokálního minima funkce jedné proměnné na uzavřeném intervalu x=fminbnd(f,xmin,xmax)
určení minima funkce
Úloha je‐li známa funkce y=f(x) a x* = arg min f (x ) x∈〈 xmin , xmax interval xmin ≤ x ≤ xmax urči polo‐ hu a hodnotu minima Příklad 1 y = ( x − 1) cos( x ) − π ≤ x ≤ 2π Řešení pro získání představy o polohách extrémů funkce nejprve nakresleme její průběh na zadaném intervalu, pak získáme polohu minima a vykreslíme nalezené mi‐ nimum do grafu (graf je dále manuálně upraven) >> >> >> >> xr
x=linspace(-pi,2*pi,1000); plot(x,(x-1).*cos(x)) grid xr=fminbnd(@(x) (x-1).*cos(x),-pi,2*pi) = 3.5194
KŘP/IMSW Modelování ve výpočtových software
8‐3 (20) 23.10.11
x
6 5 4 3 2 1 0 -1 -2 -3 -4
-2
0
2
4
6
František Dušek KŘP FEI Univerzita Pardubice
8
>> hold on >> plot(xr,(xr-10.*cos(xr),'or')
Příklad 2 y = x cos( x) − π ≤ x ≤ 4π Řešení pro získání představy o polohách extrémů funkce nejprve nakresleme její průběh na zadaném intervalu, pak získáme polohu minima a vykreslíme nalezené mi‐ nimum do grafu >> >> >> >> xr >> >>
x=linspace(-pi,4*pi,1000); plot(x,x.*cos(x),'LineWidth',4) grid xr=fminbnd(@(x) x.*cos(x),-pi,4*pi) = 3.4256 hold on plot(xr,xr*cos(xr),'or','LineWidth',4)
15
10
5
0
-5
Vyhledání lokálního minima funkce více proměnných v okolí zadaného bodu x=fminsearch(f,x0)
-10 -4
-2
0
2
4
6
8
10
12
14
určení minima funkce
Úloha je‐li známa funkce y=f(x) a bod x0 urči polohu x* = arg min f (x ) x∈〈 xmin , xmax 〉 a hodnotu minima v okolí zadaného bodu 2 Příklad nalezněte všechny extrémy funkce y = x − 1 cos( x − 1) na intervalu − π ≤ x ≤ 2π Řešení vytvoříme pomocnou funkci y=Funkce(x) x
(
)
Funkce.m ================================================= function y=Funkce(x) % zápis dovolujícím vektor jako vstupní parametr je pro % možnost použít funkci jednoduše pro vykreslení průběhu y=(x.^2-1).*cos(x-1); ================================================= Funkce.m
pro získání představy o polohách extrémů funkce nejprve nakresleme její prů‐ běh na zadaném intervalu >> >> >> >>
x=linspace(-pi,2*pi,1000); y=Funkce(x); plot(x,y,'LineWidth',4) grid
25
20
15
odhadneme polohu jednotlivých minim,
10
>> x0=[-2, 1, 5];
5
získáme polohu minim >> >> >> >> >> >>
xr(1)=fminsearch('Funkce',x0(1)); yr(1)=Funkce(xr(1)); xr(2)=fminsearch('Funkce',x0(2)); yr(2)=Funkce(xr(2)); xr(3)=fminsearch('Funkce',x0(3)); yr(3)=Funkce(xr(3));
0
-5
-10
-15
-20 -4
odhadneme polohu jednotlivých maxim,
-2
0
2
4
6
>> x0=[-1,2];
získáme polohu maxim s využitím funkce symetrické podle osy x (f*(x)=‐f(x)) >> >> >> >>
xr(4)=fminsearch(@(x) -Funkce(x),x0(1)); yr(4)=Funkce(xr(4)); xr(5)=fminsearch(@(x) -Funkce(x),x0(2)); yr(5)=Funkce(xr(5));
získáme polohu maxima v pravém krajním bodu intervalu >> xr(6)=x(end);
KŘP/IMSW Modelování ve výpočtových software
8‐4 (20) 23.10.11
František Dušek KŘP FEI Univerzita Pardubice
8
>> yr(6)=Funkce(xr(6));
výsledky přidáme do grafu
25
>> hold on >> h=plot(xr,yr,'or','LineWidth',4); >> set(h,'MarkerSize',10)
20
15
výpis souřadnic minim
10
>> [xr(1:3)',yr(1:3)'] ans = -2.8226 -5.4130 0.3416 -0.6987 4.5722 -18.0879
5
0
-5
výpis souřadnic maxim >> [xr(4:6)',yr(4:6)'] ans = -0.7965 0.0818 1.9483 1.6302 6.2832 20.7900
-10
-15
-20 -4
-2
0
2
4
6
x
Úloha je‐li známa funkce z=f(x,y) a bod {x0, y0} urči * x = arg min f (x ) x∈〈 xmin , xmax 〉 polohu a hodnotu minima v okolí zadaného bodu Příklad nalezněte globální extrémy funkce
1 − x 2 + y 1− Řešení vykreslíme danou funkci na vhodně z ( x, y ) = e y2 +1 velkém intervalu, abychom odhadli polohu
x2 + y2 5
minima a maxima, které by mohly být globální >> >> >> >>
x=linspace(-5,5,50); y=linspace(-2.5,3.5,50); [X,Y]=meshgrid(x,y); Z=(1-X.^2+Y)./(Y.^2+1).*exp(1-(2*X.^2+Y.^2)/5);
vykreslení dané funkce >> subplot(1,2,1) >> mesh(x,y,Z), xlabel('osa x'), ylabel('osa y')
vykreslení „vrstevnic“ dané funkce >> subplot(1,2,2) >> contour(x,y,Z);
3 4 2 2 osa y
1 0
0
-2 4
-1 2
5 0 -2 osa y
-2
0 -4
-5
-5
osa x
0 osa x
5
vyhledání handle objektu „hggroup“ v aktuálním grafu (axes) = vrstevnice >> hc=findobj(gca,'Typ','hggroup');
nastavení vzdálenosti „vrstevnic“ na 0.1 (implicitně je 0.5) >> set(hc,'LevelStep',0.1); >> xlabel('osa x'), ylabel('osa y'), grid
vytvoříme pomocnou funkci z=Funkce(x) Funkce.m =================================================
KŘP/IMSW Modelování ve výpočtových software
8‐5 (20) 23.10.11
František Dušek KŘP FEI Univerzita Pardubice
8
function z=Funkce(X) % funkce dvou proměnných x=X(1); y=X(2); z=(1-x^2+y)/(y^2+1)*exp(1-(2*x^2+y^2)/5); ================================================= Funkce.m
z grafů určíme přibližnou polohu dvou kandidátů na globální minimum a určí‐ me polohy a hodnoty obou extrémů >> xmin1=-2; ymin1=-0.1; >> min1=fminsearch(@Funkce,[xmin1;ymin1]) min1 = -1.8246 -0.1707 >> zmin1=Funkce(min1) zmin1 =-1.7333 >> xmin2=2; ymin2=-0.1; min2 = 1.8246 -0.1707 >> min2=fminsearch(@Funkce,[xmin2;ymin2]) >> zmin2=Funkce(min2) zmin2 =-1.7333
dále určíme odhad polohy maxima a určíme polohu přesně >> xmax0=0; ymax0=0.5; >> max=fminsearch(@(x) -Funkce(x),[xmax0;ymax0]) max = 0.0000 0.3403 >> zmax=Funkce(max) zmax = 3.1904
Daná funkce má jedno globální maximum a dvě stejně velká globální minima.
8.2 Další funkce – Optimization Tbx Velmi stručně se zmíníme o některých funkcích Optimization Toolboxu pro řešení některých důležitých úloh ‐ minimum (nelineární) funkce více proměnných s omezeními ‐ lineární programování ‐ kvadratické programování ‐ řešení soustavy nelineárních algebraických rovnic
8.2.1 Minimum funkce více proměnných s omezeními Úloha vyhledání lokálního minima funkce více proměnných (pokud existuje) v okolí zadaného bodu za existence různých typů omezení na oblast, kde se může hledaný vektor nalézat. Jednotlivé typy omezení lze vynechat či požado‐ vat všechna současně ale aspoň jeden typ omezení musí být zadán. Pokud chci vynechat parametr, za kterým následují další platné parametry, uvede se prázdná matice []. Blíže viz help fmincon x=fmincon(f,x0,A,b,Aeq,beq,lb,ub,fnl,option) Úloha je‐li známa funkce více proměnných x* = arg minn f (x ) x∈R (vektor x) y=f(x) a bod x0 urči polohu minima v okolí zadaného bodu za existence omezení Ax ≤ b A eq x = b eq lb ≤ x ≤ ub typu lineární nerovnosti Ax≤b, lineární c(x) ≤ 0 c eq (x) = 0 rovnosti Aeqx=beq, dolního a horního omezení lb≤x≤ub a nelineární nerovnosti c(x)≤0 a rovnosti ceq(x)=0 popsaných funkcí [c; ceq]=fnl(x) KŘP/IMSW Modelování ve výpočtových software
8‐6 (20) 23.10.11
František Dušek KŘP FEI Univerzita Pardubice
Příklad nalezněte lokální minimum funkce tří proměnných
y=
5 + x1 [x1 + x2 + x3 − 3] + x2 ( x2 − x3 ) + x32 1 + x12 + x22 + x32
v okolí bodu x0={1;2;3} při splnění omezení s parametrem R=5,3,2 lineární nerovnost − 10 ≤ x1 + 2 x2 + 3x3 ≤ 15 horní a dolní omezení − 5 ≤ x1 ≤ 5
− 5 ≤ x2 ≤ 5 − 5 ≤ x3 ≤ 5
nelineární omezení x + x + x ≤ R 2 Řešení vytvoříme funkci, která se má minimalizovat y=Funkce(x) 2 1
2 2
2 3
Funkce.m ================================================= function y=Funkce(X) % nelineární funkce tří proměnných x1=X(1); x2=X(2); x3=X(3); y=5+x3^2+x1*(x1-7*x2+x3-5)+x2*(x2-x3); y=y/(1+x1^2+x2^2+x3^2); ================================================= Funkce.m
vytvoříme funkci nelineárních omezení s parametrem R [c,ceq]=Fnl(x,R) vychá‐ zející z přepisu zadané formy do požadovaného tvaru c(x)≤0
x12 ≤ x22 + x32 − R 2 x12 + x22 + x32 ≤ R 2
⇔
x22 ≤ x12 + x32 − R 2 x32 ≤ x12 + x22 − R 2
Fnl.m ===================================================== function [c,ceq]=Fnl(X,R) % nelineární omezení pro fmincon x1=X(1); x2=X(2); x3=X(3); % pro nerovnost c(X)<=0 c= [x2^2+x3^2-R^2; x1^2+x3^2-R^2; x2^2+x3^2-R^2]; % pro rovnost ceq(X)=0 ceq=[]; ==================================================== Fnl.m
vytvoříme parametry A, b omezení typu lineární nerovnosti vycházející z přepisu zadané formy do požadovaného maticového tvaru Ax≤b
− 10 ≤ x1 + 2 x2 + 3 x3 ≤ 15 ⇔
− x1 − 2 x2 − 3 x3 ≤ 10 x1 + 2 x2 + 3 x3 ≤ 15
⎡ x1 ⎤ ⎡− 1 − 2 − 3⎤ ⎢ ⎥ ⎡10⎤ x2 ≤ ⎢1 2 3 ⎥⎦ ⎢ ⎥ ⎢⎣15⎥⎦ ⎣ ⎢⎣ x3 ⎥⎦
>> A=[-1,-2,-3;1,2,3]; b=[10;15];
vytvoříme parametry lb, ub horního a dolního omezení a výchozí bod x0 >> lb=[-5;-5;-5]; ub=[5;5;5]; >> x0=[1;2;3];
můžeme zkontrolovat, zda výchozí bod x0 splňuje zadaná omezení včetně neli‐ neárního pro R=3 a 2 (splnění indikují hodnoty 1) >> k1=((A*x0)<=b)’ k1 = 1 1 >> k3=((lb<=x0)&(x0<=ub))‘
KŘP/IMSW Modelování ve výpočtových software
8‐7 (20) 23.10.11
František Dušek KŘP FEI Univerzita Pardubice
k3 >> >> k4
= 1 1 1 [c,ceq]=Fnl(x0,3); k4=(c<=0)‘ = 1 1 1
>> [c,ceq]=Fnl(x0,2); >> k4=(c<=0)‘ k4 = 0 0 0
můžeme zvolit algoritmus, který se má použít (dále použit „sqp“) >> op=optimset('fmincon'); % získej implicitní hodnoty >> op.Algorithm % vypiš typ algoritmu ans =trust-region-reflective %op.Algorithm='active-set'; %op.Algorithm='interior-point'; op.Algorithm='sqp'; % nastav algoritmus 'sqp'
provedeme vlastní výpočet pro hodnoty parametru R=5,3,2; nelineární omeze‐ ní je funkce, proto je možné použít volání anonymní funkce s předáním pa‐ rametru. Při hodnotě R=5 nedochází k omezení, pro hodnoty R=3 a R=2 je vyhledáno minimum respektující omezení >> xr=fmincon(@Funkce,x0,A,b,[],[],lb,ub,@(x) Fnl(x,5),op) xr = 3.1669 2.8240 -0.0438 >> yr=Funkce(xr) yr =-2.9173 >> xr=fmincon(@Funkce,x0,A,b,[],[],lb,ub,@(x) Fnl(x,3),op) xr = 2.9997 % omezení 2.6758 -0.0409 >> yr=Funkce(xr) yr =-2.9160 >> xr=fmincon(@Funkce,x0,A,b,[],[],lb,ub,@(x) Fnl(x,2),op) xr = 1.9999 % omezení 1.8458 -0.0172 >> yr=Funkce(xr) yr =-2.7876
8.2.2 Lineární programování Speciální případ hledání minima funkce v případě, že funkce je lineární (vhle‐ dem k vektoru nezávisle proměnných) a omezení jsou pouze lineární. Mini‐ mum je v tomto případě vždy jedno a leží na některém z omezení. Jednotlivé typy omezení lze vynechat či požadovat všechna současně ale aspoň jeden typ omezení musí být zadán. Pokud chci vynechat parametr, za kterým následují další platné parametry, uvede se prázdná matice []. Výchozí bod x0 má význam pouze v případě použití „medium‐scale algorithm“. Blíže viz help linprog x=linprog(f,A,b,Aeq,beq,lb,ub,x0,option) Úloha je‐li známa lineární funkce více proměnných x* = arg min f T x x∈R n (skalární součin vektorů parametrů f a vektoru x) y T = f x urči polohu minima za existence omezení typu Ax ≤ b A eq x = b eq lineární nerovnosti Ax ≤ b, lineární rovnosti Aeqx = lb ≤ x ≤ ub beq, dolního a horního omezení lb ≤ x ≤ ub Příklad nalezněte minimum funkce y=3x1 + 5x2 ‐5x3 + 7x4 když platí omezení, že všechny hodnoty jsou kladné a dále je požadováno, aby platilo x1 + x2 + x3 + x4 ≤ 30 2 x1 + 3 x3 + x4 ≤ 10x2 ‐ x3 + 20 KŘP/IMSW Modelování ve výpočtových software
8‐8 (20) 23.10.11
František Dušek KŘP FEI Univerzita Pardubice
Řešení vytvoříme parametr f základní funkce a parametry A, b omezení typu lineární nerovnosti a lb dolního omezení
>> f=[3;5;-5;7]; >> A= [1,1,1,1; % x1+ x2+ x3+x4<=b1 2,-10,4,1]; %2x1-10x2-4x3-x4<=b2 >> b=[30;20]; >> lb=[0;0;0;0]; >> xr=linprog(f,A,b,[],[],lb) xr = 0.0000 7.1429 22.8571 0.0000 >> yr=f'*xr yr =-78.5714
8.2.3 Kvadratické programování Speciální případ hledání minima funkce v případě, že funkce je kvadratická 3 (vhledem k vektoru nezávisle proměnných) a omezení jsou pouze lineární. Mi‐ nimum je v tomto případě vždy jedno, a buď leží uvnitř omezení, nebo leží na některém z omezení. Jednotlivé typy omezení lze vynechat či požadovat všechna současně ale aspoň jeden typ omezení musí být zadán. Pokud chci vynechat parametr, za kterým následují další platné parametry, uvede se prázdná matice []. Blíže viz help quadprog x=quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,option) Úloha je‐li známa kvadratická funkce více * 1 T x Hx + f T x proměnných (vektoru x) y=½xTHx + fTx urči x = arg min n 2 x∈R polohu minima za existence omezení typu Ax ≤ b A x = b eq eq lineární nerovnosti Ax≤b, lineární rovnosti lb ≤ x ≤ ub Aeqx=beq, dolního a horního omezení lb≤x≤ub Příklad nalezněte minimum funkce y = 12 x12 + x22 − x1 x2 − 2 x1 − 6 x2 + c když platí omezení, že všechny hodnoty jsou kladné a dále je požadováno, aby pla‐ tilo x1 + x2 ≤ 2 ‐x1 + 2x2 ≤ 2 2x1 + x2 ≤ 3 Řešení vytvoříme parametry H a f základní funkce přepisem do požadovaného maticového tvaru y =
1 2
[x1
⎡x ⎤ ⎡ 1 − 1⎤ ⎡ x1 ⎤ + [− 2 − 6]⎢ 1 ⎥ (hodnota x2 ]⎢ ⎢ ⎥ ⎥ ⎣− 1 2 ⎦ ⎣ x2 ⎦ ⎣ x2 ⎦
absolutního členu c polohu minima neovlivňuje) >> H=[1,-1;-1,2]; >> f=[-2;-6];
parametry A, b omezení typu lineární nerovnosti >> A= [ 1,1; -1,2; 2,1]; >> b=[2;2;3];
% x1+ x2<=b1 %-x1+2x2<=b2 %2x1+ x2<=b3
3
funkce musí být definována maticově ve tvaru y=½xTHx + fTx + c
KŘP/IMSW Modelování ve výpočtových software
8‐9 (20) 23.10.11
František Dušek KŘP FEI Univerzita Pardubice
parametry lb omezení typu dolní omezení >> lb=[0; 0];
% x1>=0 % x2>=0
vlastní výpočet >> xr=quadprog(H,f,A,b,[],[],lb,[]) xr = 0.6667 1.3333 >> yr=0.5*xr'*H*xr+f'*xr yr =-8.2222
8.2.4 Soustava algebraických rovnic Numerické řešení soustavy nelineárních algebraických rovnic v okolí bodu x0. Blíže viz help fsolve
f (x) = 0
x=fsolve(f,x0,option)
⎡x1 ⎤
Úloha je‐li známa soustava n nelineárních x = ⎢⎢ M ⎥⎥ algebraických rovnic ve tvaru f(x)=0 urči řešení ⎢⎣ x n ⎥⎦ v okolí bodu x0
f 1 (x 1 ) = 0 x
arg min = xmin f,max 〈∈ x
f n (x n ) = 0
Příklad nalezněte řešení soustavy tří nelineárních rovnic
(x1 + x2 )cos(x3 ) = 1 + x3e − x − x2 x1 sin ( x1 + x2 ) − x1 x2 = x1e − x − x3 x2 sin (x1 x3 ) + x12 = x2e − x − x1 1
2
3
v okolí bodů x0: {0,0,0} a x0: {0,1,5} Řešení vytvoříme funkci y=Funkce(x) popisující zadanou soustavu rovnic Funkce.m ================================================= function y=Funkce(X) % soustava nelineárních rovnic tří proměnných z=F(x) x1=X(1); x2=X(2); x3=X(3); y=zeros(3,1); y(1)=(x1+x2)*cos(x3)+x2-x3*exp(-x1)-1; y(2)=x1*sin(x2+x3)-x1*x2+x3-x1*exp(-x2); y(3)=x2*sin(x1*x3)+x1+x1^2-x2*exp(-x3); ================================================= Funkce.m
pomocí funkce fsolve nalezneme řešení v okolí zadaných bodů >> x=fsolve(@Funkce,[0;0;0]) x = 0.2734 0.4230 0.1472 >> Funkce(x) ans = 1.0e-006 * -0.0033 0.0406 0.1037 >> x=fsolve(@Funkce,[0;1;5]) x = 1.2741 4.1787 4.3440 >> Funkce(x) ans = 1.0e-009 * -0.2361 -0.3531 0.1450
KŘP/IMSW Modelování ve výpočtových software
8‐10 (20) 23.10.11
František Dušek KŘP FEI Univerzita Pardubice
8.3 Příklady na procvičení V kapitole 8.3.1 jsou zadání a v kapitole 8.3.3 řešení jednoduchých příkladů na hledání extrému funkce. Pro řešení příkladů jsou nutné znalosti z prvních čtyř bloků. V kapitole 8.3.2 jsou zadání a v kapitole 8.3.4 řešení příkladů na kombi‐ nace úloh probíraných v kapitolách 6, 7 a 8. Pro řešení příkladů jsou také nutné znalosti z kapitol 6 a 7. Předpokládá se, že při řešení příkladů má čtenář k dispozici MATLAB a aktivně využívá nápovědu k programu.
8.3.1 Zadání příkladů – extrém funkce Př01. Extrém funkce jedné proměnné. a) Nalezněte minimum funkce y(x)=(x‐1)cos(x) v okolí bodu 1 b) Nalezněte maximum funkce y(x)= (x‐1)cos(x) v okolí bodu 1 c) Nalezněte minimum funkce y(x)= (x‐1)cos(x) na intervalu ‐2 ≤ x ≤ 2 d) Nalezněte maximum funkce y(x)= (x‐1)cos(x) na intervalu ‐2 ≤ x ≤ 2 Př02. Extrém funkce více proměnných. a) Nalezněte maximum funkce dvou proměnných z =
cos( xy + x + 12 π ) 1 + x2 + y2
v okolí bodu x=0 a y=0 b) Nalezněte polohu maxima funkce dvou proměnných z = cos( xy ) v okolí bodu x=0 a y=0 (návod: nakreslete si průběh uvedené funkce) c)
Nalezněte
y=
(3x
hodnotu
minima
funkce
tří
− x2 x3 )(x1 x2 − x ) v okolí bodu x1=1, x2=‐1 a x3=1 (1 + x1 x2 )2 + (2 − x2 x3 )2 2 1
proměnných
2 3
8.3.2 Zadání příkladů – kombinace funkcí funkcí Hledání kořene funkce, výpočet určitého integrálu Př01. Nalezněte řešení rovnice a
∫
a) hodnotu a, pro kterou platí sin( x)dx = 1 f(R,x)
0
π
∫
b) hodnotu a, pro kterou platí sin(ax)dx = 1
y R x
0
Př02. Máme kulovou nádobu o poloměru R. Urče‐ te hodnotu poloměru, jestliže víte, že když do nádoby nalijete 1 m3 kapaliny, tak hladina bude ‐R ½R ve ¾ výšky nádoby. Návod: pro určení objemu kapaliny využijte vztahu, že objem V tělesa vzniklého b
∫
rotací křivky y=f(x) kolem osy x je V = π f 2 ( x)dx , speciálně pro kouli o po‐ a
KŘP/IMSW Modelování ve výpočtových software
8‐11 (20) 23.10.11
František Dušek KŘP FEI Univerzita Pardubice
loměru R je
V =π
∫( R
+R
−R
2
y = R − x a objem celé koule dán vztahem 2
)
2
− x 2 dx = π
2
+R
∫ (R
2
)
[
− x 2 dx =π xR 2 − 13 x 3
]
+R −R
=
−R
4 3 πR . 3
Hledání kořene funkce, výpočet diferenciální rovnice Př03. Nalezněte počáteční podmínku y(t=0)=? (druhá počáteční podmínka y΄(t=0)=1) diferenciální rovnice y ′′ + y ′ + y = 1 takové, aby platila koncová podmínky y(t=10)=1. Návod: hledejte kořen funkce tvořené součtem absolutních hodnot rozdílů mezi Př04. Nalezněte hodnotu parametru a diferenciální rovnice y ′′ + y ′ + ay = 1 s počátečníma podmínkami y΄(t=0)=1 a y(t=0))=2 takovou, aby platilo, že hod‐ nota funkce v čase 10 bude ‐10 tj. y(t=10)=‐10. Př05. Určete dostřel střely (Blok 07, Př06) pro hodnoty úhlů α=20°, 30°, 40°, 50°, 60° a 70°. Dráha střely je popsána soustavou diferenciálních rovnic
d 2h dh dh +k + g = 0 h(t = 0) = h0 2 dt dt dt
dh = v0 sin(α ) dt t =0
d 2x dx dx +k + g = 0 x(t = 0) = 0 2 dt dt dt
dx = v0 cos(α ) dt t=0
kde počáteční výška h0=1 m.s‐1, počáteční rychlost střely je v0=800 m.s‐1 a ko‐ eficient odporu k=0.004 m‐1. Návod: dostřel znamená vzdálenost – hodnota x(tx)=?, kde střela dopadne na zem tj. místo kde nulová výška – hodnota h(tx)=0. Pro výpočet dostřelu je po‐ třeba určit dobu, ve které bude výška nad zení nulová tj. řešit úlohu h(tx,α)=0 kde závislost h na čase t je popsána uvedenou soustavou diferenciálních rov‐ nic
Hledání kořene funkce, výpočet diferenciální rovnice, extrém funkce Př06. Pro podmínky dané příkladem Př05 nalezněte takový úhel αopt, pro který bude dostřel střely maximální. Návod: hledání maximálního dostřelu a ) α opt = arg maxo x (t x , α ) α ∈〈 0 , 90 〉 znamená řešit a) úlohu hledání extré‐ t x = arg [h(t , α ) = 0] mu funkce x(tx,α), která je závislá na b ) hodnotě tx, která je b) řešením úlohy c ) f (h′′(t ), h′(t ), x′′(t ), x′(t ) ) = 0 hledání kořene funkce h (t,α)=0. Obě h′(0) = g1 (α ) x′(0) = g 2 (α ) funkce (x i h) jsou popsány soustavou diferenciálních rovnic s počátečními podmínkami závislými na hledaném pa‐ rametr α – úloha c).
KŘP/IMSW Modelování ve výpočtových software
8‐12 (20) 23.10.11
František Dušek KŘP FEI Univerzita Pardubice
8.3.3 Řešení příkladů – extrém funkce Př01. Extrém funkce jedné proměnné. Vytvoříme uživatelskou funkci y(x)=(x+1)cos(x+1) Funkce.m ================================================== function y=Funkce(x) y=(x+1).*cos(x+1); ================================================== Funkce.m
a vykreslíme její průběh na intervalu ‐3 ≤ x ≤ 3 >> x=-3:0.01:3; >> plot(x,Funkce(x)) >> grid, hold on
1 0.5 0 -0.5
a) minimum funkce v okolí bodu 1
-1
>> min=fminsearch(@Funkce,1) min = 2.4256 >> ymin=Funkce(xmin) ymin = -3.2884 >> plot(xmin,ymin,'o')
-1.5 -2 -2.5 -3
b) maximum funkce v okolí bodu 1
-3.5 -3
>> xmax=fminsearch(@(x)-Funkce(x),1) xmax = -0.1396 >> ymax=Funkce(xmax) ymax = 0.5611 >> plot(xmax,ymax,'o')
-2
-1
0
1
2
3
c) minimum funkce na intervalu ‐2 ≤ x ≤ 2 >> xmin=fminbnd(@Funkce,-2,2) xmin = 1.9999 >> ymin=Funkce(xmin) ymin = -2.9699>> plot(xmin,ymin,'o')
d) maximum funkce na intervalu ‐2 ≤ x ≤ 2 >> xmax=fminbnd(@(t) -Funkce(t),-2,2) xmax = -0.1397 >> ymax=Funkce(xmax) ymax = 0.5611 >> plot(xmax,ymax,'o')
Př02. Extrém funkce více proměnných. a) maximum funkce z =
cos( xy + x + 12 π ) v okolí bodu x=0 a y=0 1+ x2 + y2
Funkce.m ================================================== function z=Funkce(X) % funkce dvou proměnných z=F(X) x=X(1); y=X(2); z=cos(x*y+x+pi/2)/(1+x^2+y^2); ================================================== Funkce.m >> xy=fminsearch(@(x) -Funkce(x),[0;0]) xy = -0.7299 0.3847 >> Funkce(xy) ans = 0.5041
KŘP/IMSW Modelování ve výpočtových software
8‐13 (20) 23.10.11
František Dušek KŘP FEI Univerzita Pardubice
b) maximum funkce dvou proměnných z = cos( xy ) v okolí bodu x=0 a y=0 >> x=linspace(-pi,pi,50); >> y=x; >> [X,Y]=meshgrid(x,y); >> Z=cos(X.*Y); >> mesh(x,y,Z) >> f=@(p) -cos(p(1)*p(2)); >> xy=fminsearch(f,[0,0]) xy = 0 0 >> -f(xy) ans = 1
1
0.5
0
-0.5
-1 4 2
4 2
0
Je zřejmé, že maximum má hodnotu jedna v případě, že x.y=2kπ pro k=0, ±1, ±2, … tj. kromě nalezeného bodu je stejné maximum i ve všech bodech vyhovujících výše uvedené podmínce na součin xy.
0
-2
-2 -4
-4
c) minimum funkce y=f(x1,x2,x3) v okolí bodu x1=1, x2=‐1 a x3=1 2 2 2 ( x1 − 1) − x1 x2 + ( x2 + 2 ) + x2 x3 + ( x3 − 3) − x1 x3 y= 2 1 + (1 + x1 x2 x3 )
Funkce.m ================================================== function z=Funkce(X) % funkce tří proměnných z=F(X) x1=X(1); x2=X(2); x3=X(3); z=(x1-1)^2-x1*x2+(x2+2)^2+x2*x3+(x3-3)^2-x1*x3; z=z/(1+(1+x1*x2*x3)^2); ================================================== Funkce.m >> x=fminsearch(@Funkce,[1,-1,1]) x = 0.0407 -4.6311 5.3259 >> y=Funkce(x) y = -11.4401
8.3.4 Řešení příkladů – kombinace funkcí funkcí Př01. Nalezněte řešení rovnice a
∫
a
∫
a) sin( x)dx = 1 tj. řešíme úlohu f ( a ) = 0 = 1 − sin( x)dx 0
0
Funkce.m ================================================== function y=Funkce(a) % funkce y=1-int(sin(x)) y=1-quadl(@sin,0,a); ================================================== Funkce.m >> a=fzero(@Funkce,1) a = 1.5708 >> quadl(@sin,0,a) ans = 1.0000 π
∫
π
∫
b) sin(ax)dx = 1 tj. řešíme úlohu f ( a ) = 0 = 1 − sin( ax)dx 0
0
Funkce.m ================================================== function y=Funkce(a) % funkce y=1-int(sin(a*x)) y=1-quadl(@(x) sin(a*x),0,pi); ================================================== Funkce.m
KŘP/IMSW Modelování ve výpočtových software
8‐14 (20) 23.10.11
František Dušek KŘP FEI Univerzita Pardubice
>> a=fzero(@Funkce,1) a =1.3770 >> quadl(@(x) sin(a*x),0,pi) ans = 1.0000
Př02. Určete hodnotu poloměru R kulové nádoby, jestliže R 2 víte, že když do nádoby nalijete 1 m3 kapaliny, tak hladina f ( R ) = 0 = 1 − R 2 − x 2 dx bude ve ¾ výšky nádoby (úloha výpočtu kořene funkce −R popsané určitým integrálem)
∫(
)
Funkce.m =================================== function y=Funkce(R) % funkce y=1-int(R^2-x^2) y=1-quadl(@(x) Fi(x,R),-R,R/2); return % nepovinný konec funkce % subfunkce function y=Fi(x,R) y=R^2-x.^2; ================================================== Funkce.m >> R=fzero(@Funkce,0.1) R = 0.9615 >> quadl(@(x) R^2-x.^2,-R,R/2) ans = 1.0000
Hledání kořene funkce, výpočet diferenciální rovnice Př03. Nalezněte počáteční podmínku y(t=0)=? y ′′ + y ′ + y = 1 y ′(0) = 1 y (10 ) = 1 (druhá počáteční podmínka y΄(t=0)=1) diferen‐ −−−−−−−−−−−−−−−−−−−−− ciální rovnice y′′ + y′ + y = 1 takové, aby plati‐ y′ = z y (10 ) = 1 ⎡ y⎤ la koncová podmínky y(t=10)=1 (úloha výpočtu Y =⎢ ⎥ kořene funkce popsané diferenciální rovnicí). z ′ = 1 − z − y z ( 0) = 1 ⎣z⎦ Funkce.m ======================= function e=Funkce(y0) % rozdíl řešení v čase t=10 a požadované hodnoty 1 Y0=[y0;1]; [t,Y]=ode45(@Fd,[0;10],Y0); % řešení 0<=t<=10 % y(t=10)=Fce(y(t=0)] 4 y10=Y(end,1); e=y10-1; 3 ======================== Funkce.m Fd.m ============================ 2 function dY=Fd(t,Y) % diferenciální rovnice 1 y=Y(1); z=Y(2); dY=[z;1-z-y]; 0 ============================= Fd.m >> y0=fzero(@Funkce,0) -1 y0 = 3.4981 >> [t,Y]=ode45(@Fd,[0;10],[y0;1]); -2 0 >> plot(t,Y) >> grid
y=f (t) 1
z=y'=f (t) 2
2
4
6
8
10
Př04. Nalezněte hodnotu parametru a diferen‐ y ′′ + y ′ + ay = 1 y ′(0) = 1 y (0) = 2 ciální rovnice y ′′ + y ′ + ay = 1 s počátečními −−−−−−−−−−−−−−−−−−−−− podmínkami y΄(t=0)=1 a y(t=0)=2 takovou, y′ = z y (0) = 1 ⎡ y⎤ aby platilo, že hodnota funkce v čase 10 bu‐ Y =⎢ ⎥ de ‐10 tj. y(t=10)=‐10 (úloha výpočtu kořene z ′ = 1 − z − ay z (0) = 2 ⎣z⎦ funkce popsané diferenciální rovnicí) KŘP/IMSW Modelování ve výpočtových software
8‐15 (20) 23.10.11
František Dušek KŘP FEI Univerzita Pardubice
Funkce.m ================================================ function e=Funkce(a) % rozdíl řešení v čase t=10 a požadované hodnoty 1 Y0=[1;2]; 12 % řešení 0<=t<=10 y=f (t) [t,Y]=ode45(@}t,x] Fd(t,x,a),[0;10],Y0); 1 10 % y(t=10)=Fce(a)] y10=Y(end,1); 8 e=y10-10; ======================== Funkce.m 6 Fd.m ============================ function dY=Fd(t,Y,a) 4 % diferenciální rovnice y=Y(1); z=Y(2); 2 dY=[z;1-z-a*y]; ============================= Fd.m 0 0 2 >> a=fzero(@Funkce,0) a = 0.0380 >> [t,Y]=ode45(@}t,x] Fd(t,x,a),[0;10],[1;2]); >> plot(t,Y) >> grid
z=y'=f (t) 2
4
6
8
10
Př05. Určete dostřel střely d 2 h dh dh dh +k + g = 0 h(t = 0) = h0 = v0 sin(α ) (Blok 07, Př06) pro hodnoty 2 dt dt dt dt t = 0 úhlů α=20°, 30°, 40°, 50°, 60° a 70°. Dráha střely je d 2 x dx dx dx = v0 cos(α ) popsána soustavou diferen‐ dt 2 + k dt dt + g = 0 x(t = 0) = 0 dt t =0 ciálních rovnic, kde počáteč‐ ‐1 ‐1 ní h0=1 m.s , počáteční rychlost střely je v0=800 m.s a koeficient odporu k=0.004 m‐1 (úloha výpočtu kořene funkce popsané diferenciální rovnicí). Převod na soustavu čtyř diferenciálních rovnic prvního stupně
⎡h⎤ ⎡h(0) = h0 ⎤ ⎢v ⎥ ⎢v (0) = v sin(α ) ⎥ 0 ⎥ Z = ⎢ h ⎥ Z0 = ⎢ h ⎢x⎥ ⎢ x(0) = 0 ⎥ ⎢ ⎥ ⎢ ⎥ ⎣v x ⎦ ⎣ x1 (0) = v0 cos(α )⎦
⎡h′ ⎢ dZ ⎢v′h = dx ⎢ x′ ⎢ ⎣v′x
= vh ⎤ = − g − k vh vh ⎥⎥ ⎥ = vx ⎥ = − k vx vx ⎦
a jejich zápis ve formě m‐funkce Fd.m ===================================================== function dZ=Fd(t,Z) % zápis soustavy diferenciálních rovnic h=Z(1); vh=Z(2); x=Z(3); vx=Z(4); g=9.81; k=0.004; % vektor derivací musí být sloupcový dZ=zeros(4,1); dZ(1)=vh; dZ(2)=-g-k*abs(vh)*vh; dZ(3)=vx; dZ(4)=-k*abs(vx)*vx; ==================================================== Fd.m
zápis funkce pro výpočet výšky střely v zadaném čase Funkce.m ================================================== function hend=Funkce(tend,a,v0) % výška střely v čase t=tend Z0=[1; % poč. výška
KŘP/IMSW Modelování ve výpočtových software
8‐16 (20) 23.10.11
František Dušek KŘP FEI Univerzita Pardubice
v0*sin(a); % poč. rychlost v h 0; % poč. vzdálenost v0*cos(a)]; % poč. rychlost v x [t,Z]=ode45(@Fd,[0;tend],Z0); hend=Z(end,1); % výška na konci ================================================== Funkce.m
a vlastní řešení příkazy MATLABu (skript) skript.m ===================================================== % skript pro výpočet dráhy střely v0=800; % počáteční rychlost al=[20,30,40,50,60,70]; % náměr ve stupních % příprava pro vykreslení drah střely axes % prázdný graf hold on % režim překreslování te=cell(size(al)); % pole buněk pro text legendy % pole buněk - řetězce pro barvy grafů co={'b','g','r','c','m','k','b','g','r','c','m','y','k'}; for k=1:length(al), % pro různé náměry počítej … alr=al(k)*pi/180; % převod na radiány % urči čas dopadu (=nulová výška) tend(k)=fzero(@(x) Funkce(x,alr,v0),50); vh0=v0*sin(alr); % poč. rychlost v h vx0=v0*cos(alr); % poč. rychlost v x Z0=[1;vh0;0;vx0]; % poč. podmínky [t,Z]=ode45(@Fd,[0,tend(k)],Z0); x=Z(:,3); % časový průběh dráhy (vzdálenost) y=Z(:,1)'; % časový průběh dráhy (výška) % přidej (hold on) další průběh dráhy hp=plot(x,y,co{k},'LineWidth',2); % příprava textu jednoho řádku legendy do pole buněk te{k}=sprintf('uhel %2d ^o, t_{end}=%6.1f s' ,[al(k),tend(k)]); end grid legend(te,'Location','NorthWest') ==================================================== skript.m 700 uhel 20 o, tend= 19.2 s 600
uhel 30 o, tend= 21.4 s uhel 40 o, tend= 22.8 s
500
uhel 50 o, tend= 23.8 s 400
uhel 60 o, tend= 24.4 s uhel 70 o, tend= 24.9 s
300 200 100 0 -100
0
200
400
KŘP/IMSW Modelování ve výpočtových software
600
800
8‐17 (20) 23.10.11
1000
1200
František Dušek KŘP FEI Univerzita Pardubice
Hledání kořene funkce, výpočet diferenciální rovnice, extrém funkce
Př06. Pro podmínky dané příkladem Př05 nalezněte takový úhel αopt, pro který bude dostřel střely maximální. Návod: hledání maximálního dostřelu a ) α opt = arg maxo x (t x , α ) α ∈〈 0 , 90 〉 znamená řešit a) úlohu hledání extré‐ t x = arg [h(t , α ) = 0] mu funkce x(tx,α), která je závislá na b ) hodnotě tx, která je b) řešením úlohy c ) f (h′′(t ), h′(t ), x′′(t ), x′(t ) ) = 0 hledání kořene funkce h (t,α)=0. Obě h′(0) = g1 (α ) x′(0) = g 2 (α ) funkce (x i h) jsou popsány soustavou diferenciálních rovnic s počátečními podmínkami závislými na hledaném pa‐ rametr α – úloha c). Zápis soustavy diferenciálních rovnic ve formě m‐funkce (úloha c) Fd.m ===================================================== function dZ=Fd(t,Z) % zápis soustavy diferenciálních rovnic h=Z(1); vh=Z(2); x=Z(3); vx=Z(4); g=9.81; k=0.004; % vektor derivací musí být sloupcový dZ=zeros(4,1); dZ(1)=vh; dZ(2)=-g-k*abs(vh)*vh; dZ(3)=vx; dZ(4)=-k*abs(vx)*vx; ==================================================== Fd.m
zápis funkce pro výpočet výšky střely v zadaném čase (pro úlohu b) Fv.m ================================================== function hend=Fv(tend,a,v0) % výška střely v čase t=tend Z0=[1; % poč. výška v0*sin(a); % poč. rychlost v h 0; % poč. vzdálenost v0*cos(a)]; % poč. rychlost v x [t,Z]=ode45(@Fd,[0;tend],Z0); hend=Z(end,1); % výška na konci ================================================== Fv.m
zápis funkce pro výpočet dostřelu (pro úlohu a) Fx.m ================================================== function [xd,tend]=Fx(a,v0) % funkce pro výpočet dostřelu % výpočet doby dopadu pro dané alfa tend=fzero(@(x) Fv(x,a,v0),50); % výpočet dostřelu pro dané alfa Z0=[1;v0*sin(a);0;v0*cos(a)]; % poč. podmínky [t,Z]=ode45(@Fd,[0,tend],Z0); xd=Z(end,3); ================================================== Fx.m
a vlastní řešení příkazy MATLABu (skript) skript.m ===================================================== % skript pro výpočet max. dostřelu v0=800; % počáteční rychlost % vyhledej maximum al=fminbnd(@(x) -Fx(x,v0),0,90*pi/180);
KŘP/IMSW Modelování ve výpočtových software
8‐18 (20) 23.10.11
František Dušek KŘP FEI Univerzita Pardubice
% výpočet doby a hodnoty dostřelu [xd,tend]=Fx(al,v0); % výpočet celé dráhy střely Z0=[1;v0*sin(al);0;v0*cos(al)]; % poč. podmínky [t,Z]=ode45(@Fd,[0,tend],Z0); % vykreslení výsledku x=Z(:,3); y=Z(:,1); plot(x,y,'r','LineWidth',2); grid alf=al/pi*180; hmax=max(y); % maximální výška te1=sprintf('\\alpha_{opt}=%5.1f ^o',alf); te2=sprintf('x_{max}=%7.1f m',xd); te3=sprintf('h_{max}=%7.1f m',hmax); ht(1)=text(0.1*xd,0.9*hmax,te1); ht(2)=text(0.1*xd,0.8*hmax,te2); ht(3)=text(0.1*xd,0.7*hmax,te3); set(ht,'FontSize',14) ==================================================== skript.m 600
500
αopt= 27.5
o
xmax= 1026.0 m
400
hmax= 505.4 m 300
200
100
0
0
200
400
600
800
1000
1200
KŘP/IMSW Modelování ve výpočtových software
8‐19 (20) 23.10.11
František Dušek KŘP FEI Univerzita Pardubice
Pojmy k zapamatování Okruhy problémů: hledání extrémů funkcí více proměnných, hledání ex‐ trému funkce za existence omezení, lineární a kvadratické programování, výpočty s proměnnou přesností, symbolické výpočty (lineární algebra, derivace, integrál, integrální transformace) Použité nástroje:
Příkazy a funkce: contour, diff, dsolve, findobj, fminbnd, fmincon, fminsearch, fourier, fsolve, gca, int, laplace, linprog, quadprog, solve, vpa
Otázky na procvičení 1. 2. 3. 4. 5.
Jak v MATLABu vyhledáme maximum funkce, když jsou k dispozici pouze funkce pro vyhledání minima funkce? Jak se jmenuje funkce MATLABu pro vyhledání globálního extrému? V čem se liší úloha, na jejíž řešení je určena funkce fminbnd, od úlohy na jejíž řešení je určena funkce fminsearch? Pro řešení jaké úlohy je určena funkce fsolve? Jaká je standardní přesnost výpočtů – kolik platných číslic?
Odkazy a další studijní prameny • •
on‐line dokumentace k programu nebo www.mathworks.com/help/ – části „Optimization“, „Parameterizing Functions“, „Optimization Tool‐ box“ elektronická učebnice Learning MATLAB 7– www.mathworks.com/academia/student_version/learnmatlab_sp3.pdf (část „Introducing the Symbolic“ a „Using the Symbolic Math Toolbox“)
KŘP/IMSW Modelování ve výpočtových software
8‐20 (20) 23.10.11
František Dušek KŘP FEI Univerzita Pardubice
9 Úvod do používání SIMULINKu Studijní cíl Devátý blok je věnován základnímu seznámení se SIMULINKem, rozšířením (grafickou nadstavbou) MATLABu určeným na modelování, simulaci a analýzu dynamických systémů tj. systémů popsaných soustavou obyčejných nelineár‐ ních diferenciálních (případně i diferenčních) a algebraických rovnic, kde je nezávisle proměnnou čas. SIMULINK neobsahuje nové výpočetní metody (vyu‐ žívá standardní výpočetní jádro MATLABu) ale umožňuje grafický způsob zápisu úlohy podobný realizaci řešení na analogových počítačích. V první části se seznámíme s všeobecnými informacemi o SIMULINKu, na co je určen a jak se s ním pracuje. Následuje část ukazující základ práce v SIMULINKu – tvorbu modelu, který popisuje v grafické podobě původní matematickou formulaci řešené úlohy (výchozí matematické rovnice), spuštění řešení a mož‐ nosti vizualizace. Protože model SIMULINKu je tvořen zapojením funkčních bloků, seznámíme se také se základními knihovnami bloků a ukážeme si někte‐ ré důležité bloky včetně možností jejich parametrizace.
Doba nutná k nastudování
1 ‐ 2 hodiny
Průvodce studiem Předpokládá se, že čtenář je seznámen s prostředím MATLABu a jeho základ‐ ními příkazy. Pro řešení příkladů jsou též potřeba základní znalosti z oblasti diferenciálních rovnic. Při studiu je vhodné mít spuštěný MATLAB a SIMULINK a jednotlivé příkazy či funkce hned vyzkoušet a případně získat podrobnější in‐ formace využíváním nápovědy k programu. Na závěr jsou opět uvedeny řešené příklady na procvičení. V textu jsou použity následující typografické konvence: Calibri 11, Bold, Italic Calibri 11 Courier Courier Courier Courier
New New New New
nové pojmy k zapamatování označení klávesy 10, Bold názvy nástrojů MATLABu 10 názvy bloků použitých v programu 10, Italic názvy proměnných použitých v programu 10, Bold upřesnění nápovědy (help téma)
KŘP/IMSW Modelování ve výpočtových software
9‐1 (15) 27.10.11
František Dušek KŘP FEI Univerzita Pardubice
9.1 Co je to SIMULINK Rozšíření MATLABu (grafická nadstavba) SIMULINK je k dispozici až od zhruba poloviny 90. let minulého století protože využívá grafických možností hostitel‐ ské platformy (v té době pouze Windows 3.0). Grafický způsob zápisu modelu i celkový způsob práce je značně odlišný od práce s vlastním MATLABem, který je orientován na textové řádkové příkazy. To svádí používat SIMULINK "samo‐ statně", nezávisle na znalosti MATLABu. I tento přístup je možný, ale vystačíme s ním pouze pro nejjednodušší využití. Pro efektivní využití a při řešení složitěj‐ šího problému je znalost MATLABu prakticky nezbytná. SIMULINK je především určen na časové řešení (simulaci) chování nelineárních dynamických spojitých i diskrétních systémů. Lze s jeho pomocí určit časové průběhy výstupních veličin (i všech ostatních) v závislosti na časovém průběhu veličin vstupních a počátečním stavu. Popis soustavy může být značně rozsáhlý a složitý. Může obsahovat i algebraické rovnice a vzorkované (diskrétní) vý‐ počty. Je potřeba si uvědomit, že SIMULINK nové metody či principiálně jiné možnosti řešení než MATLAB nenabízí. Co nabízí je jednoduchý přístup k stan‐ dardním metodám MATLABu pro numerické řešení soustavy nelineárních dife‐ renciálních rovnic, prostředky pro relativně snadný zápis problému (vytvoření modelu) a vizualizaci výsledků a automatické řešení mnoha problémů, které při simulacích vznikají. Přístup k návrhu zápisu problému silně připomíná návrh zapojení pro analogo‐ vý počítač. Co zaujme na první pohled, je grafický způsob zápisu úlohy ‐ v terminologii SIMULINKu nazývaný model. Z nabídky příslušné knihovny se myší přetahují výkonné bloky a pak se myší pospojují odpovídající vstupy a výstupy (signály). Při tvorbě složitějších modelů se využívá možnosti část mo‐ delu sdružit do dalšího (uživatelského) bloku ‐ subsystému 1 . Subsystémy lze standardně kopírovat a propojovat. Jako zdroj signálů se používají nejčastěji signály z knihovních bloků generujících základní typy signálů s volitelnými parametry. Lze též používat připravená data ze souboru nebo z matic připravených v pracovním prostoru MATLABu. Ve spolupráci s Real Time Toolboxem či Data Acquisition Toolboxem (a měřící kartou) lze jako vstupní data použít i přímo měřené hodnoty v reálném čase. Výsledek simulace ‐ časový průběh řešení ‐ se zobrazuje nejčastěji graficky pomocí standardních bloků ‐ zobrazení typu osciloskop 2 (Scope) či dvouroz‐ měrný graf 3 (XY Graph). Další možností je výstup do proměnných pracovního prostoru MATLABu či ukládání do diskového souboru. Opět je možná přímá realizace signálů prostřednictvím příslušného hardware a Real Time Toolboxu či Data Acquisition Toolboxu.
1
Na subsystém je možné se dívat v prvním přiblížení jako na funkci (ve skutečnosti se chová jako makro)
2
Na ose x je vynášen simulační čas a na osu y časově proměnný signál
3
Časově proměnný signál je přiveden na obě osy
KŘP/IMSW Modelování ve výpočtových software
9‐2 (15) 27.10.11
František Dušek KŘP FEI Univerzita Pardubice
Podíváme‐li se na problematiku simulace chování dynamických systémů podrobněji, zjistíme, že simulace není jen 4 numerické řešení soustavy nelineárních diferenciálních rovnic (i když je to asi nejdůležitější část). V konkrétním případě musíme řešit několik dalších problémů ‐ od výběru vhodné metody řešení pro daný problém a zahrnutí počátečních stavů, přes volbu kroku řešení (souvisí s požadovanou přesností a rychlostí výpočtů), problém nespojitých či nehladkých nelinearit ("zahuštění" bodů řešení v okolí nespojitosti), synchronizaci výpočtu na zadaný čas, problém algebraických smyček až po problém závislostí popsaných tabulkou. Právě automatické (i s možností manuální volby) řešení některých 5 problémů a podporu pro řešení dalších 6 SIMULINK nabízí. Kromě vlastního grafického prostředí se standardními knihovnami (a případ‐ ných rozšíření o knihovny z toolboxů a bloksetů 7 ) je SIMULINK podporován i příkazy a funkcemi dostupnými z prostředí MATLABu – viz help simulink. Hotový model je možné využívat ve výpočtech v MATLABu. Naopak, používání funkcí MATLABu (ať už standardních či uživatelských) v modelu SIMULINKu, je poněkud komplikovanější.
Stejně jako v MATLABu lze i v SIMULINKu vytvářet skutečné uživatelské funkce (subsystém není skutečná funkce). Tyto funkce se pak chovají jako nové bloky SIMULINKu s uživatelem definovaným chováním. Nabízí se několik možností vytvoření funkce od nejjednodušší varianty pomocí bloků Fcn a MATLAB Fcn, přes blok Embedded MATLAB Function až po nejsložitější řešení v podobě S‐ funkcí. S‐funkce je možné vytvářet jako textové soubory (speciální m‐funkce) nebo v jazyce "C" či FORTRANu. Nicméně vytvoření S‐funkce již není triviální záležitostí. SIMULINK je podobně jako MATLAB interpret (tj. výpočet řešení je principiálně pomalý). Zatímco u MATLABu to tolik nevadí (předpokládá se spíše vývoj algo‐ ritmu) tak u SIMULINKu se model obvykle opakovaně spouští a nechává vypočí‐ távat s různými hodnotami parametrů nebo představuje hotové řešení zpraco‐ vání vstupních a generování výstupních signálů (např. číslicový filtr). V tomto případě již rychlost výpočtu může být zdržující. SIMULINK dovoluje vytvořit akcelerovaný model. V podstatě jde o převod modelu do zdrojového tvaru s následným překladem do strojového kódu. V této podobě je průběh výpočtu modelu podstatně rychlejší. Jinou variantou akcelerace výpočtu modelu případně zpracování signálů v reál‐ ném čase je použití HIL hardware‐in‐loop. Tento způsob podporuje např. firma dSPACE GmbH (www.dspaceinc.com), která nabízí jak toolbox dSPACE Target‐ Link tak i potřebný hardware. Nejjednodušší řešení je deska 8 do sběrnice PCI 4
Proto také vzniklo několik nových programovacích jazyků specializovaných na oblast simulace
5
Automatická volba kroku, nespojité nelinearity, synchronizace výpočtu, tabulkou zadané závis‐ losti
6
Nalezení ustáleného stavu, linearizace ve vybraném bodě, řešení algebraických smyček
7
Blockset je rozšiřující knihovna bloků pouze pro SIMULINK.
8
např. DS1104 R&D Controller Board postavená na jádru procesoru PowerPC 603e / 250 MHz, která obsahuje 4¯ADC 16 bit, 4¯ADC 12 bit, 8¯DA 16 bit, 2¯ incremental encoder interfaces, 20‐bits of digital I/, Serial interface, Three‐phase PWM outputs plus 4 single PWM outputs, 14 bits of digital I/O
KŘP/IMSW Modelování ve výpočtových software
9‐3 (15) 27.10.11
František Dušek KŘP FEI Univerzita Pardubice
osazená vlastním procesorem (viz Obrázek 9‐1). Ze stan‐ dardního SIMULINKového modelu vygenerovaný pro‐ gram může využívat vstupy a výstupy této karty a třeba zpracovávat signály v reálném čase (bez účasti proce‐ soru a operačního systému PC) nebo jen využívat vý‐ Obrázek 9‐1 Deska početní výkon dalšího procesoru. SIMULINK je pak DSP1104 (během výpočtu) využíván jen jako vizualizační pro‐ středek dovolující zobrazovat průběh výpočtu případně zasahovat do výpočtu změnou některých parametrů. Toto řešení je využíváno při vývoji programů do mikroprocesorových aplikací např. automobilovém či leteckém průmyslu (rapid control prototyping). Ve spojení se speciálním toolboxem (Simulink Coder) lze vygenerovat kód od‐ povídající SIMULINKovému modelu pro některé signálové procesory 9 . Výsledný kód je pak možné přenést na cílový systém a spustit. Ve spojení s dalším tool‐ boxem (Simulink HDL Coder) lze vygenerovat VHDL kód pro FPGA pole. Gene‐ rování hardwarově nezávislého strukturovaného textu (programu) podle nor‐ my IEC 61131 pro programovatelné logické automaty umožňuje toolbox Simu‐ link PLC Coder.
9.2 Práce se SIMULINKem Jak již bylo zmíněno SIMULINK je nadstavba MATLABu. To znamená, že není samostatně spustitelný. Je možné ho spustit z příkazové řádky MATLABu příkazem simulink nebo pomocí Obrázek 9‐2 Spuštění SIMULINKu označené ikony (viz Obrá‐ zek 9‐2). Spuštění SIMULINKu tímto způsobem je projeví tak, že se objeví okno nástroje Simulink Library Browser (viz Obrázek 9‐3). Tento nástroj umož‐ ňuje prohlížet knihovny bloků SIMULINKu a dalších instalovaných toolboxů a vybírat z nich bloky (přetažením pomocí myši) pro sestavení modelu. Aby bylo možné vybraný blok někam umístit, je nutné vytvořit okno modelu. To vytvo‐ říme buď pomocí položky menu File -> New -> Model nebo pomocí první ikony vlevo nebo klávesovou zkratkou Ctrl+N. Existující model (soubor s příponou .mdl) otevřeme standardním způsobem s využitím položky menu File -> Open nebo pomocí druhé ikony vlevo (viz Obrázek 9‐3) nebo kláveso‐ vou zkratkou Ctrl+O. Vytvořený model lze standardním způsobem uložit. SIMULINK lze také spustit dvojklikem na souboru s příponou .mdl. V tomto případě se otevře jen okno modelu. Okno nástroje Simulink Library Browser lze pak vyvolat pomocí položky menu View -> Library Browser. 9
např. od firem Analog Devices, Freescale, Infeon, Microchip a Texas Instruments . Aktuální přehled (R2011b) viz http://www.mathworks.com/products/simulink‐coder/supportedio.html
KŘP/IMSW Modelování ve výpočtových software
9‐4 (15) 27.10.11
František Dušek KŘP FEI Univerzita Pardubice
Obrázek 9‐3 Simulink Library Browser
9.2.1 Tvorba modelu SIMULINKu Zápis úlohy (přepis rovnic popisujících úlohu) v SIMULINKu se nazývá model. Je tvořen vhodně vybranými bloky, nastavením jejich parametrů a propojením jejich vstupů a výstupů. Některé bloky mohou mít proměnný počet vstupů a výstupů v závislosti na hodnotách jejich parametrů. Spoje mezi vstupy a výstu‐ py se označují jako signály a představují propojení výstupního signálu z jednoho bloku na vstupní signál bloku jiného. Signály mohou být jednoroz‐ měrné nebo vícerozměrné. Vícerozměrné signály mohou být typu 1‐D pole (sběrnice) nebo maticové (tj. obsahují i informaci o uspořádání). Při tvorbě modelu je potřeba rozlišovat význam symbolů matematického zápi‐ su: číselné konstantami, parametry (symbolické konstanty) a signály (veličiny či proměnné). Parametry jsou určeny pro uložení informace, která se v čase (v průběhu výpočtu) nemění, zatímco signály obsahují informaci, která se může v průběhu výpočtu měnit. Rozdíl ukažme na následujícím příkladu čtyř různých možností zápisu matematického výrazu
y (t ) = 3abc
(9‐1)
v jednom modelu SIMULINKu (viz Obrázek 9‐4) pro různý význam symbolů a, b a c. Jsou‐li všechny symboly ve významu parametrů (konstantní výraz), lze je zadat jako parametry bloku Constant a výstupní signál y1(t) je v čase kon‐ stantní. Je‐li pouze jeden symbol ve významu signálu, lze použít blok Gain (násobení konstantou) a výstupní signál y2(t) je úměrný vstupnímu signálu. V případě, že více než jeden symbol je ve významu signálu, je nutné použít blok
KŘP/IMSW Modelování ve výpočtových software
9‐5 (15) 27.10.11
František Dušek KŘP FEI Univerzita Pardubice
Product 10 a výstupní signál y3(t) nebo y4(t) je úměrný součinu vstupních sig‐
nálů. Vytvoření modelu (algebraická rovnice) Model na Obrázku 9‐4 – rovnice (9‐1) – začneme vytvářet přetažením bloků Gain (násobení konstantou) a Product (součin signálů) z knihovny Simulink / Math Operation do nového okna modelu. Další instance téhož bloku přidá‐ me buď opět přetažením z knihovny, nebo kopírován bloku v okně standard‐ ním způsobem. Všimněte si, že každý blok v okně musí mít jednoznačný název. Je možné ponechat automaticky vytvářené názvy bloků odvozené od původní‐ ho pojmenování bloku v knihovně nebo libovolně přejmenovat po dvojkliku na jeho název. V SIMULINKu používejte pouze znaky anglické abecedy. Dále z knihovny Simulink / Source přetáhneme bloky Constant (zdroj kon‐ stantního signálu) a Sine Wave (zdroj sinusového signálu s vlastnostmi zada‐ nými jako parametry bloku) tj. bloky vystupující jako zdroje (počátky) signálů. Z knihovny Simulink / Signal Routing přidáme blok Mux (spojení více signálů do sběrnice, 1‐D pole) a z knihovny Simulink / Sinks přidáme blok Scope (osciloskop, vykreslení časového průběhu signálu).
Obrázek 9‐4 Parametry a signály (model k příkladu 9‐1)
Parametry bloku lze zadávat a měnit v dialogovém okně, které se otevře po dvojkliku na blok. Každé dialogové okno obsahuje stručný popis funkce, podrobnou nápovědu lze získat pomocí tlačítka Help. Viz např. Obrázek 9‐5, kde je zobrazeno dialogové okno parametrů bloku Gain. Jako parametry bloků mohou být zadány číselné konstanty, názvy proměnných, konstantní výrazy nebo znakové řetězce. Parametr bloku nemusí mít význam pouze pro výpočet. Např. parametr bloku Product, který může být buď celočíselná konstanta či řetězec tvořený kombinací znaků ‚*‘ a ‚/‘ určuje počet a/nebo význam vstup‐ 10
Je možné použít blok Product pro násobení signálu konstantou (konstantním signálem) ale výpočetní realizace je složitější (a pomalejší) než při použití bloku Gain.
KŘP/IMSW Modelování ve výpočtových software
9‐6 (15) 27.10.11
František Dušek KŘP FEI Univerzita Pardubice
ních signálů. V případě bloku Product1 na Obrázku 9‐4 je potřeba, pro zvýšení počtu vstupů, jako parametr bloku Number of inputs zapsat buď hodnotu 3, nebo řetězec ‚***‘. Obdobně u bloku Mux změníme implicitní hodnotu 2 parametru Number of inputs (dva vstupy) na 4 (čtyři vstupy). Dále změníme vzhled bloku pomocí parametru Display option z hodnoty Obrázek 9‐5 Parametry bloku Gain bar (vyplněný obdélník) na signals (zobrazení názvů vstupních signálů). Spoje tj. propojení vstupů a výstupů bloků vytvoříme buď manuálně tažením myší při stisknutém levém tlačítku, nebo automaticky. Automaticky se spoj vytvoří tak, že vybereme první blok, jehož výstup chceme napojit a pak při stisknuté klávese Ctrl klikneme myší na blok, na jehož vstup se chceme napojit. Pak dojte k automatickému vytvoření spoje mezi prvním nezapojeným výstu‐ pem prvního bloku s prvním nezapojeným vstupem druhého bloku. Spoje je možné pojmenovat po dvojkliku na spoj. Pojmenování spojů usnadňuje orien‐ taci v modelu, je to určitá forma komentáře. Pojmenování spoje může být vyu‐ žito některými bloky (viz blok Mux na Obrázku 9‐4) nebo se může šířit na navazu‐ jících spojích – po povolení ve vlastnostech spoje (Signal Properties, pří‐ stupné pravým tlačítkem myši) Show propagated sinals. Poznámka: aktualizace názvů signálů v bloku Mux a spuštění modelu je možné až po naplnění symbolických konstant a, b, c číselnými hodnotami. Ve volné ploše okna je možné vytvářet komentáře opět po dvojkliku myší do vybraného místa. Kromě toho, že je možné text komentáře formátovat pomocí položky menu Format -> Font, je možné povolit formátování textu podle konvencí TeX – Format -> Enable TeX commands . Vytvoření modelu (diferenciální rovnice) Síla SIMULINKu je v zápisu a řešení diferenciálních rovnic. Pro vytvoření mode‐ lu odpovídajícímu zadané diferenciální rovnici je vhodné tuto rovnici přepsat do tvaru, podle kterého se jednodušeji vytváří model. Vhodným tvarem je in‐ tegrální rovnice, kde je samotná stavová 11 proměnná na jedné straně rovnice a na druhé straně není žádná derivace. Postup ukažme na příkladě diferenciální rovnice prvního stupně
y′ + 2 y = 3 y(0) = 0 0 ≤ t ≤ 5
(9‐2a)
Rovnici převedeme do tvaru integrální rovnice (osamostatníme derivaci a celou rovnici integrujeme) čímž dostaneme
11
Stavové proměnné jsou ty, které jsou derivovány nebo podle kterých se integruje
KŘP/IMSW Modelování ve výpočtových software
9‐7 (15) 27.10.11
František Dušek KŘP FEI Univerzita Pardubice
t
y = ∫ (3 − 2 y )dt
y′ = 3 − 2 y ⇔
(9‐2b)
0
Model začneme vytvářet od místa, kde vzniká signál y(t) tj. výstup bloku Integrator. Z knihovny 12 /Continuos přetáhneme do okna modelu blok Integrator. Vstupem integrálu je rozdíl konstantního signálu o hodnotě 3 a dvojnásobku signálu y(t), přetáhneme tedy z knihovny /Source blok Constant a z knihovny /Math Operation bloky Gain a Sum a nastavíme jim správné hodnoty parametrů. U bloku Sum 13 změníme poslední znak ‚+‘ za ‚‐‘. Nyní můžeme bloky vhodně uspořádat a vytvořit spoje. Nakonec přidáme blok /Sinks/Scope a připojíme ho na signál, jehož časový průběh nás zajímá. Vý‐ sledkem je např. zapojení modelu uvedené na Obrázku 9‐6. Nesmíme zapome‐ nout, že v zadání příkladu jsou uvedeny také počáteční podmínky tj. hodnota signálu y na počátku řešení. Protože tento signál je výstupem bloku Integrator, je nutné v parametrech bloku zkontrolovat, zda je počáteční hodnota (Initial Condition:) nulová jak je Obrázek 9‐6 Model k příkladu 9‐2 požadováno v zadání příkladu. Ukažme ještě příklad přepisu diferenciální rovnice druhého stupně do formy modelu SIMULINKu dvěma způsoby. Mějme rovnici
y′′ + 2 y′ + 3 y = 4
y′(0) = −5
y ( 0 ) = −2 0 ≤ t ≤ 6
(9‐3)
a) převod na integrální rovnici (postupná integrace) t
y′ = ∫ (4 − 3 y )dt − 2 y 0 1 4243
t t t ⎡ ⎤ y = ∫ ⎢ ∫ (4 − 3 y )dt − 2 y ⎥dt = ∫ [v − 2 y ]dt 0 ⎣0 0 ⎦
(9‐3a)
v
Pak může vypadat zapojení modelu SIMULINKu např. jak je uvedeno na Obrázku 9‐7. V modelu je využita možnost otočení bloku Format -> Flip Block (nebo též Ctrl+I) pro přehlednější zapojení modelu. Opět je nutné zadat počáteční podmínky do obou integrátorů. Jednoduché je zahrnutí podmínky y(0)=‐2 – Obrázek 9‐7 Model k příkladu 9‐3a parametr Initial Condition: bloku Integrator nastavíme na hodnotu ‐2. Složitější je určení 12
Budeme používat pouze bloky ze základní knihovny Simulink, v popisech v textu nebude dále tato knihovna uváděna.
13
Počet znaků ‚+‘ či ‚‐‘ označuje počet a význam vstupů tohoto bloku. Všimněte si, že v řetězci může být na některé pozici i znak ‚|‘, který označuje „vynechaný (slepý) vstup“ pro možnost ovlivnění vzhledu bloku. Při větším počtu vstupů je vhodnější použit místo kulatého bloku Sum obdélníkový blok Add.
KŘP/IMSW Modelování ve výpočtových software
9‐8 (15) 27.10.11
František Dušek KŘP FEI Univerzita Pardubice
počáteční hodnoty signálu v (výstup bloku Integrator1). Vyjdeme z první integrace v rovnici (9‐3b) obsahující veličinu v, jejíž hodnota v čase t=0 nás zajímá y′ = v − 2 y ⇔ v = y′ + 2 y . Z této rovnice dostaneme vztah pro určení počáteční hodnoty signálu v(0) = y‘(0) + 2y(0)= ‐9.
b) převod na soustavu diferenciálních rovnic (jako v MATLABu)
y′ = v
v′ = 4 − 2v − 3 y
t
y = ∫ vdt 0 t
v=
∫ (4 − 2v − 3 y )dt
(9‐3b)
0
V tomto případě může vypadat zapojení modelu SIMULINKu např. jak je uvedeno na Obrázku 9‐8. Opět je využita možnost otočení bloku pro přehlednější zapojení modelu. Dále je nutné zadat počáteční podmínky do obou integrátorů. V tomto případě je zadání počátečních Obrázek 9‐8 Model k příkladu 9‐3b podmínek přímočaré. Parame‐ tr Initial Condition: bloku Integrator nastavíme na hodnotu ‐2 a blo‐ ku Integrator1 na hodnotu ‐5.
9.2.2 Řešení (výpočet) modelu Máme‐li správně sestavený model je vlastní řešení jednoduché. Pokud jsou splněny všechny podmínky pro spuštění (zejména musí být známé číselné hod‐ noty všech symbolických konstant použitých v modelu) je možné spustit výpo‐ čet buď kombinací kláves Ctrl+T, pomocí položky menu okna modelu Simulation –> Start, nebo stiskem tlačítka se symbolem černého trojúhelníku na nástrojové liště. Konec výpočtu – koncová hodnota výpočetního času – je zadána uživatelem nejčastěji v příslušném edit boxu nástrojové lišty okna mo‐ delu. Průběh výpočtu je indikován ve stavové liště okna modelu. Modely příkladů 9‐2, 9‐3a i 9‐3b lze po nastavení koncového času okamžitě spustit a po ukončení výpočtu se podívat na časový průběh signálu připojeného na vstup bloku Scope. Průběh zobrazíme dvojklikem na blok Scope a případ‐ ným využitím tlačítka se symbolem dalekohledu pro nastavení automatického měřítka tj. takového měřítka, aby se celý průběh vešel do okna grafu (viz Obrá‐ zek 9‐9 a Obrázek 9‐10). Spuštění modelu z příkladu 9‐1 není přímo možné, protože obsahuje paramet‐ ry ve formě symbolických výrazů – nejsou k dispozici číselné hodnoty nutné pro numerický výpočet. Bylo by samozřejmě možné doplnit konkrétní číselné hod‐ noty do parametrů bloků za symbolické názvy, ale existuje elegantnější řešení. Výrazy uvedené v parametrech bloků jsou vyhodnocovány v pracovním prosto‐ ru (workspace) MATLABu. Pokud jsou tedy hodnoty proměnných použitých KŘP/IMSW Modelování ve výpočtových software
9‐9 (15) 27.10.11
František Dušek KŘP FEI Univerzita Pardubice
v parametrech bloků SIMULINKu naplněny číselnými hodnotami před spuště‐ ním výpočtu modelu je výpočet možný. Naplnění je možné např. příkazy MATLABu (>> a=2; b=1; c=0.1;) nebo spuštěním skriptu s definicí potřeb‐ ných proměnných. V parametrech bloků Sine Wave je potřeba aktualizovat periody jednotlivých průběhů Tc=10 s, Tb =5 s a Ta =1 s. Pozor zadává se kruho‐ vá frekvence ω v rad.s‐1 tj. ω=2π/T.
Obrázek 9‐9 Řešení příkladu 9‐2
Obrázek 9‐10 Řešení příkladu 9‐3a, 9‐3b
Po spuštění modelu se v okně MATLABu objeví varovné hlášení, že model ne‐ obsahuje spojitou diferenciální rovnici tj. že použije se jiný řešič a zároveň, že se použije délka výpočtového kroku 0.2 s. Zobrazíme‐li výsledek, dostaneme průběh na Obrázku 9‐11, řešení sice správné ale pro vykreslení nehezké protože je vypočteno v málo bodech. Změňme tedy položku Max step size: v dialogovém okně Simulation->Configuration Parameters … na hodnotu 0.01 a spusťme výpočet znova. Nyní je průběh zobrazovaných průbě‐ hů (Obrázek 9‐12) hladký, protože jsme donutili SIMULINK počítat s maximálním časovým krokem 0.01 s. Více o možnosti změnit implicitní nastavení parametrů řešení bude uvedeno v následujícím bloku.
Obrázek 9‐11 První řešení příkladu 9‐1
KŘP/IMSW Modelování ve výpočtových software
Obrázek 9‐12 Druhé řešení příkladu 9‐1
9‐10 (15) 27.10.11
František Dušek KŘP FEI Univerzita Pardubice
9.3 Základní knihovny bloků Knihovny SIMULINKu jsou rozděleny tak, aby sdružovaly bloky zaměřené na určité okruhy problémů. Zařazení jednotlivých bloků do knihoven se poměrně dost v jednotlivých verzích SIMULINKu měnilo. Také funkčnost některých bloků se může měnit. Základní funkci bloku naznačuje jeho anglický název a ikona. Přehled základních knihoven SIMULINKu v7.6 (R2010b) je na Obrázku 9‐3. Zde zmíníme stručně jen některé. Z pohledu zaměření SIMULINKu je nejdůležitější knihovna Continuous obsahující bloky pro zápis diferenciálních (spojitých) rovnic. Kromě již zmíněného bloku Integrator obsahuje další bloky pro zápis diferenciální rovnice ve tvaru přenosu (Transfer Fcn, Zero-Pole) nebo stavového modelu (State-Space) a blok pro realizaci dopravního zpoždění (Transport Delay). Podobná je knihovna Discrete obsahující bloky pro realizaci diferenčních (vzorkovaných) rovnic. Kromě bloků ekvivalentních spojité verzi (Unit Delay, Discrete Transfer Fcn, Discrete State-Space) obsahuje také bloky pro vzorkování signálů (Zero-Order Hold, First-Order Hold). Další důležitou knihovnou je knihovna Math Operation obsahující bloky pro realizaci matematických vztahů. Z mnoha bloků zmíníme jen některé. Např. bloky pro realizaci základních matematických operací – sčítání (Add, Sum), násobení konstantou (Gain) a násobení signálů (Product, Dot Product). Dále bloky pro realizaci některých základních matematických funkcí (Abs, Sign, Sine Wave Function, Sqrt, Signed Sqrt, Reciprocal Sqrt), dva univerzální bloky umožňující výběr matematické funkce (Math Function) a trigonometrické funkce (Trigonometric Function).
Při tvorbě nelineárních modelů simulujících chování reálných systémů je po‐ třebná knihovna typických nespojitých či nehladkých nelinearit Discontinuties. Z mnoha bloků zmiňme blok pásmového (Saturation) a rychlostního omezení (Rate Limiter), blok přepínače typu relé (Relay), blok nelinearity typu necitlivost (Dead Zone) a hystereze (Backlash). Přehled nejdůležitějších knihoven a bloků uzavřeme knihovnami Sources a Sinks. První jmenovaná obsahuje bloky mající pouze výstup tj. bloky generují‐ cí časový průběh signálů. Zde jmenujme jen nejčastěji používané bloky. Např. bloky generující jednu konstantní hodnotu (Constant) či dvě konstantní hod‐ noty s definovaným časem změny (Step), bloky generující náhodný časový průběh (Uniform Random Number, Random Number, Band Limited White Noise), neperiodický (Clock, Chirp Signal, Ramp) a periodický (Sine Wave, Pulse Generator, Signal Generator, Repeating Sequence) časový průběh. Průběh signálu může být též získán z matice hod‐ not v pracovním prostoru MATLABu (From Workspace) nebo ze souboru (From File). Knihovna Sources obsahuje též blok In představující vstupní signál subsystému. Knihovna Sinks obsahuje bloky mající pouze vstup tj. bloky ukončující signál. Jsou to bloky pro zobrazení hodnoty (Display), časového průběhu (Scope) či KŘP/IMSW Modelování ve výpočtových software
9‐11 (15) 27.10.11
František Dušek KŘP FEI Univerzita Pardubice
závislosti jednoho signálu na druhém (XY Graph). Dále bloky pro zápis průbě‐ hu signálu do proměnné v pracovním prostoru MATLABu (To Workspace) nebo do souboru (To File). Knihovna Sinks obsahuje též blok Out předsta‐ vující výstupní signál subsystému.
9.4 Příklady na procvičení V kapitole 9.4.1 jsou zadání a v kapitole 9.4.2 řešení jednoduchých příkladů na řešení soustav nelineárních diferenciálních rovnic. Předpokládá se, že při řešení příkladů má čtenář k dispozici MATLAB a SIMULINK a aktivně využívá nápovědu k programu.
9.4.1 Zadání příkladů U všech příkladů vytvořte model a zobrazte časový průběh vybraných veličin. Parametry řešení nastavte podle potřeby. Př01. Vypočtěte a zobrazte časový průběh řešení diferenciálních rovnic prvního stupně na intervalu 0 ≤ t ≤ 10. a)
y′ + y = sin( 2t )
b)
y′ − sin(1.25 y ) = 1 y (0) = −1
c)
y′ + ty = 5
y (0) = 1
y ( 0) = 2
Př02. Vypočtěte a zobrazte časový průběh řešení soustavy diferenciálních rov‐ nic prvního stupně (Lorencovy rovnice) na intervalu 0 ≤ t ≤ 5.
x′ = 10( y − x ) x (t = 0 ) = 8 y′ = 127 x − y − xz y (t = 0 ) = 15 8 z ′ = xy − z z (t = 0 ) = 90 3
Př03. Vypočtěte a zobrazte časový průběh řešení diferenciálních rovnic druhé‐ ho stupně na intervalu 0 ≤ t ≤ 10. a)
y′′ + 0.5 y = 1
b)
y′′ + 0.75 y′ + 2 y = 2
c)
y′′ + 4ty′ + 4t 2 + 2 y = 20
(
y ( 0) = 2
y′(0) = 1
y ( 0) = 2
)
KŘP/IMSW Modelování ve výpočtových software
y′(0) = 2
y (0) = −2
y′(0) = −2
9‐12 (15) 27.10.11
František Dušek KŘP FEI Univerzita Pardubice
9.4.2 Řešení příkladů Z důvodu menší velikosti souboru a lepšího tisku nebudou grafické průběhy zobrazovány v textu jako hardcopy grafu bloku Scope, ale průběhy budou vy‐ kreslovány v MATLABu pomocí příkazu plot. Př01. Diferenciální rovnice prvního stupně na intervalu 0 ≤ t ≤ 10. a) y ′ + y = sin( 2t ) y (0) = 1 b) y ′ − sin(1.25 y ) = 1 y (0) = −1
y′ + ty = 5
c)
y ( 0) = 2 Příklad 9-1
5
ya(t) yb(t) yc(t)
4
3
2
1
0
-1
0
1
2
3
4
5
6
7
8
9
10
Př02. Soustava diferenciálních rovnic prvního stupně (Lorencovy rovnice) na intervalu 0 ≤ t ≤ 5.
x′ = 10( y − x ) x(t = 0 ) = 8 y′ = 127 x − y − xz y (t = 0 ) = 15 8 z ′ = xy − z z (t = 0 ) = 90 3
Příklad 9-2
200
x(t) y(t) z(t)
150
100
50
0
-50
-100
KŘP/IMSW Modelování ve výpočtových software
0
0.5
9‐13 (15) 27.10.11
1
1.5
2
2.5
3
3.5
4
4.5
5
František Dušek KŘP FEI Univerzita Pardubice
Př03. Diferenciální rovnice druhého stupně na intervalu 0 ≤ t ≤ 10. a)
y′′ + 0.5 y = 1 y (0) = 2 y′(0) = 1
y′ = v v′ = 1− 0.5 y
b)
y′′ + 0.75 y′ + 2 y = 2 y (0) = 2 y′(0) = 2
y′ = v v′ = 2 − 2v − 2 y
c)
y′′ + 4ty′ + 4t 2 + 2 y = 20 y (0) = −2 y′(0) = −2
(
)
y′ = v
(
)
v′ = 20 − 4tv − 4t 2 + 2 y
Příklad 9-3
4
3
2
1
0
-1 ya(t) yb(t) yc(t)
-2
-3 0
1
2
3
4
KŘP/IMSW Modelování ve výpočtových software
5
6
7
9‐14 (15) 27.10.11
8
9
10
František Dušek KŘP FEI Univerzita Pardubice
Pojmy k zapamatování Okruhy problémů: tvorba modelu, vizualizace výsledků řešení, knihovny bloků, parametry bloků, spuštění řešení Použité nástroje:
Library Browser
Bloky: Constant, Gain, Integrator, Math Function, Mux, Product, Sine Wave, Scope, Sum, Trigonometric Function
Otázky na procvičení 1. 2. 3.
Co v SIMULINKu znamená pojem model? K čemu slouží nástroj Library Browser? Jak vytvoříme automaticky spoj mezi výstupem jednoho a vstupem druhé‐ ho bloku? 4. Ve kterých knihovnách jsou bloky používané jako zdroje (začátky) signálů a bloky pro zobrazení průběhu signálu? 5. Jak se jmenuje základní blok umožňující zápis a řešení diferenciální rovni‐ ce? 6. Jak (kde v modelu) nastavíme počáteční podmínky diferenciální rovnice?
Odkazy a další studijní prameny •
•
elektronická dokumentace k programu SIMULINK – v „Getting Started“ části „Simulink Software Basic“ a „Creating Simulink Model“, v „User's Guide / Introduction to Simulink “ část „Simulink Basics“ elektronická dokumentace – www.mathworks.com/help/
KŘP/IMSW Modelování ve výpočtových software
9‐15 (15) 27.10.11
František Dušek KŘP FEI Univerzita Pardubice
10 Parametry řešení, blok integrátor, typické neli‐ nearity Studijní cíl Desátý blok pokračuje v seznamování se SIMULINKem. V první části se podrob‐ něji seznámíme s nastavením parametrů řešení. Dále si řekneme bližší infor‐ mace o základním bloku pro řešení diferenciálních rovnic – o bloku integrátor. Poslední část se bude zabývat bloky umožňujícími realizovat zápis nespojitých a nehladkých nelinearit – bloky typických nelinearit.
Doba nutná k nastudování
1 ‐ 2 hodiny
Průvodce studiem Předpokládá se, že čtenář je seznámen s prostředím MATLABu a základy práce v SIMULINKu popsanými v devátém bloku. Pro řešení příkladů jsou též potřeba základní znalosti matematiky, fyziky a z oblasti diferenciálních rovnic. Při studiu je vhodné mít spuštěný MATLAB a SIMULINK a jednotlivé příkazy či funkce hned vyzkoušet a případně získat podrobnější informace využíváním nápovědy k programu. Na závěr jsou opět uvedeny řešené příklady na procvičení. V textu jsou použity následující typografické konvence: Calibri 11, Bold, Italic Calibri 11 Courier Courier Courier Courier
New New New New
nové pojmy k zapamatování označení klávesy 10, Bold názvy nástrojů MATLABu 10 názvy bloků použitých v programu 10, Italic názvy proměnných použitých v programu 10, Bold upřesnění nápovědy (help téma)
KŘP/IMSW Modelování ve výpočtových software
10‐1 (13) 5.11.11
František Dušek KŘP FEI Univerzita Pardubice
10.1 Spuštění modelu a parametry řešení Spuštění řešení modelu – kombinací kláves Ctrl+T, pomocí položky menu okna modelu Simulation –> Start, nebo stiskem tlačítka se symbolem černého trojúhelníku na nástrojové liště – bylo již zmíněno v minulém bloku. Zde dopl‐ níme co se při spuštění řešení děje a jak lze určité vlastnosti změnit. Při spuštění je provedena 1 kontrola parametrů bloků, vyhodnocení zapsaných výrazů a aktualizace vlastností bloků závislých na parametrech včetně vlastnos‐ tí, které se přenášejí z předchozích bloků po spojích (např. interval vzorkování). Dále SIMULINK provede rozklad použitých subsystémů na základní bloky (ana‐ logie rozvoje maker před překladem programu), určí pořadí vyhodnocování bloků, alokuje paměť pro řešení a poté spustí řešení. Vlastní řešení pak spočívá v postupném opakovaném výpočtu (v časových okamžicích určovaných podle průběhu výpočtu SIMULINKem) hodnot výstupních signálů jednotlivých bloků na základě aktuálních hodnot na vstupech bloků. Parametry řešení Způsob řešení a některé jeho parametry lze nastavit v dialogovém okně vyvo‐ laném pomocí položky menu Simulation –> Configuration Parameters … (též Ctrl+E) – viz Obrázek 10‐1.
Obrázek 10‐1 Konfigurační parametry modelu
1
Tyto akce lze vyvolat samostatně volbou položky menu okna modelu Edit –> Model Blocks –> Refresh Model Blocks nebo klávesovou zkratkou Ctrl+K. Aktualizace grafického obsahu okna se provede volbou položky menu okna modelu Edit –> Update Diagram nebo klávesovou zkratkou Ctrl+D.
KŘP/IMSW Modelování ve výpočtových software
10‐2 (13) 5.11.11
František Dušek KŘP FEI Univerzita Pardubice
Stručnou nápovědu ke každé větvi lze vyvolat tlačítkem Help v pravém dolním rohu dialogového okna. Jednoduché vysvětlení (nápovědu) jednotlivých polo‐ žek získáme stiskem pravého tlačítka myši nad vybranou položkou a následným výběrem „What‘s This?“
Z hlediska řešení modelu je nejdůležitější zobrazená větev Solver, kde je možné kromě koncové hodnoty (nastavitelné i v nástrojové liště okna modelu) zvolit případně i počáteční hodnotu simulačního času řešení (Start time). Je zde možné zvolit typ použitého řešiče 2 (položka Solver: – implicitně se používá ode45) včetně parametrů ovlivňujících přesnost řešení. Jsou nabízeny i další řešiče vhod‐ né pro speciální případy 3 (viz Obrázek 10‐2). Zde se zmíníme pouze o tzv. „stiff“ soustavách, které při použití standardního řešiče ode45 vedou na tako‐ vé snížení kroku řešení, že se výpočet zastaví (po‐ známe podle zastavení indikátoru průběhu vý‐ Obrázek 10‐2 Možné řešiče počtu na stavovém řádku okna modelu). Pokud k této situaci dojde, zastavíme řešení pomocí tla‐ čítka Stop Simulation na nástrojové liště okna modelu (nebo výběrem po‐ ložky menu Simulation -> Stop) a zvolíme některý ze stiff řešičů (viz ozna‐ čení na Obrázku 10‐2) a zkusíme, zda se výpočet podaří dokončit. Užitečná je možnost ovlivnit krok řešení – zejména jeho maximální hodnotu (položka Max step size:), kterou může SIMULINK při výpočtu použít. Řešiče (stejně jako v MATLABu) používají tzv. adaptivní krok výpočtu, tj. velikost kroku výpočtu se v průběhu výpočtu mění tak, aby byla dodržena požadovaná přes‐ nost a zároveň byl časový krok výpočtu co největší (optimalizace celkového výpočetního času řešení). Parametry modelu Kromě možnosti nastavit parametry vlastního výpočtu je užitečné vědět, že lze nastavit i vlast‐ nosti a chování celého modelu. Volbou nabídky menu okna modelu File -> Model properties lze vyvolat dialogové okno se čtyřmi zálož‐ kami (viz Obrázek 10‐3). Nejužitečnější je asi záložka Callbacks, kde je možné zapsat názvy funkcí (či skriptů), které se mají při určité události vykonat. O které události se jedná, je zřejmé ze seznamu na Obrázku 10‐3. Vědět o této možnosti je užitečné např. máme‐li model využívající symbolické pro‐ měnné v parametrech bloků. V tomto případě je Obrázek 10‐3 Parametry modelu potřeba definovat hodnoty proměnných v pracovním prostoru MATLABu před spuštěním řešení. Obvykle máme skript,
2
V podstatě algoritmus pro řešení soustavy diferenciálních rovnic.
3
Např. řešič discrete (no continuous state) pro situaci, kdy je celý model diskrétní tj. tvořen pouze diferenčními rovnicemi.
KŘP/IMSW Modelování ve výpočtových software
10‐3 (13) 5.11.11
František Dušek KŘP FEI Univerzita Pardubice
který tyto proměnné vytvoří. Tento skript je nutné spustit manuálně před na‐ hráním modelu nebo před spuštěním řešení což znamená, že na to musíme myslet a mít v dokumentaci poznamenáno, že je to potřeba provést. Elegant‐ nější je zařadit volání potřebného skriptu do vlastností modelu k vhodné udá‐ losti – v tomto případě asi k události PreLoadFcn, aby se bloky, jejichž počty vstupů či výstupů závisí na hodnotě parametru, mohly po načtení modelu hned správně vytvořit.
10.2 Blok integrátor Již v předchozím textu jsme zmínili nejdůležitější blok pro zápis a řešení diferenciálních rovnic – blok Integrator. Vzhledem k jeho důležitosti zde popíšeme jeho parametry a jejich využití. Na Obrázku 10‐4 jsou ukázány implicitní hodnoty parametrů. Pro běžné používání je nejdůležitější po‐ ložka Initial Condition, pomocí které zadáváme počáteční podmínky, tzn. hodnotu signálu vycházející z tohoto bloku při začátku 4 výpočtu řešení. Pozor ale, že tato hodnota je použita pouze v případě, že položka Initial condition source: je nastavena na hodnotu internal. V případě hodnoty external přibu‐ de bloku Integral jeden vstup a použije se jako počáteční podmínka hodnota signálu na tomto vstupu při Obrázek 10‐5 Blok Integrator startu výpočtu nebo při události reset. Pokud je reset povolen tj. položka External reset má jinou hodnotu než implicitní none, je počáteční hodnota z nastaveného zdroje nastavena na vý‐ stup integrátoru při výskytu situace odpovídající nastavené variantě resetu. Seznam variant resetu je na Obrázku 10‐5 a za‐ hrnuje jak jednorázové události (rising, failing, either) tak i případné déle trvající situace (level, level hold). Výstupní hodnotu integrátoru je možné omezit při zatr‐ ženém boxu Limit output shora (hodnota položky Upper saturation limit:) nebo zdola (hodnota položky Lower saturation limit:). Zda došlo k omezení lze indikovat při zatrženém boxu Show saturation port Obrázek 10‐4 Varianty resetu hodnotou nového výstupního signálu, který
4
Vědomě píši při začátku výpočtu nikoliv v čase t=0, protože je možné, že začátek výpočtu je nastaven v Configuration Parametres na jinou hodnotu
KŘP/IMSW Modelování ve výpočtových software
10‐4 (13) 5.11.11
František Dušek KŘP FEI Univerzita Pardubice
v tomto případě rozšíří počet výstupů bloku. Pokud není hodnota výstupu omezena má signál hodnotu 0, platí‐li horní omezení je hodnota signálu 1 a platí‐li dolní omezení je hodnota signálu ‐1.
Poslední položky, které zmíníme, souvisí s pojmem stavu. Stav je vnitřní pro‐ měnná (paměť) bloku integrátoru potřebná při výpočtu, odděluje vstup bloku od výstupu. Díky tomu, že blok Integrator má stav je možné propojit výstup integrátoru se vstupem, aniž by vznikla algebraická smyčka. Vnitřní proměnnou obsahující stav lze pojmenovat (položka State name:) např. pro případný rozbor koncového stavu a její aktuální hodnotu vyvést na další volitelný výstup – při zaškrtnutí boxu Show state port. Použití parametrů integrátoru ukažme na příkladě zjednodušené simulace po‐ hybu kuličky puštěné v gravitačním poli země na podlahu za předpokladu, že nedochází k žádným ztrátám (ráz dokonale tuhého tělesa, žádný odpor pro‐ středí). Pohyb tělesa v gravitačním poli země bez uvažování ztrát vlivem odpo‐ ru prostředí je popsán rovnicí vycházející z bilance sil na těleso působících tj. síly gravitační Fg=m.g a síly setrvačné F=m.a působící proti (zákon akce a reak‐ ce). Označíme‐li výšku tělesa nad zemí h (t), pak můžeme pohyb tělesa (změnu výšky v čase) zapsat jako
d 2h Fg + F = 0 ⇔ mg + ma = 0 ⇒ = −g dt 2 dh =v h(0) = h0 dt dv d 2h = = − g v(0) = 0 dt dt 2
Na tomto příkladu je dobře vidět rozdíl mezi řešením (numerickým výpočtem) diferenciální rovnice a simulací. Pokud chceme popsat reálné chování, musí se numerický výpočet, který vede na neustále se snižující (z počáteční hodnoty) hodnotu výšky (t→∝ pak h→‐∝) změnit na simulaci. Je potřeba doplnit řešení situace, kdy při dosažení nulové výšky dojde ke změně směru rychlosti tělesa o 180° tj. k odrazu nahoru (je‐li h = 0 pak v = ‐v. Při realizaci využijeme omezení výstupu, reset a externí zdroj počátečních podmí‐ nek. Odpovídající model je na Obrázku 10‐6 a paramet‐ ry integrátoru rychlosti na Obrázku 10‐7 a integrátoru výšky na Obrázku 10‐8. Sestavení simulačního modelu je poměrně pří‐ močaré. Jediná složitější věc (související se zabrá‐ Obrázek 10‐6 Model skákající kulička něním vzniku algebraické smyčky) je, že jako hodnotu rychlosti pro novou počáteční podmínku bloku integrátor, je potřeba vzít hodnotu stavu a ne výstupu integrátoru rychlosti. KŘP/IMSW Modelování ve výpočtových software
10‐5 (13) 5.11.11
František Dušek KŘP FEI Univerzita Pardubice
Výsledný průběh rychlosti a výšky skákající kuličky pro prvních 5 s při počáteční výšce h=1 m a nulové počáteční rychlosti je na Obrázku 10‐9.
Obrázek 10‐7 Parametry integrátoru rychlosti
Obrázek 10‐8 Parametry integrátoru výšky
Příklad 10-1
5
rychlost v(t) výška h(t)
4 3 2 1 0 -1 -2 -3 -4 -5
0
0.5
1
1.5
2
2.5
3
3.5
4
4.5
5
Obrázek 10‐9 Rychlost a výška skákající kuličky
KŘP/IMSW Modelování ve výpočtových software
10‐6 (13) 5.11.11
František Dušek KŘP FEI Univerzita Pardubice
10.3 Typické nelinearity Bloky SIMULINKu, které dovolují zahrnout do modelu chování odpovídající reálným situacím, jsou soustředěny do knihovny Discontinuities, jejíž obsah (ve verzi MATLAB R2010b) je zobrazen na Obrázku 10‐10. Jde o bloky, které realizují nespojité či nehladké závislosti výstupního signálu na vstupním signálu. Toto chování mohou mít i některé jiné bloky. Např. omezení výstupního signálu (podobně jako blok Saturation) je možné nastavit i bloku Integrator, nespojitý výstup má také blok ma‐ tematické funkce Sign (výstupem je hodnota 1 Obrázek 10‐10 Knihovna typických nelinearit pro kladný vstup, nula pro nulový vstup a ‐1 pro záporný výstup), nehladký výstup má blok matema‐ tické funkce Abs (absolutní hodnota) atd. Všechny tyto bloky mají společné to, že k nespojité změně výstupu dochází pro konkrétní hodnotu vstupu. Protože ale výpočet probíhá po krocích nenulové délky je velmi pravděpodobné, že v jednom časovém kroku výpočtu bude hodno‐ ta vstupu např. menší než hodnota, při které má dojít ke změně a v následujícím kroku bude větší. To znamená, že někde mezi, se měla hodnota výstupu změnit a v čase dalšího kroku výpočtu již nějakou dobu ovlivňovat další blo‐ ky. SIMULINK tuto situaci řeší automaticky tak že, pokud tato situace nastane, se „vrátí zpět“. Tj. určí čas, kdy se dosáhne hodnoty vstupu, při které má dojít ke změně výstupu a v tomto čase provede výpočet „mimo pořadí“. Toto chování může být vypnuto či zapnuto zaškrtnu‐ tím vlastnosti Enable zero-crossing detection v parametrech příslušných bloků. Chování některých bloků je ukážeme pomocí modelu na Obrázku 10‐11, kde pilový signál gene‐ rovaný blokem Repeating Sequence je při‐ veden na vstup bloků Relay, Saturation, Dead Zone, Coulomb & Viscous Friction a sinusový signál na vstup bloků Quantizer a Rate Limiter. Průběh vstupu bloku je KŘP/IMSW Modelování ve výpočtových software
10‐7 (13) 5.11.11
Obrázek 10‐11 Typické nelinearity
František Dušek KŘP FEI Univerzita Pardubice
označen u(t) a výstup bloku y(t) a pro každý blok jsou oba průběhy vykresleny do samostatného obrázku. Na Obrázku 10‐12 je znázorněno chování bloku Relay (relé s hysterézí). Blok přepíná mezi dvěma hodnotami výstupu (yH, yL) při hodnotě vstupu větší nebo menší než nastavené hodnoty (uH, uL) tj. y = yH je‐li u ≥ uH a y = yL je‐li u ≤ uL). Chování bloku Saturation (saturace, pásmové omezení) je na Obrázku 10‐13. V pásmu hodnot vstupního signálu uL ≤ u ≤ uH blok propustí vstup beze změny na výstup tj. y = u. Je‐li vstup větší než horní mez (u ≥ uH) je výstup omezen na hodnotu horní meze tj. y = uH, je‐li vstup menší než dolní mez (u ≤ uH) je výstup omezen na hodnotu dolní meze tj. y = uL. Relay
2 1.5
Switch on: oL=0.5
1
0.5
0.5
0
0
-0.5
-0.5
-2
1
2
3
4
5
6
Lower limit: uL=-0.5
-1.5
Output off: oR=-0.75 0
Upper limit: uH=0.5
-1
Switch off: yL=0.25
-1.5
u(t) y(t)
1.5
1
-1
Saturation
2 u(t) y(t)
Output on: yH=1
7
8
-2
0
Obrázek 10‐12 Blok Relay
1
2
3
4
5
6
7
8
Obrázek 10‐13 Blok Saturation
Chování bloku Dead Zone je (mrtvá zóna) je ukázáno na Obrázku 10‐14. Šířka zóny je vymezena parametry začátek oS a konec oE. Chování bloku Coulomb & Viscous Friction (suché tření) je popsán rovnicí y = sign(u ) Z u + o a
(
)
chování je ukázáno na Obrázku 10‐15. Dead Zone
2 1.5
Offset: o=0.5
1
0.5
0.5
0
0
-0.5
-0.5
-1
u(t) y(t)
1.5
Start of dead zone: oS=-0.5
1
Coulomb & Viscous Friction
2 u(t) y(t)
Gain: Z=0.5
-1
End of dead zone: oE=1.0
-1.5
-1.5
y=sign(x)*(Z*abs(x)+o) -2
0
1
2
3
4
5
6
7
Obrázek 10‐14 Blok Dead Zone
8
-2
0
1
2
3
4
5
6
7
8
Obrázek 10‐15 Blok Coulomb & Viscous Friction
Poslední dva bloky Quantizer (kvantifikace signálu tj. rozdělení do úrovní) a Rate Limiter (omezení na maximální rychlost růstu i poklesu tj. derivace) mají jako vstup signál tvaru funkce sinus. Průběhy výstupů jsou na Obrázku 10‐16 a Obrázku 10‐18.
KŘP/IMSW Modelování ve výpočtových software
10‐8 (13) 5.11.11
František Dušek KŘP FEI Univerzita Pardubice
Quantizer
1
1 u(t) y(t)
Quantization interval: 0.25
0.8
0.6
0.4
0.4
0.2
0.2
0
0
-0.2
-0.2
-0.4
-0.4
-0.6
-0.6
-0.8
-0.8 0
1
2
3
4
5
6
7
u(t) y(t)
0.8
0.6
-1
Rate Limiter
8
-1
Rising slew rate: 1.0
Faling slew rate: -1.25
0
1
Obrázek 10‐16 Blok Quantizer
2
3
4
5
6
7
8
Obrázek 10‐17 Rate Limiter
10.4 Příklady na procvičení V kapitole 10.4.1 jsou zadání a v kapitole 10.4.2 řešení příkladů na použití ty‐ pických nelinearit pro realizaci nespojitostí ve výpočtu. Předpokládá se, že při řešení příkladů má čtenář k dispozici MATLAB a SIMULINK a aktivně využívá nápovědu k programu.
10.4.1 Zadání příkladů Př01. Simulujte časový průběh výstupního napětí usměrňovačů ve dvou zapo‐ jeních, na jejichž vstup je přivedeno sinusové napětí 12 V / 50 Hz. D1
D1
U0
R
D2
U0
U
R
U
D3 a) jednocestný usměrňovač
D4
b) dvoucestný usměrňovač (Grätzův můstek)
Návod: Diody nahraďte blokem Saturation propouštějícím pouze kladné napětí. Diodám propouštějícím zápornou půlvlnu otočte znaménko napětí. Průběhy vstupního a vý‐ stupního napětí vykreslete jedním blokem Scope jako dva samostatné průběhy (v okně Scope, tlačítko Parameters, volba Number of axes: 2). c) Oba usměrňovače doplňte filtrem se zapo‐ R0 U0
R1 L
i1 C1
i2
i3 C2
U R
KŘP/IMSW Modelování ve výpočtových software
jením podle vedlejšího obrázku a jehož chování je popsáno následující soustavou rovnic, 10‐9 (13) 5.11.11
František Dušek KŘP FEI Univerzita Pardubice
kde R0 = 0.5 Ω, R1 = 0.5 Ω, R = 1000 Ω, L = 0.025 H, C1 = 50 mF a C2 = 100 mF. Odpor R představuje zátěž a odpor R0 vnitřní odpor zdroje. Napětí ve větvi s C1:
U 0 = R0 (i1 + i2 + i3 ) +
Napětí ve větvi s C2:
1 1 d i2 dt i1dt = R1 (i2 + i3 ) + L (i2 + i3 ) + ∫ dt C2 ∫ C1
Napětí ve větvi s R:
1 i2dt = R3i3 C2 ∫
1 i1dt C1 ∫
Návod: Pro realizaci filtru je vhodné zapsat původní rovnice ve tvaru umožňují‐ cím snadnější zápis do formy mo‐ 1 delu. Zaveďme nejprve substituce i1 = (U 0 − U1 ) − i2 − i3 R0 pro napětí na kondenzátorech
1 1 i1dt U 2 = i2 dt a ∫ C1 C2 ∫
(
)
1 R U1dt − ∫ U 2 dt − 1 ∫ (i2 + i3 )dt − i3 ∫ L L pak zapíšeme soustavu rovnic vy‐ 1 i3 = U 2 jádřenou pro jednotlivé proudy R U1 =
i2 =
Př02. Simulujte časový průběh polohy (výšky nad rovinou dopadu) kuličky puš‐ těné (v0 = 0 ms‐1) z výšky h0 = 1 m nad podlahou v gravitačním poli země (g = 9.81 m.s‐2). Odpor prostředí zanedbejte. Při odrazu dochází ke ztrátám odpo‐ vídajícím snížení odrazové rychlosti o 0.2 ms‐1. Simulace se ukončí, pokud se poloha kuličky po 10 ms nemění. Návod: Poloha kuličky padající v gravitačním poli země bez odporu prostředí je
dh = v h(0) = h0 d h dt popsána rovnicí 2 = − g ⇔ . Při výpočtu je nutné dv dt = − g v(0) = v0 dt 2
omezit max. velikost výpočetního kroku na cca 10 ms. Dopad a odraz je simu‐ lován změnou smyslu (znaménka)aktuální rychlosti (výstupní hodnota inte‐ grátoru rychlosti, Initial Condition) v okamžiku dopadu (nulové výšky, indikace pomocí Show saturation port integrátoru výšky). Pozor není možné použít jako nový počáteční stav integrátoru jeho aktuální výstup – je nutné použít hodnotu stavu. Ztráty při dopadu simulujte pomocí bloku Dead Zone. Ukončení výpočtu zajistí blok Stop Simulation, když se jeho vstup změní z hodnoty 0 na hodnotu 1. Tento signál získáme jako výstup bloku po‐ rovnání dvou hodnot (Relational Operator) – aktuální hodnoty výšky a hodnoty výšky o 10 ms zpožděné (blok Transport Delay).
KŘP/IMSW Modelování ve výpočtových software
10‐10 (13) 5.11.11
František Dušek KŘP FEI Univerzita Pardubice
10.4.2 Řešení příkladů Z důvodu menší velikosti souboru a lepšího tisku nebudou grafické průběhy zobrazovány v textu jako hardcopy grafu bloku Scope, ale průběhy budou vy‐ kreslovány v MATLABu pomocí příkazu plot. Př01. Simulujte časový průběh výstupního napětí usměrňovačů ve dvou zapo‐ jeních, na jejichž vstup je přivedeno sinusové napětí 12 V / 50 Hz. Model simulující chování obou usměrňovačů, doba sledování 0.1 s, parametr Max. step size: 0.001 s. Příklad 10-3
20
U0 0 -20
0
0.01
0.02
0.03
0.04
0.05
0.06
0.07
0.08
0.09
0.1
20 U1 10 0
0
0.01
0.02
0.03
0.04
0.05
0.06
0.07
0.08
0.09
0.1
20 U2 10 0
0
0.01
0.02
0.03
0.04
0.05
0.06
0.07
0.08
0.09
0.1
Realizaci filtru je možné podle v zadání uvedených rovnic zapsat např. tak, jak je uvedeno na následujícím obrázku, kde modře jsou substituce (napětí U1 a U2 na kondenzátorech) a červeně proudy v jednotlivých větvích. Hodnoty proměnných použitých v parametrech bloků jsou zadány v okně MATLABu.
KŘP/IMSW Modelování ve výpočtových software
10‐11 (13) 5.11.11
František Dušek KŘP FEI Univerzita Pardubice
Příklad 10-3
Příklad 10-3
12
12 U0 U1
U0 U1
10
10
8
8
6
6
4
4
2
2
0
0
0.05
0.1
0.15
0.2
0.25
0
jednocestný usměrňovač s filtrem
0
0.05
0.1
0.15
0.2
0.25
dvoucestný usměrňovač s filtrem
Př02. Simulujte časový průběh polohy (výšky nad rovinou dopadu) kuličky puš‐ těné (v0 = 0 ms‐1) z výšky h0 = 1 m nad podlahou v gravitačním poli země (g = 9.81 m.s‐2). Odpor prostředí zanedbejte. Při odrazu dochází ke ztrátám odpo‐ vídajícím snížení odrazové rychlosti o 0.2 ms‐1. Simulace se ukončí, pokud se poloha kuličky po 10 ms nemění.
Skákající kulička
5
rychlost výška
4 3 2 1 0 -1 -2 -3 -4 -5
0
2
4
KŘP/IMSW Modelování ve výpočtových software
6
8
10‐12 (13) 5.11.11
10
12
František Dušek KŘP FEI Univerzita Pardubice
Pojmy k zapamatování Okruhy problémů: parametry řešení a parametry modelu, možnosti bloku integrátor, některé typické nelinearity Použité nástroje:
Library Browser
Bloky: Constant, Coulomb & Viscous Fiction, Dead Zone, Gain, Integrator, Quantizer, Rate Limiter, Relay, Repeating Sequence, Saturation, Scope, Sine Wave, Sum
Otázky na procvičení 1. 2.
Jak v SIMULINKu poznáme, že se výpočet zastavil? Jak je možné zajistit automatické spuštění skriptu s definicí parametrů modelu? 3. Co ovlivňuje volba „Enable zero‐crossing detection“? 4. Které standardní bloky z knihovny „Math Operation“ mají nespojitý či ne‐ hladký výstup? 5. Jaké typické nelinearity znáte?
Odkazy a další studijní prameny •
• •
elektronická dokumentace k programu SIMULINK – v „Reference / Simu‐ link Graphical User Interface“ část „Configuration Parameters Dialog Box“ elektronická dokumentace k programu SIMULINK – v „Blocks “ části „Continuous / Integrator, Integrator Limited“ a „Discontinuities“ elektronická dokumentace – www.mathworks.com/help/
KŘP/IMSW Modelování ve výpočtových software
10‐13 (13) 5.11.11
František Dušek KŘP FEI Univerzita Pardubice
11 Subsystém a maskovaný subsystém, uživatelské knihovny Studijní cíl Jedenáctý blok je věnován jednak dalším možnostem SIMULINKu pro usnadně‐ ní tvorby složitějších modelů. V první části se ukážeme tvorbu subsystémů a maskovaných subsystémů a zmíníme se o používání funkcí. V druhé části si ukážeme tvorbu uživatelských knihoven.
Doba nutná k nastudování
1 ‐ 2 hodiny
Průvodce studiem Předpokládá se, že čtenář je seznámen s prostředím MATLABu a možnostmi SIMULINKu popsanými v předchozích kapitolách. Pro řešení příkladů jsou též potřeba základní znalosti matematiky, fyziky a z oblasti diferenciálních rovnic. Při studiu je vhodné mít spuštěný MATLAB a SIMULINK a jednotlivé příkazy či funkce hned vyzkoušet a případně získat podrobnější informace využíváním nápovědy k programu. Na závěr jsou opět uvedeny řešené příklady na procvi‐ čení. V textu jsou použity následující typografické konvence: Calibri 11, Bold, Italic Calibri 11 Courier New Courier New Courier New
Courier New
nové pojmy k zapamatování označení klávesy 10, Bold názvy nástrojů MATLABu 10 názvy bloků použitých v programu 10, Italic názvy proměnných použitých v programu názvy parametrů bloků či dialogových oken 10, Bold upřesnění nápovědy (help téma)
KŘP/IMSW Modelování ve výpočtových software
11‐1 (14) 20.11.11
František Dušek KŘP FEI Univerzita Pardubice
11.1 Subsystémy a funkce V SIMULINKU je možné používat funkce, jak je známe ze standardních progra‐ movacích jazyků, jen omezeně. Mnohem častější je používání subsystémů tj. zapojení několika existujících bloků do nového bloku. Použití subsystémů zpře‐ hledňuje zápis složitějších modelů a usnadňuje jejich vytváření v případě, že obsahuje opakující se části. Maskovaný subsystém dovoluje vytvořit pro každý subsystém samostatnou sadu proměnných, jejichž hodnoty lze v uživatel‐ sky vytvořeném dialogovém okně zadat a zadané hodnoty příkazy MATLABu libovolně přepočítat.
11.1.1 Subsystém V terminologii SIMULINK je pojmem subsystém označováno zapojení několika existujících 1 bloků s označení vstupních a výstupních signálů vytvářející nový blok. Je potřeba si uvědomit, že nejde o funkci ve smyslu, jak ji známe ve stan‐ dardních jazycích. Jde o ekvivalent makra, tj. před spuštěním řešení dojde k rozkladu každého subsystému na knihovní bloky a jejich vložení do modelu tolikrát kolikrát je subsystém v modelu použit. Nedochází tedy k vícenásobné‐ mu využití stejného kódu jako u funkce. Význam subsystému je v zvýšení pře‐ hlednosti zápisu modelu a zvyšuje efektivitu tvorby složitějších modelů mož‐ ností opakovaně použít opakující se části zapojení. Vytvoření a použití subsystému ukažme na příkladě výpočtu časového průběhu teploty vody na výstupu z trubky parního ohřívače v závislosti na průtoku ohří‐ vané vody. Formulace úlohy vede na parciální diferenciální rovnici s nezávisle proměnnými čas a vzdálenost od počátku trubky. My si ukážeme přibližné ře‐ šení náhradou parciální diferenciální rovnice soustavou rovnic diferenciálních. Toto řešení vychází z myšlenky nahradit spojitou časovou změnu teploty podél délky trubky mnoha krátkými úseky se stejnou ale časově proměnnou teplotou. Pokud zane‐ Tp dbáme tepelnou kapacitu pláště trubky, bude‐ me předpokládat, že teploty kondenzující páry Tk‐1 Tk Tk+1 Tp je po celé délce stejná, že teplota Tk je v objemu každého k‐tého úseku stejná a že M, S dochází k výměně tepla pouze v radiálním smě‐ m m c, α ru, můžeme k‐tý úsek popsat diferenciální rov‐ nicí (viz také schéma na Obrázku 11‐1) vycházející Tp z tepelné bilance úseku.
dT mcTk −1 + αS (Tp − Tk ) = mcTk + Mc k 123 14243 1 2 3 dt 1 424 3 prichazejici odchazejici predane teplo
kde
teplo
m
[kg.s‐1]
Obrázek 11‐1 k‐tý úsek tepelného výměníku
akumulovane teplo
teplo
hmotový průtok ohřívané vody
1
Je možné použít jak standardní knihovní bloky tak i dříve vytvořené subsystémy či maskované subsystémy.
KŘP/IMSW Modelování ve výpočtových software
11‐2 (14) 20.11.11
František Dušek KŘP FEI Univerzita Pardubice
c α S M
[J.kg‐1.K‐1] [J.m‐2.s‐1] [m2] [kg]
měrná tepelná kapacita vody koeficient přestupu tepla přestupní plocha tepla jednoho úseku hmota vody v jednom úseku
Z této rovnice vyjdeme při vy‐ t tváření modelu. Nejprve ji pře‐ αS ⎡1 ⎤ = T vedeme do tvaru vhodnějšího k ⎢⎣ M m(Tk −1 − Tk ) + Mc Tp − Tk ⎥⎦ dt 0 pro převod do formy modelu a uvědomíme si, co jsou vstupní (m, Tk‐1, Tp) a výstupní signály (Tk) abychom je v zapojení modelu označili bloky In (knihovna Sources) a Out (knihovna Sinks). Odpovídající model pak může vypa‐ Obrázek 11‐2 Jeden úsek tepelného výměníku s označením vstupů dat, jak je ukázáno na a výstupů Obrázku 11‐2. Je vhodné pojmenovat bloky In, Out názvy odpovídajícími významu signálů. Čísla uvnitř bloků určují pořadí vstupů či výstupů subsystému. Pořadí je možné kdykoli změnit změnou čísla v bloku.
(
∫
)
Subsystém nyní vytvoříme tak, že vybereme (označíme) všechny bloky 2 , které budou tvořit subsystém, a pomocí nabídky hlavního menu Edit->Create Subsystem nebo pomocí pravého tlačítka myši a volby Create Subsystem nebo Ctrl+G vytvoříme sub‐ systém. Vznikne nový blok s příslušným po‐ Obrázek 11‐3 Nově vzniklý blok Subsys‐ tem čtem vstupů a výstupů jak je ukázáno na Obrázku 11‐3. Vnitřní zapojení nemaskovaného subsystému zobrazíme v novém okně dvojklikem na blok. Máme‐li připraven jeden díl, můžeme vytvořit celkový model – jednotlivé díly zkopírujeme, propojíme, definujeme vstupní signály celého zapojení a vybere‐ me signály pro zobrazení požadovaných průběhů. Znázorněme průběh výstup‐ ní teploty výměníku tvořeného jednou trubkou o průměru 3 cm délky 1 m při změně z nulového průtoku na průtok 0.05 kg.s‐1. Teplota syté páry je udržová‐ na na hodnotě 120 °C, teplota vstupující vody je 30 °C, měrná tepelná kapacita vody je 4180 J.kg‐1.K‐1 a koeficient přestupu tepla je 800 J.m‐2.s‐1. Ukažme prů‐ běh výstupní teploty při dělení na 6 a 12 dílů. Nejprve si připravíme hodnoty parametrů – nejlépe pomocí skriptu, kde přepo‐ čítáme zadané hodnoty na potřebné parametry. Obě varianty výpočtu se kro‐
2
Můžeme označit také jen pouze část bloků v okně modelu. Pozor pokud chceme označit všech‐ ny bloky v okně modelu, není možné použít pro označení Ctrl‐A. Je nutný výběr oblasti tažením myší nebo výběr jednotlivých bloků.
KŘP/IMSW Modelování ve výpočtových software
11‐3 (14) 20.11.11
František Dušek KŘP FEI Univerzita Pardubice
mě počtu dílů (použitých subsystémů) budou ještě lišit hodnotami parametrů S (přestupní plocha tepla = plášť trubky v jednom dílu) a M (hmotnost vody – hmotnost objemu jednoho dílu). Počáteční teploty dílů při nulovém průtoku budou stejné jako teplota páry. Tp=120; T0=30; Tk0=Tp; al=800; c=4180; ro=1000;
% % % % % %
L=1; D=0.03;
% délka trubky % průměr trubky
S=pi*D*L; S1=S/6; S2=S/12; M=pi*D^2/4*ro; M1=M/6; M2=M/12;
% % % % % %
teplota páry v okolí trubky teplota vstupující vody počáteční teplota stejná jako teplota okolí koeficient přestupu tepla měrná tepelná kapacita vody hustota vody
plocha pláště trubky přestupní plocha dílu při dělení na 6 dílů přestupní plocha dílu při dělení na 12 dílů hmotnost objemu vody v trubce hmotnost vody v dílu při dělení na 6 dílů hmotnost vody v dílu při dělení na 12 dílů
Nyní modifikujme subsystém tak, že změníme symbolické parametry S, M na S1, M1, uzavřeme okno se subsystémem a přejmenujeme ho na D6‐1. Zkopíru‐ jeme, změníme názvy parametrů S1, M1 na S2, M2 a nový subsystém přejme‐ nujeme na D12‐1. Z důvodu přehlednějšího zapojení celkového modelu dopo‐ ručuji změnit pořadí vstupů tak, že signál m bude první a signál Tp třetí. Dále kopírováním subsystémů a jejich propojením vytvoříme celkový model (viz Obrázek 11‐4). Obě řady bloků budou mít společné vstupní signály T0, Tp a m.
Obrázek 11‐4 Dva modely tepelného výměníku
Průběh výstupních signálů obou modelů tepelného výměníku je na Obrázku 11‐5.
11.1.2 Maskovaný subsystém Možnost zamaskovat subsystém dovoluje vytvořit vlastní pracovní prostor pro symbolické parametry použité v blocích subsystému. Maskovaný systém tedy umožňuje, aby každá kopie subsystému měla vlastní sadu hodnot použitých symbolických proměnných. Vytvoření maskovaného subsystému ruší napojení na pracovní prostor MATLABu. Hodnoty symbolických proměnných se zadávají v dialogovém okně, které se připraví v rámci vytváření maskovaného systému. Kromě zadání hodnot je možné přepočítat zadané hodnoty libovolnými příkazy
KŘP/IMSW Modelování ve výpočtových software
11‐4 (14) 20.11.11
František Dušek KŘP FEI Univerzita Pardubice
Tepelný výměník
130
m=0.05 kg.s-1
T6 T12
120 110 100 90 80 70 60
m=0 50
0
5
10
15
20
25
30
35
40
45
50
55
60
Obrázek 11‐5 Výstupní teploty výměníku
a funkcemi MATLABu. Přepočet se provádí po ukončení zadávání a před spuš‐ těním řešení modelu. Vytvoření maskovaného subsystému ukážeme opět na příkladu. Použijeme příklad z předchozí kapitoly 11.1.1, kde parametry bloků Gain1 a Gain2 v subsystému na Obrázku 14‐2 nahradíme parametry G1=αS/M/c a G2=1/M. Zamaskování subsystému se provede pomocí nástroje Mask Editor, který vyvoláme buď pomocí položky hlavního menu Edit->Mask Subsystem nebo pravým tlačítkem myši a volbou Mask Subsystem. nebo kombi‐ nací kláves Ctrl+M. Podrobněji o možnos‐ tech nástroje Mask Editor viz nápověda vyvolaná tlačítkem Help. Dialogové okno nástroje Mask Editor má čtyři záložky, z nichž se zmíníme o dvou. V záložce Parameters (viz Obrázek 11‐6) se definují nápo‐ vědné texty a názvy Obrázek 11‐6 Mask Editor / Parameters proměnných, do kte‐ rých se uloží při použití masky zadané hodnoty. V záložce Initialization se zadávají příkazy MATLABu, které se mají pro‐ vést při dokončení zadání hodnot parametrů případně při spuštění řešení mo‐
KŘP/IMSW Modelování ve výpočtových software
11‐5 (14) 20.11.11
František Dušek KŘP FEI Univerzita Pardubice
delu. Na Obrázku 11‐7 je ukázka zápisu příkazů pro výpočet paramet‐ rů G1 a G2 na základě hodnot zadaných pa‐ rametrů zadaných v masce. Po dvojkliku na za‐ maskovaný systém se vyvolá dialogové okno (podle návrhu vytvo‐ řeného v Mask Editor->Parameters), které umožní zadat či změnit hodnoty pa‐ rametrů (viz Obrázek 11‐8).
Obrázek 11‐7 Mask Editor / Initialization
V případě potřeby editace masky je nutné po vybrání bloku maskovaného subsystému vybrat buď položku hlavní‐ ho menu Edit->Edit Mask nebo pomocí pravého tlačítka myši a volbu Edit Mask nebo kombinaci kláves Ctrl+M. Pokud chceme zobrazit či změ‐ nit zapojení bloků maskovaného subsys‐ tému je nutné po vybrání bloku masko‐ vaného subsystému vybrat buď položku hlavního menu Edit->Look Under Mask nebo pomocí pravého tlačítka myši a volbu Look Under Mask nebo kombinaci kláves Ctrl+U. Vytvořený maskovaný subsystém je možné kopíro‐ vat a každá kopie může mít jiné hodnoty parametrů.
Obrázek 11‐8 Dialogové okno parametrů maskovaného subsystému
11.1.3 Uživatelem definované funkce v SIMULINKu Jak již bylo řečeno možnost používání funkcí je v SIMULINKových modelech omezena. Jsou v podstatě tři možnosti, všechny založené na syntaxi MATLABu a přístupné pomocí bloků v knihovně User-Defined Functions. Nejjednodušší možností je použití bloku Fcn, který má jeden vstup (který může být i 1‐D pole signálů) a jeden výstup. Jako parametr bloku může být uveden libovolný přípustný výraz v syntaxi MATLABu se skalárním číselným výsledkem. Není možné používat vektorové operace. Na hodnoty jednotlivých vstupních signálů se ve výrazu odkazujeme pomocí proměnné u(n), kde n≥1 je pořadové číslo signálu v 1‐D poli signálů na vstupu bloku. Chceme‐li např. vyhodnotit KŘP/IMSW Modelování ve výpočtových software
11‐6 (14) 20.11.11
František Dušek KŘP FEI Univerzita Pardubice
výraz y =
a + (sin(b) cos(c) ) a vstupní 1‐D signál přivedený na vstup blo‐ 2
2
ku Fcn je složen ze signálů {c,a,b} v uvedeném pořadí, pak jako parametr bloku Fcn zapíšeme poměrně nepřehledný výraz sqrt(u(2)^2+(sin(u(3)*cos(u(1)))^2). Blíže v nápovědě vyvolané tlačítkem Help bloku Fcn. Další možností je použití bloku (Embedded) MATLAB Fcn, který dovoluje vytvořit uživatelskou funkci v syntaxi MATLABu. Uvnitř funkce lze použít pouze omezenou množinu příkazů a funkcí MATLABu. Vytvořená funkce může mít více vstupních i výstupních parametrů, z nichž každý může být složený z 1‐D polí signálů nebo vektorových signálů. Při spuštění řešení jsou příkazy přelože‐ ny a funkce je v rámci řešení spouštěna jako binární kód. Použití jednoduchých bloků umožňujících volat standardní či uživatelem defi‐ novaných funkcí ukážeme na příkladu pracujícím s vektorovými signály (viz model na Obrázku 11‐9 s uvedenými rozměry signálů). Mějme čtyři časově závislé signály. Signál a(t) = cos(2π/3*t) generovaný blokem Trigonometric Function, signál b(t) = sin(2π/5*t) generovaný blokem Sine Wave Function s parametry Amplitude: 1, Frequence: 2*pi/3, Bias: 0 a Phase: 0, signál c(t)= sin(2π/4*t) generovaný blokem Fcn s para‐ metrem sin(2*pi/4*u(1)) a signál d(t) = cos(2π/6*t) generovaný blokem MATLAB Fcn s parametrem cos. Sig‐ Obrázek 11‐10 Různé možnosti použití funkcí nály jsou po dvojicích sloučeny do 1‐D signálů (blok Mux), které jsou blokem Reshape převedeny na řádkový a sloupcový vektorový signál. Oba vektorové signály jsou přivedeny na vstup bloku Embedded MATLAB Fcn, který provede skalární (výstupní signál y1) a maticový (výstupní signál y2) součin vektorových signálů. Funk‐ ce obsažená v bloku Embedded MATLAB Fcn je ukázána na Obráz‐ ku 11‐10. Po dvojkliku na tento blok se spustí nástroj Embedded MATLAB Editor, ve kterém je možné uživatelskou funkci vytvořit či editovat. Počet vstupů a výstupů bloku se přizpůsobuje počtu vstupních a výstupních parametrů Obrázek 11‐9 Funkce bloku Embeded MATLAB Fcn definovaných v hlavičce uživate‐ lem vytvářené funkce. Nejsložitější možností vytvářet funkce je použití tzv. S‐funkcí. Pomocí bloku SFunction Builder je možné založit kostru S‐funkce v jazyce „C“ a doplnit KŘP/IMSW Modelování ve výpočtových software
11‐7 (14) 20.11.11
František Dušek KŘP FEI Univerzita Pardubice
uživatelský kód. Případně pomocí bloků S-Function (vložení funkce vytvoře‐ né ve FORTRANu, jazyce „C“ nebo v syntaxi MATLABu s určitými omezeními) či Level-2 MATLAB S-Function (plné možnosti vložené funkce zapsané v syntaxi MATLABu) lze vložit připravený kód. Kromě vlastní výkonné části musí kód obsahovat několik dalších vstupních bodů volaných v různých fázích řešení modelu. Vložená S‐funkce se chová jako nový blok včetně možnosti zadávat parametry a případné změny počtu vstupů a výstupů v závislosti na hodnotách parametrů.
11.2 Tvorba uživatelských knihoven Další rozšíření možností subsystémů představuje knihovna. Vytvářet knihovnu (sadu bloků) má význam v případě, že předpokládáme, že tyto bloky budeme opakovaně používat v různých modelech a potřebujeme zajistit automatickou aktualizaci při změně vlastností knihovního bloku. Zásadní rozdíl mezi blokem kopírovaným z jiného modelu a z knihovny je v tom, že při kopírování bloku knihovny je kopie závislá na originále. Je sice možné měnit u kopie knihovního bloku hodnoty parametrů, ale není možné měnit masku či vnitřní zapojení bez přerušení vazby na originál. Vazba zajišťuje automatickou změnu vlastností všech kopií v různých modelech při změně knihovního bloku. Uložení bloků ve formě knihovny tedy umožňuje jejich jednoduché přetahování z knihovny do otevřeného modelu a automatickou aktualizaci knihovních bloků použitých v modelu v případě, že byla knihovna upravena. Další vlastností je ochrana bloku použitého v modelu ‐ knihovní modul není možné v modelu upravovat bez zrušení vazby na knihovnu. Ukažme si jednoduchý příklad vytvoření knihovny, která bude obsahovat čtyři varianty ideálního spojitého PID regulátoru (P, PI, PD a PID), popsanými násle‐ dujícími rovnicemi t ⎡ 1 de(t ) ⎤ P : u (t ) = r0e(t ) PID : u (t ) = r0 ⎢e(t ) + ∫ e(t )dt + TD ⎥ TI 0 dt ⎦ ⎣ t ⎡ ⎤ 1 de(t ) ⎤ ⎡ PI : u (t ) = r0 ⎢e(t ) + ∫ e(t )dt ⎥ PD : u (t ) = r0 ⎢e(t ) + TD TI 0 dt ⎥⎦ ⎣ ⎣ ⎦
Založíme okno nové knihovny volbou File->New->Library. To že jde o okno knihovny je indikováno v názvu okna (viz Obrázek 11‐11). Sestavíme zapojení bloků pro jednotlivé regulátory, každé označíme jako subsystém a zamaskuje‐ me ‐ vytvoříme masku pro zadání parametrů r0, TI a TD. Knihovnu (viz Obrázek 11‐ 11) uložíme např. pod názvem regPID a okno uzavřeme. Tím dojde k uzamčení vytvořené knihovny. Změna knihovny Pokud otevřeme existující knihovnu, je chráněna proti nechtěným změnám. To, že pracujeme s knihovnou a ne se standardním modelem, se kromě indikace v záhlaví okna projeví v okamžiku, kdy budeme chtít přidat nový blok nebo existující blok upravit. Pokus o úpravu knihovny vyvolá okno s upozorněním (Message), že chceme upravovat uzamčenou (locked) knihovnu. Knihovnu je KŘP/IMSW Modelování ve výpočtových software
11‐8 (14) 20.11.11
František Dušek KŘP FEI Univerzita Pardubice
možné odemknout buď v uvedeném okně nebo volbou Edit->Unlock Library. Pak je možné bloky do knihovny přidávat či upravovat. Nové uzamčení se provede při uložení knihovny a uza‐ vření okna. Aktuální stav (Locked/Unlocked) je indikován ve stavovém řádku okna (pravý dolní roh). PID regulator
1/TI Gain1
1 e(t)
1 s Integrator
r0 Gain
1 u(t) TD Gain2
du/dt Derivative
PI regulator
1/TI Gain5
1 e(t)
1 s Integrator1
r0
1 u(t)
Gain4
1 e(t)
r0 Gain7
PD regulator
1 u(t) TD Gain9
du/dt Derivative2
1 e(t)
r0
1 u(t)
Gain3
P regulator
Obrázek 11‐11 Vytváření knihovny regPID
Změna knihovního bloku použitého v modelu Když zkopírujeme blok z existující knihovny do jiného modelu, je vytvořena vazba na příslušný knihovní blok a nelze jej upravovat bez zrušení vazby na knihovnu. Otevřeme‐li takový blok, zjistíme, že otevřeme vazbu (link) na původní knihovní blok (informace v záhlaví okna). Pokud budeme chtít provést změnu v zapojení (vymazat či přidat blok, jinak zapojit atd.), objeví se okno (Message) s upozorněním a možností zrušit vazbu na knihovnu. Při pokusu změnit např. název para‐ metru bloku se opět objeví okno (Warning) s informací o pokusu změnit parametry knihov‐ ního bloku. Pokud chceme editovat blok, musíme vazbu na knihovní blok zrušit. Možné je úplné zrušení vazby příkazem Edit->Link Option->Break Link nebo KŘP/IMSW Modelování ve výpočtových software
11‐9 (14) 20.11.11
František Dušek KŘP FEI Univerzita Pardubice
dočasné zrušení vazby. Dočasně můžeme zrušit vazbu buď volbou v okně upo‐ zornění nebo volbou Edit->Link Option->Disable Link. Zrušená vazba může být opět obnovena. Příkazem Edit->Link Option->Resolve Link je vyvoláno dialogové okno, které nabídne selektivně pro každý změněný blok buď obnovu původního knihovního bloku (Restore) nebo jeho aktualizaci (Push) na základě provedených změn.
Aktualizace knihovních bloků použitých v různých modelech dle stavu v knihovně se provádí při načtení modelu nebo v otevřeném modelu při použití příkazu Edit->Update Diagram.
KŘP/IMSW Modelování ve výpočtových software
11‐10 (14) 20.11.11
František Dušek KŘP FEI Univerzita Pardubice
11.3 Příklady na procvičení V kapitole 11.3.1 jsou zadání a v kapitole 11.3.2 řešení příkladů zahrnujících možnosti SIMULINKu zmiňované v této a předchozích kapitolách. Předpokládá se, že při řešení příkladů má čtenář k dispozici MATLAB a SIMULINK a aktivně využívá nápovědu k programu.
11.3.1 Zadání příkladů Př01. Nalezněte časový průběh signálů x, y a z po dobu prvních 10 s pro dvě sady hodnot parametrů, je‐li dána soustava rovnic
by − cz + a x′(0) = a x(0) = 1 1+ a + b + c cz − ax y′′ + by′ + y = + b y′(0) = b y (0) = 0 1+ a + b + c ax − by z′′ + cz′ + z = + c z′(0) = c z (0) = −1 1+ a + b + c x′′ + ax′ + x =
Sada A: Sada B:
a = 0.1 a = 2.0
b = 0.2 b = 1.5
c = 0.3 c = 1.3
Návod: Vytvořte subsystém popisující jednu rovnici, zkopírujte a upravte identi‐ fikátory parametrů a počáteční hodnoty integrátorů. Použijte maskovaný subsystém s hodnotami parametrů a, b, c zadávanými v masce. Př02. Nalezněte časový průběh výšek hladin soustavy válcových nádrží s přepadem zapojených podle schématu po dobu prvních 3000 s, je‐li každá nádrž popsána soustavou rovnic
Qin = Qou + S
dh dt
Qou = sv o(t )(2 − o(t ) ) 2 gh(t )
h(0) = h0
g = 9.81 ms −2
a parametry jednotlivých nádrží jsou shrnuty v následující tabulce, kde jsou uvedeny průměry ploch S nádrží a průměry kruhových výtokových ploch sv jednotlivých ventilů. Otevření ventilů je signál tj. časově proměnná veličina. Veličina Rozměr 1 Qin m3s‐1 t<1200, Q=7E‐5 t≥1200, Q=0 o ‐‐‐ 0.25 h0 m 0.20 hm m 1.40 D m 0.15 d m 0.005
2
1
3
0.25 0.95 1.00 0.20 0.006
0.3 0.70 0.75 0.25 0.007
Qin
2
hm
o h
S
sv Qou
3
Návod: Vytvořte maskovaný subsystém obsahující všechny potřebné parametry v masce. Při řešení přetečení využijte možnost omezit výstup integrátoru (výšky hladiny). Pomocí výstupu integrátoru indikujícího, že došlo k omezení, a bloku Switch zajistěte, že výtok nádrže je buď výsledek vý‐ počtu, nebo hodnota vstupní přítoku. KŘP/IMSW Modelování ve výpočtových software
11‐11 (14) 20.11.11
František Dušek KŘP FEI Univerzita Pardubice
11.3.2 Řešení příkladů Z důvodu menší velikosti souboru a lepšího tisku nebudou grafické průběhy zobrazovány v textu jako hardcopy grafu bloku Scope, ale průběhy budou vy‐ kreslovány v MATLABu pomocí příkazu plot. Př01. Nalezněte časový průběh signálů x, y a z po dobu prvních 10 s pro dvě sady hodnot parametrů, je‐li dána soustava rovnic Sada A: Sada B:
a = 0.1 a = 2.0
b = 0.2 b = 1.5
c = 0.3 c = 1.3
Pro zápis diferenciální rovnice druhého x′′ + ax′ + x = u x (0) = x x′(0) = d 0 0 řádu můžeme využít přepis na sou‐ x = rdt x(0) = x0 stavu dvou rovnic prvního řádu, kte‐ x′ = r ré se jednodušeji přepisují do mode‐ r ′ = u − ar − x r = (u − ar − x )dt r (0) = d 0 lu SIMULINku. Tuto rovnici zapíšeme Subsystem x b jako model, kde signál u(t) nahra‐ 1 r(0)=a x(0)=1 y Gain2 díme příslušným tvarem, označíme 1 1 Jm s s u r x vstupy (blok In) a výstupy (blok Out) a vy‐ Gain1 Integrator1 Integrator tvoříme subsystém, 2 Maskovany c a a subsystem který označíme z Gain3 Constant Gain např. jako Subsystem x. Subsystém dvakrát zkopírujeme, vhodně pojmenujeme, upravíme názvy proměnných v kopiích a propojíme příslušné vstupy a výstupy Subsystem x subsystémů. Doplníme výstupní signál, vytvoříme 1 další subsystém a zamaskujeme. Kromě zadaných xyz Subsystem y parametrů uložených do proměnných a, b, c, v záložce Initialization vypočteme hodnotu pomocné proměnné Jm=1/(1+a+b+c). Výsledné průběhy pro Subsystem z obě sady parametrů jsou na následujícím obrázku.
∫ ∫
1 x
y
x
z
z
y
x
x
z
y
Sada parametrů A
2
x y z
1 0 -1
0
1
2
3
4
5
6
7
8
9
10
Sada parametrů B 3 2 1
x y z
0 -1
0
1
2
3
4
5
6
7
8
9
10
KŘP/IMSW Modelování ve výpočtových software
11‐12 (14) 20.11.11
František Dušek KŘP FEI Univerzita Pardubice
Př02. Nalezněte časový průběh výšek hladin soustavy válcových nádrží s přepadem zapojených podle schématu po dobu prvních 3000 s. h(0)=h0 Vytvoříme maskovaný subsystém pro Upper saturation limit: hm Lower saturation limit: 0 Nadrz s prepadem jednu nádrž, kde v integrátoru nastaví‐ 1 1 1/S s me omezení výstupu (dolní omezení na -1 / 0 / +1 Qin Gain Integrator 0 a horní na hm) včetně povolení výstu‐ Threshold: 0.5 2 pu Saturation port. Řešení přepadu o >= 2 2 sv Qou realizujeme pomocí bloku Switch, kde Switch Gain1 parametr Threshold nastavíme na Constant hodnotu 0.5 (při dosažení horní meze se Product u 2*g výstup Saturation port změní z 0 na Sqrt Gain2 1, dojde k překročení prahu 0.5 a přepí‐ nač přepne vstupy). V masce přepočte‐ me zadané průměry na odpovídající Step 0.25 plochy – pozor SIMULINK nerozlišuje v masce malá a velká písmena v názvech Constant3 0.25 Nadrz 1 Constant2 Nadrz 2 0.3 proměnných proto název proměnné D a Terminator Nadrz 3 Constant1 dv. Celkový model je pak tvořen trojicí těchto maskovaných subsystémů s pro‐ pojenými výtoky a přítoky jak je uvedeno na obrázku. Průběhy výšek hladin pro zadané parametry jsou uvedeny na dalším obrázku. Qin
1
h
Qin
h
Qou
Qin
Qou
Qin o
h
Qou
Qin o
h
Qou
Qin o
h
Scope
Qou
1.5 h1 h2 h3
1
0.5
0
0
500
1000
KŘP/IMSW Modelování ve výpočtových software
1500
11‐13 (14) 20.11.11
2000
2500
3000
František Dušek KŘP FEI Univerzita Pardubice
Pojmy k zapamatování Okruhy problémů: tvorba a použití subsystému a maskovaného subsysté‐ mu, možnosti tvorby funkcí v SIMULINKu, tvorba knihoven SIMULINKu Použité nástroje: tor
Library Browser, Mask Editor, Embedded MATLAB Edi‐
Bloky: Constant, Embedded MATLAB Fcn, Fcn, Gain, IC, In, Integrator, Mux, Out, Product, Reshape, Scope, Step, Sum, Switch, Trigonometric Function
Otázky na procvičení K čemu slouží bloky In a Out? Jaký je rozdíl mezi subsystémem a funkcí? Pomocí jakého bloku můžeme realizovat složitější matematický výraz? Co označuje pojem S‐funkce? V čem se liší bloky (subsystémy) vytvořené v okně modelu a v okně knihovny? 6. Jak se uzamkne knihovna? 7. Jak je možné měnit bloky knihovny? 1. 2. 3. 4. 5.
Odkazy a další studijní prameny • •
•
•
elektronická dokumentace k programu SIMULINK – v „Reference / Simu‐ link Graphical User Interface“ část „Simulink Mask Editor“ elektronická dokumentace k programu SIMULINK – v „User's Guide / Managing Blocks“ části „Using the Embedded MATLAB Function Block“ a „Working with Block Libraries“ elektronická dokumentace k programu SIMULINK – v „Blocks “ části „User‐Defined Functions / Embedded MATLAB Function“ a „User‐ Defined Functions / Fcn“ elektronická dokumentace – www.mathworks.com/help/
KŘP/IMSW Modelování ve výpočtových software
11‐14 (14) 20.11.11
František Dušek KŘP FEI Univerzita Pardubice
12 Vstup a výstup dat, diskrétní systémy, algebraická smyčka Studijní cíl První část dvanáctého bloku je věnována výměně dat mezi SIMULINKem a oko‐ lím. Zabývat se budeme pouze standardními způsoby tj. výměnou dat mezi SIMULINKem a pracovním prostorem MATLABu a čtením a zápisem do soubo‐ ru. Tématem druhé části jsou systémy obsahující výpočty pouze ve vybraných časových okamžicích tj. diskrétní (či vzorkované) systémy popsané diferenčními rovnicemi. V poslední, třetí části si vysvětlíme co to je algebraická smyčka a jak lze problémy, které ji obsahují, v SIMULINKu řešit.
Doba nutná k nastudování
1 ‐ 2 hodiny
Průvodce studiem Předpokládá se, že čtenář je seznámen s prostředím MATLABu a možnostmi SIMULINKu popsanými v předchozích kapitolách. Pro řešení příkladů jsou též potřeba základní znalosti matematiky, fyziky a z oblasti diferenciálních rovnic. Při studiu je vhodné mít spuštěný MATLAB a SIMULINK a jednotlivé příkazy či funkce hned vyzkoušet a případně získat podrobnější informace využíváním nápovědy k programu. Na závěr jsou opět uvedeny řešené příklady na procvi‐ čení. V textu jsou použity následující typografické konvence: Calibri 11, Bold, Italic Calibri 11 Courier New Courier New Courier New
Courier New
nové pojmy k zapamatování označení klávesy 10, Bold názvy nástrojů MATLABu 10 názvy bloků použitých v programu 10, Italic názvy proměnných použitých v programu názvy parametrů bloků či dialogových oken 10, Bold upřesnění nápovědy (help téma)
KŘP/IMSW Modelování ve výpočtových software
12‐1 (18) 3.12.11
František Dušek KŘP FEI Univerzita Pardubice
12.1 Vstup a výstup dat Použitelnost každého programu významně ovlivňuje, jaké jsou možnosti zadá‐ vání vstupních dat a uložení výsledků. V případě, že vstupních dat je málo je možné tato data zadávat v nějakém dialogu 1 po spuštění programu. Podobně je výsledkem několik čísel je možné výsledky (pro použití v dalším programu) ručně přepsat či jednotlivě zkopírovat. V případě, že je potřeba zpracovat větší objemy dat (např. data získaná měřením či jako výsledek jiných výpočtů) je nutná možnost načtení (či zápisu) externích dat z různých zdrojů. SIMULINK (obecně MATLAB) umožňuje načtení a zápis dat v různých formátech nejen standardně do souboru ale podporuje i další zdroje. Např. je možné číst a zapisovat data přímo do zařízení pro sběr dat (s využitím Data Acquisition Tbx, Instrument Control Tbx nebo OPC Tbx), zpracovat a generovat zvuková a obra‐ zová data v různých formátech (příkazy MATLABu, Image Acquisition Tbx) číst či zapisovat do různých databází (s využitím Database Tbx), vyměňovat si dat s jinými běžícími programy prostřednictvím komunikace DDE, ActiveX či TCP/IP. V tomto bloku se budeme zabývat jen základními možnostmi výměny dat mezi modelem SIMULINKu a pracovním prostorem MATLABu a čtením/zápisem dat ze/do souboru. Je potřeba rozlišovat mezi čtením/zápisem jedné hodnoty (da‐ tové struktury) a zápisem časového průběhu (posloupnosti hodnot). V druhém případě je nutné řešit problém dodatečné informace o čase (time stamp) jed‐ notlivých hodnot.
12.1.1 Výměna dat v paměti Nejjednodušší způsob načtení dat do SIMULINKu jsme již používali. Pokud uve‐ deme jako parametr nějakého nemaskovaného bloku modelu SIMULINku sym‐ bolickou konstantu 2 tak se předpokládá, že proměnná s odpovídajícím názvem existuje v pracovním prostoru (base workspace) MATLABu a její hodnota se použije pro inicializaci lokální kopie v pracovním prostoru modelu použitém při výpočtu modelu. V případě maskovaného subsystému musí být příslušná pro‐ měnná vytvořena v rámci vytváření masky a stává se součástí pracovního pro‐ storu modelu. Ukládání do a čtení dat z lokální proměnné Pokud v modelu potřebujeme dočasně uložit nějakou hodnotu (do pracovního prostoru modelu) a na jiném místě zapojení modelu ji přečíst, jsou k dispozici bloky Goto a From z knihovny Signal Routing. Umožňují zejména na jed‐ nom místě ukončit spoj (signál) a na jiných (jednom či více) místech v něm „po‐ kračovat“. Propojení bloku Goto s příslušnými bloky From je pomocí stejného parametru (tag, identifikátor). Viditelnost 3 tagu (Tag Visibility) lze nasta‐ 1
Maskovaný subsystém v SIMULINKu
2
Proměnná, jejíž hodnota je před zahájením výpočtu definována a tato hodnota se během vý‐ počtu nemění
3
Tj. místo, kde lze použít blok From s tímto tagem
KŘP/IMSW Modelování ve výpočtových software
12‐2 (18) 3.12.11
František Dušek KŘP FEI Univerzita Pardubice
vit v bloku Goto (viz Obrázek 12‐1) buď na local (tag je dostupný pouze v subsys‐ tému, kde byl použit blok Goto), global (tag je do‐ stupný všude) nebo scope (tag je dostupný ve všech subsystémech, kde se použije 4 blok Goto Tag Visibility s příslušným ta‐ gem). Nastavení viditelnosti je Obrázek 12‐1 Viditelnost tagu bloku Goto zobrazeno v ikoně příslušného bloku. Je‐li tag v hranatých závorkách, jde o lokální viditelnost, bez závorek glo‐ bální a složené závorky označují viditelnost typu scope.
Obecnější řešení umožňují bloky Data Store Memory (vytvoření a inicializa‐ ci paměťového prostoru), Data Store Write (uložení aktuální hodnoty sig‐ nálu) a Data Store Read (vyčtení posledně uložené hodnoty) také z knihovny Signal Routing. Tyto bloky jsou užitečné v případě, že hodnotu určitého signálu potřebujeme na několika místech modelu zapisovat a na něko‐ lika jiných místech číst. Příslušný pojmenovaný prostor pro uložení dat včetně počáteční inicializace se vytvoří pomocí bloku Data Store Memory v pracovním prostoru modelu (ne ve workspace MATLABu). Prostor je dostup‐ ný prostřednictvím bloků Data Store Write a Data Store Read a svého jména v modelu (či subsystému), kde byl vytvořen a ve všech subsystémech zde použitých. Rozměry vytvořeného prostoru musí přesně odpovídat rozmě‐ rům dat ukládaných blokem Data Store Write. V důsledku možnosti zapi‐ sovat na více místech nemusí být zřejmé (zejména v případě použití modelu s různým vzorkováním signálů) z jakého zdroje je aktuální vyčtená hodnota. Data z bloku Data Store Memory nejsou přístupná ve workspace MATLABu po skončení řešení ani v případě, že pro inicializaci použijeme proměnnou defi‐ novanou v MATLABu. Její hodnota a rozměry se použijí pouze pro inicializaci paměťového prostoru v dočasném workspace modelu, který je využíván při výpočtu. Další informace viz nápověda k těmto blokům. Principiální ukázka použití výše uvedených bloků je na Obrázku 12‐ 1. Modře je označena jednodušší varianta s nastavenou lokální viditelností. Složitější varianta je označena červeně. V obou pří‐ padech je signál o třech složkách na jednom místě zapisován do lokální proměnné a na dvou místech jsou hodnoty vyčítány.
Data A
A
Data Store Read
Sine Wave B
B
D
Pulse Generator
C
Data
Data
Data Store Write
Data Store Read1
[A]
[A]
Scope
Scope1
C
Repeating Sequence
Initial value: [0;0;0] Data Data Store Memory
Goto
From
Scope2
[A] From1
Scope3
Obrázek 12‐2 Zápis a čtení z lokální proměnné
4
Podobný význam má použití klíčového slova global před názvem proměnné ve funkcích MATLABu
KŘP/IMSW Modelování ve výpočtových software
12‐3 (18) 3.12.11
František Dušek KŘP FEI Univerzita Pardubice
Výměna dat s pracovním prostorem MATLABu Skutečné propojení s pracovním prostorem MATLABu ve smyslu načítání a zapisování časového průběhu signálu umožňují až bloky From Workspace a To Workspace z knihoven Sources a Sinks. U použití těchto bloků je po‐ třeba použít správnou datovou strukturu pro data v pracovním prostoru MATLABu. V případě bloku From Workspace (parametr je název proměnné v pracovním prostoru MATLABu) musí proměnná obsahovat informaci o čase platnosti jed‐ notlivých hodnot (časovou značku, time stamp). Možné jsou dva formáty – dvousloupcová matice a struktura. Maticový formát je možný pouze pro jeden signál (one dimensional). V tomto případě musí první sloupec obsahovat vzrůs‐ tající hodnoty času 5 (v sekundách) a druhý sloupec obsahuje hodnoty signálu v odpovídajícím čase. Pokud je použita struktura pak musí mít následující po‐ ložky nazev.time vektor hodnot časů nazev.signals.dimensions hodnota počtu signálů ve struktuře nazev.signals.values matice hodnot jednotlivých signálů, počet řád‐ ků odpovídá počtu hodnot časů (vektor .time), počet sloup‐ ců odpovídá počtu signálů (hodnota .signals.values)
V parametrech bloku lze nastavit, zda se mají v případě potřeby hodnoty signá‐ lu na při řešení požadovaný čas interpolovat či nikoliv a jaká data mají být pou‐ žita v případě, že simulační čas překročí maximální čas uvedený ve vstupní proměnné. V případě bloku To Workspace se data ukládají do proměnné s názvem uve‐ deným jako parametr bloku ve zvoleném formátu a časech. Jedna možnost je ukládat přivedené signály ve formě matice bez informace o čase. Počet sloupců odpovídá počtu složek signálu při vedeného na vstup bloku. Počet řádků odpo‐ vídá počtu hodnot simulačního času, ve kterých byly prováděny výpočty řešení modelu. Toto platí, pokud jsou parametry bloku Sample time: -1. a Decimation: 1. Hodnoty času je možné získat v automaticky vytvářené proměnné tout v pracovním prostoru MATLABu. Pokud je parametr Sample time na‐ staven na kladnou hodnotu, pak hodnoty na řádcích matice jsou hodnoty sig‐ nálů v časech odpovídajícím násobkům 6 zadané hodnoty času. Kromě intervalu vzorkování lze nastavit ukládání pouze každého n‐tého vzorku – parametr Decimation: n. Dalšími možnými datovými formáty proměnné bloku To Workspace je struktura bez nebo s informací o čase (položka .time). Kromě položek shodných se strukturou popsanou v souvislosti s blokem From Workspace, (tj. .signals. )obsahuje tato struktura ještě položky další a to nazev.blockName
řetězec obsahující jednoznačnou identifikaci bloku (model/subsystem1/…/název_bloku), který proměn‐ nou vytvořil
5
Hodnoty času musí být vzrůstající nicméně nemusí být ekvidistantní
6
Protože je řešení počítáno v jiných časových okamžicích, je odpovídající hodnota signálu získá‐ na interpolací z hodnot řešení v okolí požadovaného času
KŘP/IMSW Modelování ve výpočtových software
12‐4 (18) 3.12.11
František Dušek KŘP FEI Univerzita Pardubice
nazev.signals.label
řetězec obsahující název vstupního signálu (pokud existuje)
Na Obrázku 12‐3 je ukázka modelu zapisujícího průběh dvou signálů do proměn‐ né Data v pracovním prostoru MATLABu. V modelu jsou pojmenovány výstup‐ ní signály bloků Sine Wave (A,B) a výstupní signál bloku Mux (C). Ve vlastnos‐ tech (Signal Properties …) signálu C (pravé tlačítko myši nebo položka menu Edit při vybraném signálu) je nastavena vlastnost Show propagated signals na hodnotu on. Název vstupního signálu se uloží jako součást struk‐ tury proměnné Data uvedené v bloku To Workspace. A
Sine Wave
A B
C
Data To Workspace
B
Sine Wave1
Obrázek 12‐3 Uložení průběhu signálu do workspace MATLABu
Další možností jak uložit průběh signálu do proměnné v pracovním prostoru MATLABu je nastavení parametrů okna bloku Scope. Pokud dvojklikneme na ikonu Parametres okna Scope a zvolíme záložku History můžeme nastavit volbu Save data to workspace a následně název proměnné (Variable name) a její formát (stejné možnosti jako u bloku To workspace) – viz Obrázek 12‐4.
12.1.2 Zápis a čtení ze souboru Obrázek 12‐4 Parametry okna bloku Scope
Možnosti SIMULINKu číst a zapisovat data z/do souboru jsou limitovány datovým formátem souboru, který je omezen pouze na binární formát MATLABu. Nelze tedy v SIMULINKu přímo načíst data v jiném formátu. Čtení ze souboru se provede blokem From File z knihovny Sources a zápis blokem To File z knihovny Sinks. Opět je pomocí předepsaného formátu dat v souboru řešen problém současného uložení informace o času (time stamp) jednotlivých hodnot. Parametry bloku From File jsou ukázány KŘP/IMSW Modelování ve výpočtových software
12‐5 (18) 3.12.11
František Dušek KŘP FEI Univerzita Pardubice
na Obrázku 12‐5 a parametry bloku To File jsou na Obrázku 12‐6. Výhodou bi‐ nárního formátu MATLABu je, že v jednom souboru pro uložení průběhů (blok To File) může být uloženo několik průběhů. Uložená data jsou buď ve formá‐ tu matice nebo ve formě objektu typu timeseries.
Obrázek 12‐5 Parametry bloku From File
Obrázek 12‐6 Parametry bloku To File
Ukládání do diskového souboru ukažme na následujícím příkladu. Mějme sys‐ tém popsaný diferenciální rovnicí druhého řádu
y′′ + a1 y′ + a0 y = b1u′ + b0u y (t = 0) = y00 y′(t = 0) = y10
u (t = 0) = u00
Tento systém realizujme jako maskovaný subsystém s jedním vstupem a jed‐ ním výstupem. Na vstup subsystému přivedeme po dobu 60 s signál tvaru sinu‐ sovky s amplitudou 2 a periodou T(t) měnící se lineárně od hodnoty T0(t=0) = 10 s po hodnotu T60(t =60) = 2 s. Průběh vstupního i výstupního signálu v ča‐ sech po 0.2 s uložíme do diskového souboru DataSys.mat. Pro snazší zápis modelu SIMULINKu (viz Obrázek 12‐7) upravíme původní dife‐ renciální rovnici druhého řádu na soustavu dvou diferenciálních rovnic řádu prvního. Osamostatníme nejvyšší derivaci a dvojím integrováním převedeme do tvaru bez derivací, přičemž zavedeme substituci integrálu po první integraci veličinou r(t)
y′′ = b1u ′ − a1 y ′ + b0u − a0 y t
y ′ = b1u − a1 y + ∫ (b0u − a0 y )dt 0
t
r (t ) = ∫ (b1u − a1 y )dt 0
t
y = ∫ (b1u − a1 y + r (t ) )dt 0
KŘP/IMSW Modelování ve výpočtových software
12‐6 (18) 3.12.11
František Dušek KŘP FEI Univerzita Pardubice
Dále je potřeba dopočítat počáteční hodnotu nové veličiny r(t=0) z počátečních podmínek pů‐ vodní rovnice a rovnice pro první derivaci a ozna‐ čit vstup a výstup modelu
a0
y(t=0)=y00 y'(t=0)=y10 u(t=0)=u 00
y′ = b1u − a1 y + r (t ) y′(t = 0) = y10 = b1u00 − a1 y00 + r (t = 0) ⇒
1
r(0)=y +a y 10
b0
1 s
Gain1
r
1 00
-b u
1 00
r(t)
y(0)=y
00
1 s
b1
u(t)
Gain
y'' + a1y' + a0y = b 1u' + b 0u
Gain2
y (t)
1 y(t)
y
⇒ r (t = 0) = y10 + a1 y00 − b1u00
a1 Ga in3 Z modelu na Obrázku 12‐7 vytvoříme maskovaný Obrázek 12‐7 Model pro volání z MATLABu subsystém, kde všechny potřebné parametry (a1=1, a0=2, b1=2, b0=1) včetně počátečních hodnot (y00=2, y10=‐1, u00=‐1) se zadávají v masce. Tento subsystém doplníme blokem Chirp Signal a blokem To File, kde zadáme hodnoty parametrů v souladu se zadáním podle Obrázku 12‐8.
a =1
a =2
y =+2
b =2
b =1
u =-1
1
0
1
0
y =-1
00
10
00
T =10 s 0 T =2 s
60
u
u(t) y (t)
y
Chirp Signal Subsystem
Sample time> 0.2 s DataSys.mat To File
Scope
Obrázek 12‐8 Model s ukládáním do souboru
V souboru DataSys.mat je proměnná data – objekt typu Timeseries.
12.2 Diskrétní systémy Model v SIMULINKu dovoluje, aby obsahoval jak části spojité v čase (popsané diferenciálními rovnicemi) tak i části diskrétní v čase (popsané diferenčními rovnicemi tj. jejichž hodnoty se mění pouze ve vybraných časových okamži‐ cích). Časové okamžiky změny jedné diskrétní části jsou určeny (ekvidistantním tj. stále stejným) intervalem vzorkování. Model však může obsahovat více dis‐ krétních částí s různým intervalem vzorkování. Základní bloky umožňující vy‐ tvářet diskrétní části modelu jsou soustředěny do knihovny Discrete. Jde jak o bloky ekvivalentní spojitým blokům z knihovny Continuous – např. bloky Unit Delay, Discrete Transfer Function, Discrete State Space – tak o bloky specifické pro diskrétní systémy –např. Zero Order Hold, First Order Hold, Memory.
KŘP/IMSW Modelování ve výpočtových software
12‐7 (18) 3.12.11
František Dušek KŘP FEI Univerzita Pardubice
Použití základních bloků Unit Delay a Zero Order Hold pro tvorbu dis‐ krétní části modelu ukážeme na příkladu realizace chování systému popsaného diferenční rovnicí ve tvaru
y (k ) + a1 y (k − 1) + a2 y (k − 2) = b1u (k − 1) + b2u (k − 2) kde symbol k je zkrácené vyjádření diskrétního času Sample time: T tk=t0+kT a T je ekvidistantní interval vzorkování. Rea‐ 1 y(k)=b 1u(k-1)+b 2u(k-2)u(t) lizace provedeme ve formě maskovaného systému, Zero-Order -a1y(k-1)-a2y(k-2) Hold kde vstupem je spojitý průběh vstupního signálu 1 u(t). Výstupem je spojitý signál y(k), který se mění b1 z Gain Unit Delay pouze v časech odpovídajících násobkům intervalu vzorkování T a mezi nimi má konstantní hodnotu. 1 b2 z Interval vzorkování T a koeficienty diferenční rovnice Gain1 Unit Delay1 druhého řádu (a1, a2, b1, b2) jsou parametry masko‐ vaného systému. Zapojení modelu je uvedeno na 1 a2 z Obrázku 12‐9. Spojitý signál u(t) je blokem ZeroGain2 Unit Delay2 Order Hold s parametrem (interval vzorkování) T 1 a1 vyvzorkován tj. v časech vzorkování se sejme aktuál‐ z Gain3 Unit Delay3 ní hodnota spojitého signálu a ta zůstane konstantní do času dalšího intervalu, kdy se opět může změnit. Obrázek 12‐9 Realizace diferenční rovnice Tento signál je bloky Unit Delay zpožděn o jeden krok změny. Parametr Sample time je u všech bloků Unit Delay nastaven na implicitní hodnotu ‐1. To znamená, že doba změny se určí z vlastností vstupního signálu. Podobně je zpracován také výstupní signál y(k) kde sice do‐ chází ke vzniku cyklu (zpětná vazba) ale nejde o algebraickou smyčku (viz ná‐ sledující kapitola), protože vzniklý cyklus obsahuje aspoň blok Unit Delay, který nemá přímý průchod signálu. u(k)
u(k-1)
y (k)
1 y(k)
y (k-1)
y (k-1)
Použití tohoto subsystému včetně průběhů signálů ukážeme na modelu obsahujícím spojitou část (dife‐ renciální rovnice) a tři subsystémy (dife‐ Step -5s+1 renční rovnice) vzorkované s různým interva‐ 24s2 +10s+1 lem vzorkování. Číselné hodnoty parametrů uvede‐ Transfer Fcn né na Obrázku 12‐10 jsou zvoleny tak, aby diskrétní FiM
u(t)
u(t)
Cont
y(t)
y (t)
u(t)
y (k)
D1
y(k)
Scope
System 1 u(t)
y (k)
H
D2
y5(k)
y 5(k)
System 2 u(t)
y (k)
D3 y 10(k)
y10(k)
System 3
System 24y''(t)+10y'(t)+y(t)= = -5u'(t)+u(t) System 1 T = 1 s y(k) - 1.625y(k-1) + .6592y(k-2) = = - 0.151u(k-1) + .1850u(k-2) System 2 T = 5 s y(k) -.7211y(k-1) + .1245y(k-2) = = -.1010u(k-1) + .5044u(k-2) System 3 T = 10 s y(k) -.2710y(k-1) + .0155y(k-2) = = .3306u(k-1) + .4140u(k-2)
Obrázek 12‐10 Model s různým vzorkováním
KŘP/IMSW Modelování ve výpočtových software
12‐8 (18) 3.12.11
František Dušek KŘP FEI Univerzita Pardubice
subsystémy dávaly v intervalech vzorkování stejné hodnoty jako spojitá dife‐ renciální rovnice v případě vstupního signálu ve tvaru skoku. Zároveň je využita možnost SIMULINKu označit odlišně vzorkované části jak barevně tak popisem – položka hlavního menu Format->Sample Time Displey->All. Okno s legendou k popisu a barvám signálů je uvedeno na Obrázku 12‐10 též. Na Obrázku 12‐11 je ukázka průběhu vstupních a výstupních signálů celého modelu.
1
0.8
0.6 0.4
0.2 u(t) y(t) y(k) T=1 y(k) T=5 y(k) T=10
0
-0.2
0
10
20
30
40
50
60
Obrázek 12‐11 Průběh spojitých a diskrétních signálů
12.3 Algebraická smyčka Algebraická smyčka vznikne v situaci, kdy pro vyhodno‐ cení bloku (či posloupnosti bloků) je potřeba výsledek vyhodnocení. Odpovídá to zápisu algebraické rovnice ve tvaru x = f(x). Příkladem algebraické smyčky může např. řešení kvadratické rovnice x2 + 4x + 3 = 0 ve tvaru x = ‐ Obrázek 12‐12 Algebraická smyčka ¼(x2+3) (model SIMULINKu na Obráz‐ Warning: Block diagram 'untitled' contains 1 algebraic loop(s). To see more details ku 12‐12). Po startu řešení se v okně about the loops use the command line Simulink debugger by typik "sldebug untitled" MATLABu zobrazí informace o exis‐ in the MATLAB command window. To eliminate this message, set the Algebraic tenci algebraické smyčky (viz text loop option in the Diagnostics page of the Simulation Parameters Dialog to "None" v textovém rámečku) a provede se Found algebraic loop containing: iterační řešení, které by 7 se opako‐ 'untitled/Gain' valo v každém časovém kroku řešení 'untitled/Math Function' modelu. Kromě zvýšené výpočetní 'untitled/Sum' (algebraic variable) náročnosti je zde zejména obecný
7
V uvedeném příkladě nejsou hodnoty signálů časově závislé, tudíž řešení je v jednom časovém kroku a není nutné iterační výpočet opakovat (navíc se v algebraické smyčce žádné parametry nemění).
KŘP/IMSW Modelování ve výpočtových software
12‐9 (18) 3.12.11
František Dušek KŘP FEI Univerzita Pardubice
problém řešení nelineárních algebraických rovnic. Pokud řešení vůbec existuje, pak jich může být více. A které se vlastně najde? Numerické řešení vždy začíná z nějakého prvotního odhadu. SIMULINK začíná zřejmě z nulové hodnoty a proto v našem případě najde řešení nejbližší 0 tj. x = ‐1. Ale i řešení x = ‐3 je správné. Pokud potřebujeme jiné řešení, musíme donutit výpočet začít z jiné hodnoty. To je možné docílit buď použitím bloku IC (s parametrem počáteční hodnota výpočtu) z knihovny Signal Attributes nebo použitím bloku Algebraic Constraint z knihovny Math Operations, který ale vyžaduje jiný zápis úlohy. Blok Algebraic Constraint při řešení generuje na svém výstu‐ pu takovou hodnotu, aby dosáhl nulové hodnoty na svém vstupu, tj. úloha musí být formulována ve tvaru f(x) = 0. Parametr bloku opět představu‐ je hodnotu, ze které hledání řešení začíná. Oba způsoby jsou ukázány na Obrázku 12‐13.
Jak se ale pozná algebraická smyčka, když na‐ prosto stejným způsobem zapisujeme diferenci‐ ální rovnici, kde o algebraické smyčce nehovoří‐ me? V případě diferenciální či diferenční rovnice Obrázek 12‐13 Algebraická smyčka s počá‐ teční hodnotou smyčka mezi výstupem a vstupem téhož bloku obsahuje aspoň jeden blok, který nemá přímý průchod (Direct Feedthrough) signálu tj. výstup závisí na stavu 8 bloku, nikoliv přímo na aktuální hodnotě vstupu. Bloků, jejichž výstup závisí na stavu, je poměrně málo. Jsou to některé bloky z knihovny Continuous (např. Integrator, Transfer Fcn, StateSpace, Transport Delay) a z knihovny Discrete (např. Unit Delay, Discrete Transfer Fcn, Discrete State-Space). Zda blok umožňuje či neumožňuje přímý průchod signálu, se dozvíme v nápovědě k bloku v tabulce Characteristic na konci shrnu‐ jící základní vlastnosti bloku – viz např. shrnutí vlastností bloku Transport Delay v následující tabulce. Direct Feedthrough
No
Sample Time
Continuous
Scalar Expansion
Yes, of input and all parameters except Initial buffer size
Dimensionalized
Yes
Zero‐Crossing Detection No
Uveďme příklad obsahující algebraickou smyčku v řešení diferenciální rovnice, kde volba startovací hodnoty iteračního výpočtu algebraické smyčky ovlivní výsledné řešení celé úlohy. Mějme úlohu popsanou soustavou rovnic
8
Stav je vnitřní proměnná bloku, jejíž hodnota je po ukončení zpracování bloku zachována. Výstup bloku se počítá na základě původní hodnoty stavu při zahájení zpracování bloku a vstupy bloku ovlivní hodnotu stavu, která zůstane zachována po ukončení zpracování bloku.
KŘP/IMSW Modelování ve výpočtových software
12‐10 (18) 3.12.11
František Dušek KŘP FEI Univerzita Pardubice
u + 3xu − 4 = 0 y′ + y = u 2
y (0) = 0 x(0) = 0 x′(0) = 0
x′′ + x′ + x = y
a chceme získat časové průběhy veličin x a u pro 0 ≤ t ≤ 20. Pro zápis diferenci‐ álních rovnic můžeme využít přepis na soustavu rovnic prvního řádu tj.
u 2 + 3xu − 4 = 0
y′ = u − y
y = ∫ (u − y )dt
y (0) = 0
x′ = r
x = ∫ rdt
x(0) = 0
r′ = y − r − x
r = ∫ ( y − r − x )dt r (0) = 0
Odpovídající model používající blok Algebraic Constraint je na Obrázku 12‐ 2 14. Pro počáteční hodnotu x = 0 jsou možné dvě řešení rovnice u + 0u – 4 = 0 tj. dvě možné počáteční hodnoty u = ±2. Zadáme‐li počáteční hodnotu výpočtu (Initial guess) bloku Algebraic Constraint kladnou dostaneme jedno řešení, zadáme‐li hodnotu zápornou, dostaneme druhé řešení. Obě řešení jsou ukázány na Obrázku 12‐15. Constant
x
y(0)=0 Initial guess: + => u(0)=+2
4
1 s
Initial guess: - => u(0)=-2 Solve f (z) f(z) = 0
3 Product
Gain
z
y
x'(0)=0 r'
Integrator3
1 s
x(0)=0 1 s
r
Integrator1
r
x
Integrator2
x
u
Algebraic Constraint1 Math Function1 u
u2
Add
u
Scope
Obrázek 12‐14 Diferenciální rovnice s algebraickou smyčkou Initial guess: +5 2 u x
1.5 1 0.5 0
0
2
4
6
8
10
12
14
16
18
20
Initial guess: -5 0 u x
-0.5 -1 -1.5 -2
0
2
4
6
8
10
12
14
16
18
20
Obrázek 12‐15 Dvě řešení diferenciální rovnice s algebraickou smyčkou
KŘP/IMSW Modelování ve výpočtových software
12‐11 (18) 3.12.11
František Dušek KŘP FEI Univerzita Pardubice
12.4 Příklady na procvičení V kapitole 12.4.1 jsou zadání a v kapitole 12.4.2 řešení příkladů zahrnujících možnosti SIMULINKu zmiňované v této a předchozích kapitolách. Předpokládá se, že při řešení příkladů má čtenář k dispozici MATLAB a SIMULINK a aktivně využívá nápovědu k programu.
12.4.1 Zadání příkladů Př01. Nalezněte časový průběh výstupních signálů všech subsytémů složeného systému po dobu prvních 10 s. Systém je tvořen pěti stejnými subsystémy v zapojení podle schématu. Každý subsystém je popsán stejnou rovnicí se stejnými parametry (a=1, b=2, y0=0, y1=‐1). Signál uB je tvořen pilovým signá‐ lem v rozsahu ±1 a periodou 10 s hodnotou uB(t=0)=0. Pro předání hodnoty signálu uB do jednotlivých subsystémů využijte bloky Goto a From.
3
uA
uB
y
uA
uB
y
uA
uB
y
uA
uB
y
uA
uB
y
y′′ + ay′ + by =
uB 0.2 + u A2
y (t = 0) = y0
y′(t = 0) = y1
Návod: Vytvořte subsystém popisující jednu rovnici (včetně bloku From), zkopí‐ rujte 5x, pospojujte a vytvořte složený výstupní signál. Vytvořte maskovaný subsystém s hodnotami parametrů a, b, y0, y1 zadávanými v masce. Doplňte zdrojem pilového signálu (blok Repeating Sequence) a zobrazením vý‐ sledku. Signál vstupující do bloku Scope uložte do proměnné v pracovním prostoru MATLABu a vytvořte skript pro vykreslení grafu pomocí příkazu plot. Př02. Nalezněte časový průběh (0 ≤ t ≤ 30) řešení – funkce y(t) i x(k) – soustavy diferenciálně‐diferenčních rovnic pro hodnoty α=0.25, α=0.75 a interval vzorkování diferenční rovnice T=0.5 a T=1.5 s. Výsledky vykreslete pomocí skriptu MATLABu (všechna čtyři řešení do jednoho okna obsahujícího 4 gra‐ fy).
y′′ + αx(k − 1) y′ + y = x(k ) + 1 y (t = 0) = 2α x(k ) = (1 − α )x(k − 1) + αy x(−1) = −2
y′(t = 0) = −α
Návod: Vytvořte maskovaný subsystém s hodnotami parametrů α, T zadáva‐ nými v masce a 4x zkopírujte. Samostatně uložte do pracovního prostoru MATLABu diskrétní signály a spojité signály. Vytvořte skript pro vykreslení grafu příkazem plot pro spojité a příkazem stairs pro diskrétní signály. Pro umístění do jednoho okna využijte příkaz subplot.
KŘP/IMSW Modelování ve výpočtových software
12‐12 (18) 3.12.11
František Dušek KŘP FEI Univerzita Pardubice
Př03. Nalezněte časový průběh signálů x, y a u po dobu prvních 10 s, je‐li dána soustava rovnic
x′′ + x′ + x = +u y′′ + y′ + y = −u
x′(0) = 0.2 y′(0) = −0.2
x(0) = 0.5 y (0) = −0.5
x 2 − x′y′ + y 2 + u = 0 Návod: Použijte blok Algebraic Constraint s počáteční hodnotou 0.
KŘP/IMSW Modelování ve výpočtových software
12‐13 (18) 3.12.11
František Dušek KŘP FEI Univerzita Pardubice
12.4.2 Řešení příkladů Z důvodu menší velikosti souboru a lepšího tisku nebudou grafické průběhy zobrazovány v textu jako hardcopy grafu bloku Scope, ale průběhy budou vy‐ kreslovány v MATLABu pomocí příkazu plot. Př01. Nalezněte časový průběh výstupních signálů všech subsytémů složeného systému po dobu prvních 40 s. Pro snazší zápis převedeme integrací původní rovnice popisující jeden subsys‐ tém na soustavu dvou integrálních rovnic (je potřeba dopočítat počáteční hodnotu substituce r)
⎛ uB ⎞ ⎛ uB ⎞ − by ⎟⎟dt − ay r = ∫ ⎜⎜ y′ = ∫ ⎜⎜ − by ⎟⎟dt 2 2 ⎝ 0. 2 + u A ⎠ ⎝ 0. 2 + u A ⎠ y = ∫ (r − ay )dt
r (0) = y1 + ay0
y ( 0) = y 0
Potom je řešení možné zapsat jako model obsahující zdroj signálu uB a jeho zavedení do bloku Goto (s nastavením viditelnosti global), jedním maskova‐ ným subsystémem obsahujícím pět dalších subsystémů, kde vstup signálu uB je řešen blokem From a blokem Scope pro zobrazení průběhu, který je zároveň využit pro uložení zobrazovaných průběhů do proměnné v pracovním prostoru MATLABu. Zapojení a nastavení parametrů bloků From a Goto následuje
b uB From uA
y1+a*y0
y0
Math Function
1 s
1 s
2
Integrator1
Integrator
1
u
1
y
y
a
0.2
Product Gain
Constant
1 y 3
uA
y
Gain Subsystem 1
uA
y
uA
Subsystem 2
y
Subsystem 3
uA
y
Subsystem 4
uA
y
Subsystem 5
uB
u
Goto
Repeating Sequence
Time values: [0 2.5 7.5 10] Output values: [0 -1 1 0] a=1 b=2 y0=0 y1=1
y
Scope
Subsystem
KŘP/IMSW Modelování ve výpočtových software
12‐14 (18) 3.12.11
František Dušek KŘP FEI Univerzita Pardubice
Výsledný průběh signálů včetně nastavení parametru bloku Scope a skriptu MATLABu pro vykreslení grafu je uveden dále 2
uB
y1
y2
y3
y4
y5
1.5 1 0.5 0 -0.5 -1 -1.5 -2
0
5
10
15
20
25
30
35
40
t =ScopeData.time; u =ScopeData.signals.values(:,1); y1=ScopeData.signals.values(:,2); y2=ScopeData.signals.values(:,3); y3=ScopeData.signals.values(:,4); y4=ScopeData.signals.values(:,5); y5=ScopeData.signals.values(:,6); h=plot(t,u,'k--',t,y1,t,y2,t,y3,t,y4,t,y5); axis([0,40,-2.0,2.2]) set(h,'LineWidth',3) grid h=legend('u_B','y1','y2','y3','y4','y5'); set(h,'Location','NorthEast') set(h,'Orientation','horizontal')
Př02. Nalezněte časový průběh (0 ≤ t ≤ 30) řešení soustavy diferenciálně‐ diferenčních rovnic pro hodnoty α=0.25, α=0.75 a interval vzorkování dife‐ renční rovnice T=0.1 a T=1.5 s.
y′′ + αx(k − 1) y′ + y = x(k ) + 1 y (t = 0) = 2α x(k ) = (1 − α )x(k − 1) + αy x(−1) = −2
y′(t = 0) = −α
Pro snazší zápis převedeme diferenciální rovnici na soustavu dvou rovnic
v(0) = y′(0) = −α y (0) = 2α
y′ = v v′ = x(k ) + 1 − αx(k − 1)v − y
a výsledné zapojení subsystému 1 a celkového modelu je Sample time: T
α =0.25
1 y(t)
D1
Gain1
α =0.75
In.cond.: -alfa Cont
2
1
FiM
x(k)
1
x(k)
z
Cont v (t)
x(k-1)
1 s
T=0.5 y (t)
Cont
x(k)
y (t)
Cont
alfa Gain
D1
Cont
α =0.25
T=1.5
y (t)
Save format: Structure With Time Sample time: -1
Cont D1
v (t) Cont
α =0.75 T=1.5
x(k-1)
Product
y (t)
1-alfa Gain2
KŘP/IMSW Modelování ve výpočtových software
x(k)
x(k)
DataS To Workspace
D1
Subsystem2
Integrator
x(k)
Cont Subsystem1
Add
D1
Unit Delay
D1
1 s
In.cond.: 2*alfa
Integrator1
In.cond.: 1 D1
Cont
alfa
Cont
Zero-Order Hold
T=0.5
y (t)
D2
DataD1 To Workspace2
Cont Subsystem3 D2 D2
Subsystem4
12‐15 (18) 3.12.11
DataD2 To Workspace1
František Dušek KŘP FEI Univerzita Pardubice
Skript pro vykreslení grafů z hodnot uložených v proměnných DataS, DataD1 a DataD2 může být např. ve tvaru ts=DataS.time; t1=DataD1.time; t2=DataD2.time;
ys=DataS.signals.values; x1=DataD1.signals.values(:,1); x2=DataD1.signals.values(:,2); x3=DataD2.signals.values(:,1); x4=DataD2.signals.values(:,2);
subplot(2,2,1), plot(ts,ys(:,1),'r','LineWidth',2) hold on, stairs(t1,x1,'b','LineWidth',2), grid title('\alpha=0.25 T=0.5','FontSize',14) subplot(2,2,2), plot(ts,ys(:,2),'r','LineWidth',2) hold on, stairs(t1,x2,'b','LineWidth',2), grid title('\alpha=0.75 T=0.5','FontSize',14) subplot(2,2,3), plot(ts,ys(:,3),'r','LineWidth',2) hold on, stairs(t2,x3,'b','LineWidth',2), grid title('\alpha=0.25 T=1.5','FontSize',14) subplot(2,2,4), plot(ts,ys(:,4),'r','LineWidth',2) hold on, stairs(t2,x4,'b','LineWidth',2), grid title('\alpha=0.75 T=1.5','FontSize',14)
α=0.25 T=0.5
α=0.75 T=0.5
10
9 8
8 7 6
6 5
4 4 2
3 2
0 1 -2
0
5
10
15
20
25
30
0
0
5
10
α=0.25 T=1.5
15
20
25
30
20
25
30
α=0.75 T=1.5
5
20
4 15 3 2
10
1 5
0 -1
0 -2 -3
0
5
10
15
20
25
30
-5
0
5
10
15
KŘP/IMSW Modelování ve výpočtových software
12‐16 (18) 3.12.11
František Dušek KŘP FEI Univerzita Pardubice
Př03. Nalezněte časový průběh signálů x, y a u po dobu prvních 10 s, je‐li dána soustava rovnic. Pro zápis diferenciálních rovnic můžeme využít přepis na soustavu rovnic prvního řádu tj.
x′ = r x(0) = 0.5 r ′ = u − x − v r (0) = 0.2
y′ = s s′ = −u − y − s
y (0) = −0.5 s(0) = −0.2
x 2 − rs + y 2 + u = 0
Potom odpovídající model v SIMULINKu je např. u2
x
Math Function1
x'(0)=0.2 1 s
u r'
x(0)=0.5 1 s
r
x
x^2
Integrator1
r
r
Integrator2
x
s f (z)
y ^2
Solve f(z) = 0
z
u u y
Algebraic Constraint1
u
Scope
s
Add
y'(0)=-0.2
y(0)=-0.5
1 s
1 s
u
Math Function2 u
s' y
2
s
Integrator
y
Integrator3
a časové průběhy sledovaných signálů jsou 0.6 u x y
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
0
1
2
3
4
5
6
7
8
9
10
KŘP/IMSW Modelování ve výpočtových software
12‐17 (18) 3.12.11
František Dušek KŘP FEI Univerzita Pardubice
Pojmy k zapamatování Okruhy problémů: výměna dat mezi SIMULINKem a MATLABem, čtení a zápis průběhu signálů do souboru, diskrétní systémy v SIMULINKu, algeb‐ raická smyčka a její řešení Použité nástroje:
Library Browser, Mask Editor
Bloky: Chirp Signal, Data Store Memory, Data Store Read, Data Store Write, From Workspace, Gain, Goto, In, Mux, Out, Scope, Sum, To Workspace, Unit Delay, Zero-Order Hold
Otázky na procvičení 1. 2. 3. 4. 5. 6. 7. 8. 9.
Použijeme‐li symbolickou konstantu jako parametr bloku kde musí být definována? Jaké informace musí obsahovat signál, který má být načítán během řešení modelu SIMULINKu? Který další blok kromě To Workspace umožňuje zapsat (uložit) průběh signálu do pracovního prostoru MATLABu? Jaké je hlavní omezení – z pohledu využití datových souborů jinými pro‐ gramy – bloků From File a To File? Co zajišťují bloky Unit Delay a Zero-Order Hold? Jaké jsou možnosti zadat interval vzorkování signálu? Jak vznikne algebraická smyčka? Jak můžeme ovlivnit řešení algebraické smyčky, jaké bloky máme pro ten‐ to účel k dispozici? Co označuje pojem Direct Feedthrough?
Odkazy a další studijní prameny • • •
•
elektronická dokumentace k programu SIMULINK – v „Reference / Simu‐ link Graphical User Interface“ část „Simulink Mask Editor“ elektronická dokumentace k programu SIMULINK – v „User's Guide / Managing Blocks“ část „Using the Embedded MATLAB Function Block“ elektronická dokumentace k programu SIMULINK – v „Blocks “ části „User‐Defined Functions / Embedded MATLAB Function“ a „User‐ Defined Functions / Fcn“ elektronická dokumentace – www.mathworks.com/help/
KŘP/IMSW Modelování ve výpočtových software
12‐18 (18) 3.12.11
František Dušek KŘP FEI Univerzita Pardubice
13 Další možnosti MATLABu a SIMULINKu Studijní cíl Poslední blok je věnován některým dalším možnostem využití MATLABu a SI‐ MULINKu. V první části si ukážeme možnost volat SIMULINKový model z MATLABu. Druhá část je věnována problematice symbolických výpočtů a vý‐ počtů s požadovanou přesností v MATLABu. Tyto funkce a příkazy nejsou sou‐ částí základní instalace MATLABu, ale jsou obsaženy v rozšiřujícím toolboxu s názvem Symbolic Toolbox. Budeme se stručně zabývat některými příkazy pro řešení úloh z některých oblastí matematiky – lineární algebry, algebraických rovnic, derivací a integrálů funkcí, integrálních transformací a diferenciálních rovnic.
Doba nutná k nastudování
1 hodina
Průvodce studiem Předpokládá se, že čtenář je seznámen s prostředím a možnostmi MATLABu i SIMULINKu popsanými v předchozích kapitolách. Pro řešení příkladů jsou též potřeba základní znalosti matematiky a z oblasti diferenciálních rovnic. Při stu‐ diu je vhodné mít spuštěný MATLAB a SIMULINK a jednotlivé příkazy či funkce hned vyzkoušet a případně získat podrobnější informace využíváním nápovědy k programu. Použití funkcí z Symbolic Math Tbx vyžaduje mít tento Tbx nain‐ stalovaný (není součástí standardní instalace MATLABu). V tomto bloku nejsou uvedeny příklady na procvičení. V textu jsou použity následující typografické konvence: Calibri 11, Bold, Italic Calibri 11 Courier Courier Courier Courier
New New New New
Courier New
nové pojmy k zapamatování označení klávesy 10, Bold názvy nástrojů MATLABu 10 názvy bloků použitých v programu 10 označení části příkazu, která se může vynechat 10, Italic názvy proměnných použitých v programu názvy parametrů bloků či dialogových oken 10, Bold upřesnění nápovědy (help téma)
13.1 Volání modelu SIMULINKu z MATLABu Spolupráce mezi SIMULINKem a MATLABEM nespočívá jen v používání příkazů MATLABu v modelu SIMULINKu a předávání parametrů a průběhů vstupních a výstupních signálů jak bylo popsáno dříve, ale je možné volat SIMULINKový model z příkazové řádky MATLABu. Je možné (bez nutnosti specifikovat v modelu) zadat nejen průběhy vstupních signálů a určit proměnné, do kterých KŘP/IMSW Modelování ve výpočtových software
13‐1 (17) 17.12.11
František Dušek KŘP FEI Univerzita Pardubice
se mají uložit průběhy výstupních signálů, ale je možné zadat počáteční hodno‐ ty a získat hodnoty koncových stavů příslušných bloků (především bloku Integrator). Je také možné nastavit všechny parametry řešení a spuštění modelu včetně doby řešení. Volání SIMULINKového modelu dovoluje příkaz MATLABu sim.
Existují dvě varianty používání této funkce. Starší varianta 1 má syntaxi [T,X,Y] = sim('model',Timespan, Options, UT)
kde
T X Y model Timespan options UT
vektor časů výpočtu výstupních hodnot matice či struktura stavů matice či struktura výstupů název souboru obsahující model (přípona .mdl) rozsah časů simulace struktura s parametry simulace případný vstupní signál (musí obsahovat i informaci o čase)
Od verze SIMULINKu 7.3 je změněna syntaxe volání příkazu plně využívající možností objektového přístupu. Blíže viz help sim. Tento způsob dovoluje paralelní spuštění výpočtu více modelů. Nový základní tvar je SimOut = sim('model', Parameters)
kde
SimOut model Parameters
objekt obsahující výstupní informace název souboru obsahující model (přípona .mdl) a) seznam dvojic Název parametru a Hodnota b) struktura obsahující nastavení parametrů c) konfigurační sada
Využití volání SIMULINKového modelu ukažme na příkladu. Mějme v souboru zaznamenaný časový průběh vstupního a výstupního signálu (s aditivním šu‐ mem) nějakého dynamického systému. V souboru jsou na každém řádku tři hodnoty čas tk, hodnota vstupu u(tk) a výstupu y(tk). Víme, že chování systému je popsáno známým matematickým modelem
y′′′ + a2 y′′ + a1 y′ + a0 y = b2u′′ + b1u′ + b0u y′′(0) = y2 y′(0) = y1 y (0) = y0 u′(0)= u1 u (0) = u0 Máme v jednom grafu porovnat průběh zaznamenaného (vektor ym) a z modelu vypočítaného průběhu y na základě známého průběhu vstupů (vektor u). Pro výpočet výstupu systému y využijeme volání SIMULINKového modelu. SIMULINKový model Využijeme model SIMULINKu (viz Obrázek 13‐1), který představuje zápis zadané diferenciální rovnice se symbolickými názvy parametrů (včetně počátečních podmínek). Model musí obsahovat označení vstupních a výstupních signálů. Protože model obsahuje derivace vstupního signálu je vhodné pro zápis do
1
Která je podporována z důvodů zpětné kompatibility
KŘP/IMSW Modelování ve výpočtových software
13‐2 (17) 17.12.11
František Dušek KŘP FEI Univerzita Pardubice
SIMULINKového modelu provést postupné integrace včetně přepočtu počáteč‐ ních podmínek příslušných dílčích integrátorů
y′′′ = b2u′′ − a2 y′′ + b1u′ − a1 y′ + b0u − a0 y t
y′′ = b2u′ − a2 y′ + b1u − a1 y + ∫ (b0u − a0 y )dt = b2u′ − a2 y′ + b1u − a1 y + r (t )
0
y2 = b2u1 − a2 y1 + b1u0 − a1 y0 + r (0) ⇒ r (0) = y2 + a2 y1 + a1 y0 − b2u1 − b1u0 t
y′ = b2u − a2 y + ∫ (b1u − a1 y + r )dt = b2u − a2 y + s (t ) 0
y1 = b2u0 − a2 y0 + s (t ) ⇒ s (0) = y1 + a2 y0 − b2u0 t
y = ∫ (b2u − a2 y + s (t ) )dt = 0
t t ⎛ ⎛ ⎞⎞ ⎜ ⎜ = ∫ b2u − a2 y + ∫ ⎜ b1u − a1 y + ∫ (b0u − a0 y )dt ⎟⎟ ⎟dt ⎜ ⎟ 0⎝ 0⎝ 0 ⎠⎠ t
1 u(t) b0
b1
Init. cond,: y +a y +a y -b u -b u 2
2 1
1 0
1 s
2 1
b2
Init. cond,: y +a y -b u
1 0
1
r(t)
Integrator2 a0
2 0
2 0
1 s
s(t)
Init. cond,: y 0
1 s
Integrator1 a1
y (t)
1 y(t)
Integrator a2
Obrázek 13‐1 Model pro volání z MATLABu
Starší varianta volání funkce sim Pro volání modelu mimo prostředí SIMULINKu je možné změnit některé infor‐ mace standardně zadávané při tvorbě modelu v položce hlavního menu Simulation->Configuration Parameters …. Pro tyto účely je určena speciál‐ ní struktura. Proměnnou s touto strukturou naplněnou původními hodnotami modelu zadanému jako parametr vrací funkce simget se syntaxí Options=simget(´model´)
Názvy položek struktury lze zjistit po jejím vytvoření pomocí funkce simget. Položky pak lze měnit pomocí funkce simset nebo přímým zápisem do polož‐ ky. V následujícím skriptu je ukázáno řešení zadaného příkladu využívající starší syntaxi. Je využito převzetí symbolických parametrů bloků a vstupního signálu z pracovního prostoru MATLABu. Výstupní signály jsou uvedeny jako výstupní parametry funkce sim. Doba simulace je jeden ze vstupních parametrů funkce. Kromě parametrů modelu je potřeba zadat i počáteční podmínky, které se
KŘP/IMSW Modelování ve výpočtových software
13‐3 (17) 17.12.11
František Dušek KŘP FEI Univerzita Pardubice
odhadnou z dat. Výsledný graf (společný pro oba způsoby volání funkce sim) je na Obrázku 13‐2.
% skript pro příklad volání SIMULINKového modelu z MATLABu % starší varianta volání funkce sim %% vytvoření parametrů mdl='Prikl_13_1'; % název souboru s modelem (.mdl) conf=simget(mdl); % vstupní i výstupní proměnné jsou v workspace MATLABu conf=simset(conf,'SrcWorkspace','base'); conf.DstWorkspace='base'); % přímý zápis do položky conf.MaxStep=0.1; %% příprava vstupních parametrů load data.txt % načtení souboru s daty cas=data(:,1); % sloupcový vektor časů u=data(:,2); % sloupcový vektor hodnot vstupů ym=data(:,3); % sloupcový vektor hodnot zad. výstupů UU=[cas,u]; % parametry modelu a0=1.4755; a1=4.5596; a2=0.7333; b0=1.4755; b1=0.0000; b2=-5.9020; % odhady poč. podmínek z dat y0=ym(1); % odhad y(0) y1=(ym(2)-ym(1))/(cas(2)-cas(1)); % odhad první derivace y´(0) y2=0; % odhad y´´(0) u0=u(1); % odhad u(0) u1=(u(2)-u(1))/(cas(2)-cas(1)); % odhad u´(0) % starší způsob volání SIMULINKového modelu s nastavenými parametry [t,X,y] = sim(mdl,[0,60], conf, UU); % zpracování výstupních dat plot(cas,ym,t,y,'LineWidth',2)
Nová varianta volání funkce sim I v nové variantě volání funkce sim je potřeba připravit doplňující informace. Aby bylo možné model spouštět mimo prostředí SIMULINKu a s jinými parame‐ try než byly použity při jeho tvorbě, je nutné opět vytvořit konfigurační sadu s hodnotami konfiguračních parametrů. Zatímco ve staré variantě byly para‐ metry uloženy ve struktuře neobsahující všechny parametry konfigurace mode‐ lu, v nové variantě jde o objekt osahující parametry všechny. Parametry konfi‐ gurace modelu lze nastavit příkazy MATLABu podobně, jako se nastavují v položce hlavního menu Simulation->Configuration Parameters … okna modelu. Konkrétní názvy parametrů, které je potřeba použít v příkazu pro nastavení parametrů modelu se syntaxí
set_param(model,‘Nazev Parametru‘,‘Hodnota‘)
se zjistí např. kliknutím pravým tlačítkem myši nad příslušnou položkou dialo‐ gového okna Configuration Parameters … a potvrzením dotazu What‘s This?. Je potřeba nastavit aby se jako vstupní signál použily připravené pro‐ měnné v pracovním prostoru a aby se výsledek uložil do zadané výstupní pro‐ měnné (typu objekt) v požadovaných časech. Tyto a další příkazy pro vytvoření požadované konfigurace pro spuštění modelu jsou okomentované uvedeny ve výpisu skriptu pro řešení příkladu. Část zabývající se přípravou vstupních dat je stejná jako v předchozím případě.
KŘP/IMSW Modelování ve výpočtových software
13‐4 (17) 17.12.11
František Dušek KŘP FEI Univerzita Pardubice
% skript pro příklad volání SIMULINKového modelu z MATLABu % nová varianta volání funkce sim %% vytvoření konfigurační sady mdl='Prikl_13_1'; % název souboru s modelem (.mdl) load_system(mdl) % načti model do paměti % uložení aktuální načtené konfigurace pro následující změny conf=getActiveConfigSet(mdl); %% nastavení nové konfigurační sady "conf" % povolení čtení vstupního signálu (z workspace) set_param(conf,'LoadExternalInput','on') % určení proměnné pro vstup (včetně času) set_param(conf,'ExternalInput','[cas,u]') % povolení zápisu výstupu (do workspace) set_param(conf,'SaveOutput','on') % určení proměnné pro uložení výstupu set_param(conf,'OutputSaveName','VYP') % určení formátu uložení výstupu set_param(conf,'SaveFormat','StructureWithTime') % uložení výstupu pouze v požadovaných časech set_param(conf,'OutputOption','SpecifiedOutputTimes') % určení požadovaných časů set_param(conf,'OutputTimes','cas') % nastavení koncového času výpočtu set_param(conf,'StopTime','cas(end)') % nastavení max. kroku výpočtu set_param(conf,'MaxStep','0.1') % nastavení Single-Output Modu set_param(conf,'ReturnWorkspaceOutputs','on') %% příprava vstupních parametrů load data.txt % načtení souboru s daty cas=data(:,1); % sloupcový vektor časů u=data(:,2); % sloupcový vektor hodnot vstupů ym=data(:,3); % sloupcový vektor hodnot měř. výstupů % parametry modelu a0=1.4755; a1=4.5596; a2=0.7333; b0=1.4755; b1=0.0000; b2=-5.9020; % odhady poč. podmínek z dat y0=ym(1); % odhad y(0) y1=(ym(2)-ym(1))/(cas(2)-cas(1)); % odhad první derivace y´(0) y2=0; % odhad y´´(0) u0=u(1); % odhad u(0) u1=(u(2)-u(1))/(cas(2)-cas(1)); % odhad u´(0) %% volání SIMULINKového modelu s nastavenými parametry Out=sim(mdl,conf); % zpracování výstupního objektu vyp=get(Out,'VYP'); % vyjmi výsledky v zadané vlastnosti y=vyp.signals.values(:,1); % výsledky ve standardní struktuře t=vyp.time; % čas výsledků (shodný s cas) plot(cas,ym,t,y,'LineWidth',2)
Výsledný graf (stejný pro obě varianty) je na Obrázku 13‐2. Je vidět, že největší neshoda je na začátku průběhů daná zejména nepřesnými hodnotami počá‐ tečních podmínek výpočtu diferenciální rovnice získanými odhadem z vstup‐ ních dat.
KŘP/IMSW Modelování ve výpočtových software
13‐5 (17) 17.12.11
František Dušek KŘP FEI Univerzita Pardubice
15
10
5
0
-5
-10
-15
0
10
20
30
40
50
60
Obrázek 13‐2 Volání modelu SIMULINKu z MATLABu
13.2 Použití Symbolic Math Toolbox Symbolické výpočty nejsou zahrnuty do základního MATLABu a jsou podporo‐ vány pomocí Symbolic Math Toolbox obsahujícího samostatné výpočetní jádro. Původně (do verze v4.9 tj. R2007b) Symbolic Math Tbx obsahoval výpočetní jádro MAPLE fy Waterloo Maple, Inc., nyní (od verze 5.0 R2008a) využívá výpo‐ četní jádro MuPAD (Multiprocessing Algrebraic Data Tool) fy SciFace Software GmbH & Co. Kromě možnosti používat volání funkcí podle konvencí MATLABu MuPAD obsahuje i vlastní jazyk včetně editoru (MuPAD Notebook Interface) a možnosti konvertovat výsledky do formátu MathML a TeX pro potřeby publi‐ help symbolic či kování. Blíže viz http://www.mathworks.com/access/helpdesk/help/pdf_doc/symbo lic/mupad_tutorial.pdf
Symbolic Math Tbx podporuje výpočty zejména v následujících oblastech: ‐ numerické výpočty s proměnnou přesností (VPA variable precision ari‐ thmetic) ‐ symbolické operace lineární algebry ‐ řešení soustav algebraických rovnic ‐ integrální transformace (Laplaceova, Fourierova, Z‐transformace atd.) ‐ řešení integrálů ‐ řešení diferenciálních rovnic ‐ zjednodušení symbolických výrazů Co znamenají výpočty s požadovanou přesností? Standardní výpočty se v MATLABu provádějí v tzv. double precision využívající pro uložení 64 bitů. Při těchto výpočtech je přesnost cca 15 platných cifer. V případě výpočtu s požadovanou přesností jde o numerické výpočty prováděné na zadaný počet
KŘP/IMSW Modelování ve výpočtových software
13‐6 (17) 17.12.11
František Dušek KŘP FEI Univerzita Pardubice
platných cifer. Vyhodnocení výrazu s požadovanou přesností je možné provést pomocí funkce vpa se syntaxí
v=vpa(S,D)
kde
S je vyhodnocovaný výraz D je nepovinný počet požadovaných cifer; je‐li vynechán, použije se na‐ stavená hodnota. Hodnota se nastavuje či zjišťuje funkcí digits. Blíže viz help vpa.
Je potřeba dát si pozor na to, aby výpočet výrazu byl prováděn s proměnnými typu sym a ne standardního typu double. V druhém případě je převeden do požadované přesnosti jen výsledek výpočtu což není přesný výsledek. Ukažme
(
)
tento problém na příkladě výpočtu hodnoty výrazu 1+ 5 2 . Nastavme vý‐ pis na maximální počet číslic a proveďme standardní výpočet MATLABu (datový typ double přesnost cca 15 číslic) >> format long >> v=(1+sqrt(5))/2 v = 1.618033988749895
standardní výpočet v double s převodem výsledku do implicitní přesnosti vý‐ počtů s proměnnou přesností (32) = nepřesný výsledek od 17‐té číslice >> v1=vpa((1+sqrt(5))/2) v1 = 1.6180339887498949025257388711907
správný výpočet s implicitní přesností 32 číslic – interpretace zápisu (řetězec) v MuPADu >> v2=vpa('(1+sqrt(5))/2') v2 = 1.6180339887498948482045868343656
jiný správný výpočet s požadovanou přesností 48 číslic – definice čísla 5 jako datového typu sym a výpočet obsahující proměnnou typu sym se provede v MuPADu >> s=sym(5); >> v3=vpa((1+sqrt(s))/2,48) v3 = 1.61803398874989484820458683436563811772030917981
Co se rozumí pod pojmem symbolický výpočet? Jednoduše řečeno při symbo‐ lickém výpočtu výsledkem výrazu (vzorce) není číslo ale jiný výraz (vzorec). Např. chceme‐li určit výsledek výrazu a^2+2*a*b+b^2 tak v případě numeric‐ kého výpočtu musíme mít proměnné a a b naplněny čísly a číslo také jako vý‐ sledek dostaneme. V případě symbolického výpočtu dostaneme jako výsledek výraz (a+b)^2. Aby bylo možné používat standardní matematické operace a názvy funkcí pro provádění symbolických výpočtů, musí být proměnné typu symbolický objekt. Vytvoření symbolických proměnných Jsou dvě možnosti definovat proměnnou jako symbolický objekt, buď jednotli‐ vě pomocí funkce sym nebo hromadně pomocí příkazu syms. Blíže viz help sym a help syms >> x=sym('x'); y= sym('y'); z=sym('z'); >> syms a b c
KŘP/IMSW Modelování ve výpočtových software
13‐7 (17) 17.12.11
František Dušek KŘP FEI Univerzita Pardubice
Zjednodušování a výpis symbolických výrazů Obvykle je snaha používat co nejjednodušší vyjádření výrazů. Pro zjednodušení je možné aplikovat několik postupů. Tbx nabízí několik funkcí pro zjednodušení (simplify, factor, combine, expand atd.) ale pokud nevíme, kterou použít, je nejjednodušší použít funkci simple, které vyzkouší všechny možnos‐ ti. Určitým nedostatkem 2 MATLABu vyplývajícím z textové formy komunikace je ne příliš přehledná textová forma zadávání i výpisu výrazů. Funkce pretty zobrazuje (byť opět textově) výraz poněkud přehledněji. Blíže viz help simple a help pretty. Použití obou funkcí ukažme na příkladě zobrazení a
(a + b )2 ⎛ zjednodušení výrazu
−1
a+b ⎞ ⎟ 2 2 ⎜ a − b ⎝ ab − b ⎠
>> v=sym('(a+b)^2/(a^2-b^2)*((a+b)/(a*b-b^2))^(-1)') v = ((a + b)*(- b^2 + a*b))/(a^2 - b^2) >> pretty(v) 2 (a + b) (- b + a b) -------------------2 2 a - b >> vysl=simple(v) simplify: b radsimp: ((a + b)*(- b^2 + a*b))/(a^2 - b^2) simplify(100): b combine(sincos): ((a + b)*(- b^2 + a*b))/(a^2 - b^2) combine(sinhcosh): ((a + b)*(- b^2 + a*b))/(a^2 - b^2) combine(ln): ((a + b)*(- b^2 + a*b))/(a^2 - b^2) factor: b expand: (a^2*b)/(a^2 - b^2) - b^3/(a^2 - b^2) combine: ((a + b)*(- b^2 + a*b))/(a^2 - b^2) rewrite(exp): ((a + b)*(- b^2 + a*b))/(a^2 - b^2) rewrite(sincos): ((a + b)*(- b^2 + a*b))/(a^2 - b^2) rewrite(sinhcosh): ((a + b)*(- b^2 + a*b))/(a^2 - b^2) rewrite(tan): ((a + b)*(- b^2 + a*b))/(a^2 - b^2) mwcos2sin: ((a + b)*(- b^2 + a*b))/(a^2 - b^2) collect(b): b vysl = b
Je možné také vyjádřit symbolický výraz ve formě syntaxe jazyka „C“ (funkce ccode) nebo převést do vyjádření pro systém LaTex (funkce latex).
13.2.1 Lineární algebra a algebraické rovnice Možnosti symbolických výpočtů v oblasti lineární algebry a řešení rovnic si uká‐ žeme na několika příkladech. V těchto případech nejsou potřeba zvláštní funk‐ ce – pouze je potřeba, aby se standardní operace či funkce jako je např. de‐ terminant (funkce det), inverze (funkce inv), vlastní čísla (funkce eig) a cha‐ rakteristický polynom (funkce poly) prováděly nad proměnnými typu sym. Je možné definovat matici symbolických proměnných a dále s ní pracovat. 2
Tato nevýhoda je výhodou v případě, že potřebujeme výraz použít pro výpočet v programu
KŘP/IMSW Modelování ve výpočtových software
13‐8 (17) 17.12.11
František Dušek KŘP FEI Univerzita Pardubice
Standardní výpočty se symbolickými proměnnými vytvoření matice a vektoru symbolických proměnných >> syms a11 a12 a21 a22 b1 b2 >> A=[a11,a12;a21,a22]; b=[b1;b2];
násobení matic >> c=A*b c = a11*b1 + a21*b1 + >> c=A*[2;5] c = 2*a11 + 2*a21 +
a12*b2 a22*b2 5*a12 5*a22
výpočet determinantu >> M=sym('[a b;x y]') M = [ a, b] [ x, y] >> D=det(M) D = a*y - b*x
výpočet inverzní matice >> I=inv(M) I = [ y/(a*y - b*x), -b/(a*y - b*x)] [ -x/(a*y - b*x), a/(a*y - b*x)]
výpočet vlastních čísel matice >> E=eig(M) E = a/2 + y/2 - (a^2 - 2*a*y + y^2 + 4*b*x)^(1/2)/2 a/2 + y/2 + (a^2 - 2*a*y + y^2 + 4*b*x)^(1/2)/2
výpočet charakteristického polynomu matice >> P=poly(M) P = t^2 + (- a - y)*t + a*y - b*x
Algebraické rovnice Důležitou oblastí je řešení algebraických rovnic. Pokud řešení existuje, lze je získat ve formě symbolického výrazu (obvykle velmi složitého) pomocí funkce solve se syntaxí r=solve(eq1,eq2,…,eqn,var1,var2,…,varn) kde eq jsou definice rovnic a var označení proměnných, blíže viz help solve. Použití ukážeme opět na několika příkladech. Úloha je‐li známa jedna rovnice f(p,x)=0 či soustava rovnic f(p,x)=0 nalezněte všechna analytická řešení x=g(p) Příklad nalezněte kořeny obecné kvadratické rovnice ax 2 + bx + c = 0 (dvě řešení) Řešení definice symbolických proměnných >> syms a b c
výpočet kvadratické rovnice ax 2 + bx + c = 0 >> x2=solve('a*x^2+b*x+c=0','x') x2 = -(b + (b^2 - 4*a*c)^(1/2))/(2*a) -(b - (b^2 - 4*a*c)^(1/2))/(2*a)
KŘP/IMSW Modelování ve výpočtových software
13‐9 (17) 17.12.11
František Dušek KŘP FEI Univerzita Pardubice
Příklad nalezněte kořeny kubické rovnice x + ax + bx + c = 0 (tři řešení) 3
2
Řešení definice symbolických proměnných >> syms a b c
výpočet kubické rovnice x 3 + ax 2 + bx + c = 0 >> x3=solve('x^3+a*x^2+b*x+c=0','x') x3 = ((a*b)/6 - c/2 + ((b/3 - a^2/9)^3 + (a^3/27 - (b*a)/6 + c/2)^2)^(1/2) - a^3/27)^(1/3) - (b/3 - a^2/9)/((a*b)/6 - c/2 + ((b/3 - a^2/9)^3 + (a^3/27 - (b*a)/6 + c/2)^2)^(1/2) a^3/27)^(1/3) - a/3 (b/3 - a^2/9)/(2*((a*b)/6 - c/2 + ((b/3 - a^2/9)^3 + (a^3/27 - (b*a)/6 + c/2)^2)^(1/2) - a^3/27)^(1/3)) - a/3 ((a*b)/6 - c/2 + ((b/3 - a^2/9)^3 + (a^3/27 - (b*a)/6 + c/2)^2)^(1/2) a^3/27)^(1/3)/2 (3^(1/2)*((b/3 a^2/9)/((a*b)/6 - c/2 + ((b/3 - a^2/9)^3 + (a^3/27 - (b*a)/6 + c/2)^2)^(1/2) - a^3/27)^(1/3) + ((a*b)/6 - c/2 + ((b/3 - a^2/9)^3 + (a^3/27 - (b*a)/6 + c/2)^2)^(1/2) - a^3/27)^(1/3))*i)/2 (b/3 - a^2/9)/(2*((a*b)/6 - c/2 + ((b/3 - a^2/9)^3 + (a^3/27 - (b*a)/6 + c/2)^2)^(1/2) - a^3/27)^(1/3)) - a/3 ((a*b)/6 - c/2 + ((b/3 - a^2/9)^3 + (a^3/27 - (b*a)/6 + c/2)^2)^(1/2) a^3/27)^(1/3)/2 + (3^(1/2)*((b/3 a^2/9)/((a*b)/6 - c/2 + ((b/3 - a^2/9)^3 + (a^3/27 - (b*a)/6 + c/2)^2)^(1/2) - a^3/27)^(1/3) + ((a*b)/6 - c/2 + ((b/3 - a^2/9)^3 + (a^3/27 - (b*a)/6 + c/2)^2)^(1/2) - a^3/27)^(1/3))*i)/2
Příklad nalezněte kořeny kubické rovnice x 3 + 7 x 2 − x / 5 + 11 = 0 (tři přesná numerická řešení ) Řešení >> v=solve('x^3+7*x^2-x/5+11=0'); v = - 248/(45*(2489/135 (3375^(1/2)*582319^(1/2))/3375)^(1/3)) - (2489/135 (3375^(1/2)*582319^(1/2))/3375)^(1/3) - 7/3 (3^(1/2)*(248/(45*(2489/135 (3375^(1/2)*582319^(1/2))/3375)^(1/3)) - (2489/135 (3375^(1/2)*582319^(1/2))/3375)^(1/3))*i)/2 + 124/(45*(2489/135 (3375^(1/2)*582319^(1/2))/3375)^(1/3)) + (2489/135 (3375^(1/2)*582319^(1/2))/3375)^(1/3)/2 - 7/3 124/(45*(2489/135 (3375^(1/2)*582319^(1/2))/3375)^(1/3)) (3^(1/2)*(248/(45*(2489/135 (3375^(1/2)*582319^(1/2))/3375)^(1/3)) - (2489/135 (3375^(1/2)*582319^(1/2))/3375)^(1/3))*i)/2 + (2489/135 (3375^(1/2)*582319^(1/2))/3375)^(1/3)/2 - 7/3
což převedeno do standardního číselného vyjádření funkcí double je přibližně >> double(v) ans = -7.2376 0.1188 + 1.2271i 0.1188 - 1.2271i
Příklad nalezněte všechna řešení soustavy dvou nelineárních rovnic x 2 + ay 2 = 1 y 2 − bx 2 = 1 (čtyři páry řešení) Řešení definice symbolických proměnných >> syms a b 2 2 výpočet soustavy rovnic x + ay = 1
y 2 − bx 2 = 1
>> eq1=sym('x^2+a*y^2=1'); >> eq2=sym('y^2-b*x^2=1'); >> v=solve(eq1,eq2,'x','y') v = x: [4x1 sym]
KŘP/IMSW Modelování ve výpočtových software
13‐10 (17) 17.12.11
František Dušek KŘP FEI Univerzita Pardubice
y: [4x1 sym] >> v.x ans = (-(a - 1)/(a*b -(-(a - 1)/(a*b (-(a - 1)/(a*b -(-(a - 1)/(a*b
+ + + +
>> v.y 1))^(1/2) ans = ((b + 1)/(a*b 1))^(1/2) ((b + 1)/(a*b 1))^(1/2) -((b + 1)/(a*b 1))^(1/2) -((b + 1)/(a*b
Příklad nalezněte všechna řešení soustavy dvou rovnic
+ + + +
1))^(1/2) 1))^(1/2) 1))^(1/2) 1))^(1/2)
(1 + ax )y = c (1 + by )x = c
Řešení >> v=solve ('(1+a*x)*y=c','(1+b*y)*x=c') v = x: [2x1 sym] y: [2x1 sym] >> v.x ans = -((b*c)/2 - (a*c)/2 + (a^2*c^2 - 2*a*b*c^2 + 2*a*c + b^2*c^2 + 2*b*c + 1)^(1/2)/2 + 1/2)/a ((a*c)/2 - (b*c)/2 + (a^2*c^2 - 2*a*b*c^2 + 2*a*c + b^2*c^2 + 2*b*c + 1)^(1/2)/2 - 1/2)/a >> v.y ans = -(a*c - b*c + (a^2*c^2 - 2*a*b*c^2 + 2*a*c + b^2*c^2 + 2*b*c + 1)^(1/2) + 1)/(2*b) -(a*c - b*c - (a^2*c^2 - 2*a*b*c^2 + 2*a*c + b^2*c^2 + 2*b*c + 1)^(1/2) + 1)/(2*b)
13.2.2 Derivace, integrály, integrální transformace Pomocí Symbolic Math Tbx lze také určit symbolické (analytické) derivace a integrace funkcí. Blíže viz help diff a help int. Určení derivace funkce se provádí pomocí funkce diff r=diff(S,var,n) kde S je symbolický výraz, který se má derivovat, volitelný parametr var je označení proměnné podle které se má derivovat a volitelný parametr 1 ≤ n je řád derivace. Úloha je‐li známa funkce f(p,x), nalezněte n‐tou derivaci podle zvolené proměnné Příklad mějme funkci f (a, x ) = cos (ax ) , určete první derivaci podle x, dru‐ hou derivaci podle x a první derivaci podle a a
Řešení první derivace podle x >> dx1=diff(sym('cos(a*x)^a')) dx1 = -a^2*cos(a*x)^(a - 1)*sin(a*x)
df dx = −a 2 cosa−1 (ax )sin (ax )
druhá derivace podle x >> dx2=diff(sym('cos(a*x)^a'),2) dx2 = a^3*cos(a*x)^(a 2)*sin(a*x)^2*(a a^3*cos(a*x)*cos(a*x)^(a - 1)
-
1)
-
d 2 f dx2 = a3 cosa−2 (ax)sin(ax)(a −1) − a3 cosa−2 (ax) cosa−1 (ax)
první derivace podle a >> da1=diff(sym('cos(a*x)^a'),'a') da1 = log(cos(a*x))*cos(a*x)^a - a*x*cos(a*x)^(a - 1)*sin(a*x) >> pretty(da1)
KŘP/IMSW Modelování ve výpočtových software
13‐11 (17) 17.12.11
František Dušek KŘP FEI Univerzita Pardubice
a a - 1 log(cos(a x)) cos(a x) - a x cos(a x) sin(a x)
(
)
df da = ln cosa−1 (ax ) cosa − ax cosa−1 (ax )sin (ax )
Určení integrálu funkce se provádí pomocí funkce int se syntaxí r=int(S,var,a,b) kde S je symbolický výraz, který se má integrovat, volitelný parametr var je označení proměnné, podle které se má integrovat a volitelné parametry a, b jsou dolní a horní integrační mez v případě, že chceme určitý integrál. Úloha je‐li známa funkce f(p,x), nalezněte neurčitý či určitý integrál podle proměnné x
(
∫ sin (a + 2
)
f (a, x ) = sin 2 a + x , určete neurčitý integrál
Příklad mějme funkci
)
x dx
Řešení definice definice symbolických proměnných >> syms a x >> in=int(sym('sin(a+sqrt(x))^2'),'x') in = x/2 - (x^(1/2)*sin(2*a + 2*x^(1/2)))/2 + sin(a + x^(1/2))^2/2 >> pretty(in) 1/2 1/2 1/2 2 x x sin(2 a + 2 x ) sin(a + x ) - - ---------------------- + -------------2 2 2
∫ sin (a + 2
)
x dx =
[
(
)
Příklad mějme funkci f (R, x ) =
)]
R 2 − x 2 , určete hodnotu určitého integrálu
R
∫
(
1 x − x sin 2a + 2 x + sin 2 a + x 2
x
R 2 − x 2 dx a integrálu jako funkce horní meze
−R
∫
R 2 − t 2 dt
−R
Řešení definice symbolických proměnných >> syms R x >> eq=sym('sqrt(R^2-x^2)'); >> in1=int(eq,'x',-R,R) in1 = (pi*R^2)/2 R
∫
−R
1 R 2 − x 2 dx = πR 3 2
>> in2=int(eq,'x',-R,x) in2 = (R^2*asin(R/(R^2)^(1/2)))/2 + (R^2*asin(x/(R^2)^(1/2)))/2 (x*(R^2 - x^2)^(1/2))/2 >> pretty(in2) 2 / R \ 2 / x \ R asin| ------- | R asin| ------- | | 2 1/2 | | 2 1/2 | 2 2 1/2 \ (R ) / \ (R ) / x (R - x ) ------------------ + ------------------ + -------------2 2 2
KŘP/IMSW Modelování ve výpočtových software
13‐12 (17) 17.12.11
+
František Dušek KŘP FEI Univerzita Pardubice
x
∫
R 2 − t 2 dt =
−R
⎤ ⎛ R ⎞ ⎛ x ⎞ 1⎡ 2 ⎟⎟ + R 2 arcsin ⎜⎜ ⎟⎟ + x R 2 − x 2 ⎥ ⎢ R arcsin ⎜⎜ 2 2 2 ⎢⎣ ⎥⎦ ⎝ R ⎠ ⎝ R ⎠
Integrální transformace Symbolic Math Tbx obsahuje funkce pro výpočet normálních i zpětných inte‐ grálních transformací – Fourierovi, Laplaceovi a Z‐transformace. Blíže viz help fourier, help ifourier, help laplace, help ilaplace, help ztrans a help iztrans Fourierova transformace je realizována funkcí F=fourier(f) a zpětná Fourierova transformace je realizována funkcí f=ifourier(F) kde f(x) je původní funkce a F(w) je Fourierův obraz Úloha je‐li známa funkce f(x), nalezněte Fourierův obraz F(w) podle vztahu
F (w ) =
+∞
∫ f (x )e
−iwx
dx a je‐li znám obraz F(w) nalezněte originál f(x) podle
−∞
vztahu f ( x ) =
1 2π
+∞
∫ F (w)e
iwx
dw
−∞
2 −x Příklad mějme funkci f ( x ) = x e , nalezněte Fourierův obraz F(w) a k tomu‐ to obrazu nalezněte originál 2
Řešení definice symbolických proměnných >> syms x >> f=x^2*exp(-x^2); >> F=fourier(f) F = pi^(1/2)/(2*exp(w^2/4)) - (pi^(1/2)*w^2)/(4*exp(w^2/4))
f (x ) = x e
2 − x2
⇒
w2
π⎛
w2 ⎞ − 4 ⎜⎜1 − ⎟e F (w ) = 2 ⎝ 2 ⎟⎠
>> fo=ifourier(F) fo = (pi/exp(x^2) (pi^(1/2)*((4*pi^(1/2))/exp(x^2) (8*pi^(1/2)*x^2)/exp(x^2)))/4)/(2*pi) >> fo=simple(fo) fo = x^2/exp(x^2)
-
Laplaceova transformace je realizována funkcí L=laplace(f) a zpětná Laplaceova transformace je realizována funkcí f=ilaplace(L) kde f(t) je původní funkce a L(s) je Laplaceův obraz
KŘP/IMSW Modelování ve výpočtových software
13‐13 (17) 17.12.11
František Dušek KŘP FEI Univerzita Pardubice
Úloha je‐li známa funkce f(t), nalezněte Laplaceův obraz L(s) podle vztahu
L (s ) =
+∞
∫ f (t )e
− st
dt je‐li znám obraz L(s) nalezněte originál f(t) podle vztahu
0
c + i∞
1 f (t ) = L(s )e st ds ∫ 2πi c − i∞
2 − at Příklad mějme funkci f (t ) = t e , nalezněte Laplaceův obraz L(s) a k tomuto obrazu nalezněte originál
Řešení definice symbolických proměnných >> syms a t >> f=t^2*exp(-a*t); >> L=laplace(f) L = 2/(a + s)^3 >> fo=ilaplace(L) fo = t^2/exp(a*t)
Z‐ transformace je realizována funkcí F=ztrans(f) a zpětná Z‐transformace je realizována funkcí f=iztrans(F) kde f(n) je původní funkce a F(z) je obraz v Z‐transformaci Úloha je‐li známa funkce f(n), nalezněte obraz Z‐transformaci F(z) podle vztahu F ( z ) =
∞
∑ f (n )z
−n
a je‐li znám obraz F(z) nalezněte originál f(n)
n=0
podle vztahu f (n ) =
1 2πi
∫ F (z )z
n −1
z =R
dz n = 1,2,K
Příklad mějme funkci f (n) = n + an , nalezněte obraz v Z‐transformaci F(z) a k tomuto obrazu nalezněte originál 2
Řešení definice symbolických proměnných >> syms n a >> f=n^2+a*n; >> F=ztrans(f) F = (z^2 + z)/(z - 1)^3 + (a*z)/(z - 1)^2 >> fo=iztrans(F) fo = 2*binomial(n-1,2)-(kroneckerDelta(n,0)-1)*(a+1)+ (a+3)*(n+kroneckerDelta(n,0)-1)-2*kroneckerDelta(n,0) >> fo=simple(fo) fo = n*(a + n)
13.2.3 Diferenciální rovnice Poslední funkcí Symbolic Math Tbx, o které se zmíníme, je funkce dsolve pro řešení diferenciálních rovnic. f=dsolve(eq1,eq2,...,cond1,cond2,...,var)
KŘP/IMSW Modelování ve výpočtových software
13‐14 (17) 17.12.11
František Dušek KŘP FEI Univerzita Pardubice
kde eq jsou definice rovnic, cond definice počátečních či okrajových podmínek a var označení nezávisle proměnné, blíže viz help dsolve.
Úloha je‐li známa diferenciální rovnice f(x,y,y΄,..)=0 nebo soustava diferenciálních rovnic případně s počátečními podmínkami nalezněte funkce vyhovující daným rovnicím Příklad mějme rovnici y′′ + (1 − y′) = 1 , nalezněte obecné řešení (dvě řešení) 2
Řešení >> r=dsolve('D2y+(1-Dy)^2=1') r = C12 log(C11 - (C10*exp(2*t))/2)
y1 (t ) = C
(
)
y2 (t ) = ln C1 − C2e 2t z′ = a − y , nalezněte obecné řešení
Příklad mějme rovnice y′ = az
Řešení definice symbolických proměnných >> syms a >> e1='Dy=a*z'; e2='Dz=y-a'; >> r=dsolve(e1,e2) r = z: [1x1 sym] y: [1x1 sym] >> z=r.z z = C59*exp(a^(1/2)*t) + C60/exp(a^(1/2)*t)
z (t ) = C1et
a
+ C2 e − t
a
>> y=r.y y = a + C59*a^(1/2)*exp(a^(1/2)*t) - (C60*a^(1/2))/exp(a^(1/2)*t)
y (t ) = a + C1 a et
a
+ C2 a e − t
a
Příklad mějme rovnice y′ = az z′ = a − y a počáteční podmínky y(0)=2, z(0)=‐3. Nalezněte řešení pro nezávisle proměnnou x. Řešení definice symbolických proměnných >> syms a >> e1='Dy=a*z'; e2='Dz=y-a'; >> r=dsolve(e1,e2,'y(0)=2','z(0)=-3','x') r = z: [1x1 sym] y: [1x1 sym] >> z=r.z z = -(3*a^(1/2)-a+2)/(2*a^(1/2)*exp(a^(1/2)*x)) (exp(a^(1/2)*x)*(a+3*a^(1/2)-2))/(2*a^(1/2))
z (t ) = −
3 a +a−2 x e 2 a
a
−
3 a − a + 2 −x e 2 a
-
a
>> y=r.y y = a-(exp(a^(1/2)*x)*(a+3*a^(1/2)-2))/2+(3*a^(1/2)-a+2) /(2*exp(a^(1/2)*x))
y (t ) = a −
3 a +a−2 x e 2
a
+
3 a − a + 2 −x e 2
KŘP/IMSW Modelování ve výpočtových software
a
13‐15 (17) 17.12.11
František Dušek KŘP FEI Univerzita Pardubice
dy =axy y (t = 0 ) = c dt . Nalezněte řešení pro Příklad mějme rovnice dx = a ( x + y ) x (t = 0 ) = c dt nezávisle proměnné x a y. Řešení >> v=dsolve('Dy=a*(y-x)','Dx=a*(x+y)','y(0)=c','x(0)=c') v = x: [1x1 sym] y: [1x1 sym] >> v.x ans = c*exp(a*t*(1-i))*(1/2+i/2) + c*exp(a*t*(1+i))*(1/2-i/2) >> x=simple(v.x) x = c*exp(a*t)*(cos(a*t) + sin(a*t)) >> v.y ans = c*exp(a*t*(1-i))*(1/2-i/2) + c*exp(a*t*(1+i))*(1/2+i/2) >> y=simple(v.y) y = c*exp(a*t)*(cos(a*t) - sin(a*t))
KŘP/IMSW Modelování ve výpočtových software
13‐16 (17) 17.12.11
František Dušek KŘP FEI Univerzita Pardubice
Pojmy k zapamatování Okruhy problémů: použití modelu SIMULINKu z MATLABu, symbolické výpočty v Symbolic Math Tbx Použité nástroje:
Funkce: diff, digits, double, dsolve, int, pretty, set_param, sim, simget, simple, simset, solve, sym, syms, vpa
Otázky na procvičení 1. 2. 3. 4. 5. 6. 7.
Jak se nazývá funkce umožňující volání modelu SIMULINKu z příkazové řádky MATLABu? Jaké jsou výhody novější varianty volání modelu SIMULINKu z MATLABu? Co znamená výpočet s požadovanou přesností a jakou se jmenuje funkce pro nastavení přesnosti? Jaká je standardní přesnost výpočtů v MATLABu? Jakého typu jsou proměnné použité pro symbolické výpočty a proč? Jak je možné, že stejná funkce (např. inv) dá jednou numerický a jindy symbolický výsledek? Co zajišťuje funkce simple?
Odkazy a další studijní prameny • •
• •
elektronická dokumentace k programu SIMULINK – v „Functions / Simu‐ lations“ funkce „sim“ elektronická dokumentace k programu MATLAB – v „Symbolic Math Toolbox / Getting Started“ část „Symbolic Objects“ a „Creating Symbolic Variables and Expressions“ elektronická dokumentace k programu MATLAB – nápověda k jednotli‐ vým funkcím elektronická dokumentace – www.mathworks.com/help/
KŘP/IMSW Modelování ve výpočtových software
13‐17 (17) 17.12.11
František Dušek KŘP FEI Univerzita Pardubice