31.03.2014 Views

interaktivní učební test (5,8 MB) - Matematika pro inženýry 21. století ...

interaktivní učební test (5,8 MB) - Matematika pro inženýry 21. století ...

interaktivní učební test (5,8 MB) - Matematika pro inženýry 21. století ...

SHOW MORE
SHOW LESS

Transform your PDFs into Flipbooks and boost your revenue!

Leverage SEO-optimized Flipbooks, powerful backlinks, and multimedia content to professionally showcase your products and significantly increase your reach.

Vysoká škola báňská – Technická univerzita OstravaZápadočeská univerzita v PlzniLINEÁRNÍ ALGEBRA S MATLABEM -interaktivní učební textObsahTomáš Kozubek, Tomáš BrzobohatýVáclav Hapla, Marta JarošováAlexandros Markopoulos1. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


Obsah2. strana ze 309T. Kozubek, T. Brzobohatý, V. Hapla, M. Jarošová, A. MarkopoulosLINEÁRNÍ ALGEBRA S MATLABEM - interaktivní učební text◭ ◭ ◮ ◮◭◮c○ Tomáš Kozubek a kolektiv, 5. října 2012, 14:28ISBNZavřít dokumentCelá obrazovka ⧸︀ Okno


materiály lze najít na stránkách http://mi<strong>21.</strong>vsb.cz/.Obsah5. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokument5Celá obrazovka ⧸︀ Okno


ObsahPředmluva 3ObsahI Matlab 141 Úvod do Matlabu 151.1 Co je Matlab? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151.2 Matlab jako <strong>pro</strong>gram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161.2.1 Command Window a zadávání příkazů . . . . . . . . . . . . . . . . . 161.2.2 Workspace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181.2.3 Command History . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181.2.4 Current Folder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191.3 Matlab jako jazyk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191.4 Matlab jako knihovna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191.5 Volně dostupné alternativy Matlabu . . . . . . . . . . . . . . . . . . . . . . 2066. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


2 Základy <strong>pro</strong>gramování v jazyce Matlab 232.1 Matice, vektory, skaláry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242.1.1 Zadávání matic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242.1.2 Základní operace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272.1.3 Lomítkové operátory . . . . . . . . . . . . . . . . . . . . . . . . . . . 302.1.4 Vestavěné funkce <strong>pro</strong> generování matic . . . . . . . . . . . . . . . . . 312.1.5 Dvojtečkový operátor . . . . . . . . . . . . . . . . . . . . . . . . . . 332.1.6 Zjištění velikosti matice . . . . . . . . . . . . . . . . . . . . . . . . . 342.1.7 Práce s prvky matice . . . . . . . . . . . . . . . . . . . . . . . . . . . 352.1.8 Mazání řádků a sloupců, konkatanace . . . . . . . . . . . . . . . . . 382.1.9 Elementární funkce a matematické konstanty . . . . . . . . . . . . . 392.2 Řetězce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402.2.1 Konstrukce řetězců . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402.2.2 Formátované řetězce . . . . . . . . . . . . . . . . . . . . . . . . . . . 412.2.3 Porovnávání řetězců . . . . . . . . . . . . . . . . . . . . . . . . . . . 412.2.4 Prohledávání řetězců . . . . . . . . . . . . . . . . . . . . . . . . . . . 422.2.5 Konverze řetězců . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432.3 Pole buněk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442.3.1 Konstrukce pole buněk . . . . . . . . . . . . . . . . . . . . . . . . . . 452.3.2 Přístup k prvkům pole . . . . . . . . . . . . . . . . . . . . . . . . . . 472.3.3 Vnořování polí . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482.3.4 Výpis obsahů buněk . . . . . . . . . . . . . . . . . . . . . . . . . . . 492.4 Struktury . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502.4.1 Konstrukce struktury . . . . . . . . . . . . . . . . . . . . . . . . . . 502.4.2 Přístup k položkám struktury . . . . . . . . . . . . . . . . . . . . . . 517Obsah7. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


5 Testové otázky 985.1 Test - základy Matlabu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 995.2 Test - práce se soubory, GUI . . . . . . . . . . . . . . . . . . . . . . . . . . 109II Soustavy rovnic 1126 Obecné řešení soustav lineárních rovnic 1136.1 Přeurčená soustava rovnic . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1136.1.1 Řešení přeurčených soustav . . . . . . . . . . . . . . . . . . . . . . . 1166.2 Nedourčená soustava rovnic . . . . . . . . . . . . . . . . . . . . . . . . . . . 1186.2.1 Čtvercová matice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1186.2.2 Obdélníková matice . . . . . . . . . . . . . . . . . . . . . . . . . . . 1216.3 Příklady soustav se čtvercovou maticí . . . . . . . . . . . . . . . . . . . . . 1226.3.1 Regulární matice soustavy - jediné řešení . . . . . . . . . . . . . . . 1236.3.2 Singularní matice soustavy - případ s nekonečně mnoho rešeními . . 1246.3.3 Singularní matice soustavy - případ, kdy žádné přesné řešení neexistuje. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1247 Ukládání a práce s řídkými maticemi 1267.1 CSR Formát . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1277.2 CSC Formát . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1317.3 Souřadnicová komprese . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1347.4 Práce s řídkými maticemi v Matlabu . . . . . . . . . . . . . . . . . . . . . . 1357.5 Cvičení . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139Obsah9. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokument9Celá obrazovka ⧸︀ Okno


8 Gaussova eliminace a LU rozklad 1408.1 Gaussova eliminace bez pivotizace . . . . . . . . . . . . . . . . . . . . . . . 1428.2 LU rozklad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1458.3 Základní algoritmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1498.4 Další možnost implementace . . . . . . . . . . . . . . . . . . . . . . . . . . . 1518.5 Řešení soustav pomocí LU rozkladu . . . . . . . . . . . . . . . . . . . . . . 1548.6 Příklady . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1549 Pivotizace 1569.1 Částečná pivotizace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1579.2 Úplná pivotizace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1629.3 Funkce Matlabu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16310 LDL T a Choleského rozklad 16410.1 LDL T rozklad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16510.2 Choleského rozklad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16610.3 Funkce Matlabu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16810.4 Příklady . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169Obsah10. strana ze 309◭ ◭ ◮ ◮◭◮11 Přeuspořádávací algoritmy 17011.1 Základní přeuspořádání . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17011.2 Přeuspořádání s redukcí šířky pásu (RCM) . . . . . . . . . . . . . . . . . . 17111.3 Přeuspořádání pomocí a<strong>pro</strong>ximace minimálního stupně (AMD) . . . . . . . 17112 QR rozklad 17312.1 Gramův-Schmidtův <strong>pro</strong>ces . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17510Zavřít dokumentCelá obrazovka ⧸︀ Okno


12.2 Givensova transformace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17812.2.1 Odvození matice rotace . . . . . . . . . . . . . . . . . . . . . . . . . 17812.2.2 Nulování prvků . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18012.2.3 Givensova QR metoda . . . . . . . . . . . . . . . . . . . . . . . . . . 18312.3 Householderova transformace . . . . . . . . . . . . . . . . . . . . . . . . . . 18612.3.1 Odvození matice zrcadlení . . . . . . . . . . . . . . . . . . . . . . . . 18712.3.2 Householderova QR metoda . . . . . . . . . . . . . . . . . . . . . . 19012.4 Funkce Matlabu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19312.5 Příklady . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19413 Vlastní čísla a spektrální rozklad 19513.1 Spektrální rozklad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19613.2 Výpočet spektrálního rozkladu pomocí QR algoritmu . . . . . . . . . . . . 19713.3 Modifikovaná QR metoda . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19913.4 Funkce Matlabu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20114 Singulární rozklad 20314.1 Využití spektrálního rozkladu A T A . . . . . . . . . . . . . . . . . . . . . . . 20314.2 Další možnost využití spektrálního rozkladu . . . . . . . . . . . . . . . . . . 20514.3 Mooreova-Penroseova inverze . . . . . . . . . . . . . . . . . . . . . . . . . . 20814.4 Příklady . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20914.5 Funkce Matlabu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21015 Lanczosova metoda 21215.1 Motivace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21215.2 Definice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21311Obsah11. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


15.3 Algoritmus Lanczosovy metody . . . . . . . . . . . . . . . . . . . . . . . . . 21516 Metoda sdružených gradientů 22116.1 Motivace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22116.2 Definice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22216.3 Analýza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22416.4 Definování skalárních součinů . . . . . . . . . . . . . . . . . . . . . . . . . . 22516.5 Algoritmus sdružených gradientů . . . . . . . . . . . . . . . . . . . . . . . . 22917 Testové otázky 23417.1 Test - řídké matice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23517.2 Test - algoritmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24017.3 Test - iterační řešiče . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247Obsah12. strana ze 309III Numerické řešení diferenciálních rovnic 25018 Diferenciální rovnice - motivační příklady 25118.1 Struna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25118.2 Membrána . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254◭ ◭ ◮ ◮◭◮19 Metoda sítí 25819.1 Metoda sítí v 1D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25819.2 Metoda sítí ve 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26320 Metoda konečných prvků 27420.1 Metoda konečných prvků v 1D . . . . . . . . . . . . . . . . . . . . . . . . .12275Zavřít dokumentCelá obrazovka ⧸︀ Okno


14Část IMatlabObsah14. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


174To, co Matlab vrátil, je výpis <strong>pro</strong>měnné ans. Tu Matlab automaticky použije, pokud saminespecifikujeme <strong>pro</strong>měnnou, do které chceme výsledek uložit. Takto bychom výsledek uložilido <strong>pro</strong>měnné var:>> var = 2 * 3var =6Lze také zadávat více příkazu na jednom řádku. Specialitou Matlabu je, že příkaz ukončenýzalomením řádku (Enter) nebo čárkou vypisuje vracené hodnoty. Pokud chceme totochování potlačit, napíšeme za příkaz středník.>> var = 3 + 4;>> var1 = 1; var2 = 7 / 2, var3 = 8 - 5var2 =Obsah17. strana ze 309◭ ◭ ◮ ◮◭◮var3 =3.50003Hodnotu <strong>pro</strong>měnné tedy můžeme vypsat <strong>pro</strong>stým zadáním jejího názvu bez středníku:>> varZavřít dokumentCelá obrazovka ⧸︀ Okno


18var =7Poznamenejne, že názvy <strong>pro</strong>měnných musí začínat písmenem následovaným libovolnou kombinacípísmen, číslic a znaků _ (podtržítko). Písmena mohou být malá i velká. Zkontrolovat,zda lze daný řetězec použít jako název <strong>pro</strong>měnné, můžeme příkazem isvarname:isvarname1 clovekans =0Obsah1.2.2. WorkspaceV panelu Workspace (pracovní <strong>pro</strong>stor) jsou pod sebou vypsány všechny <strong>pro</strong>měnné viditelnév daném kontextu s jejich názvy i hodnotami. Dvojklikem na název <strong>pro</strong>měnné se otevřepanel Variable Editor (editor <strong>pro</strong>měnných), který slouží k interaktivní editaci a poněkudpřipomíná Excel. Můžeme kliknout na hodnotu, zadat třeba 55 a potvrdit Enterem; změnase ihned <strong>pro</strong>jeví, o čemž se můžete přesvědčit jak pohledem na Variable Editor, tak vypsáním<strong>pro</strong>měnné v Command Window.18. strana ze 309◭ ◭ ◮ ◮◭◮1.2.3. Command HistoryV panelu Command History (historie příkazů) jsou pod sebou vypsány všechny příkazy,které jsme v minulosti zadali do Command Window. Dvojklikem se příkaz znovu <strong>pro</strong>vede.Zavřít dokumentCelá obrazovka ⧸︀ Okno


19Standardním způsobem za pomoci kláves Ctrl a Shift lze vybrat více příkazů, lze jekopírovat do schránky standardními klávesovými zkratkami nebo přes kontextové menuvyvolané pravým tlačítkem myši. V historii příkazů lze listovat také přímo v CommandWindow klávesami „šipka nahoru“ a „šipka dolů“. Hodí se to hlavně tehdy, když chcemevícekrát opakovat stejný příkaz.1.2.4. Current FolderPodobně lze pracovat i s panelem Current Folder (aktuální adresář), kde vidíme obsahaktuálního adresáře, nad kterým pracujeme. Pomocí pravého tlačítka myši navíc můžeme<strong>pro</strong>vádět základní souborové operace. Za zmínku stojí též možnost porovnání dvou souborů(Compare Selected Files nebo Compare Against...) a možnost přidávání nebo odstraňováníadresářů z „Path“, tedy seznamu adresářů, jejichž soubory jsou <strong>pro</strong> Matlab viditelné, i kdyžpracujeme nad jiným adresářem.1.3. Matlab jako jazykMatlab používá jednotný jazyk <strong>pro</strong> interaktivní použití i zdrojové soubory <strong>pro</strong>gramů. Syntaxíse snaží být co nejbližší matematické notaci. Základním datovým typem je na rozdílod jiných jazyků matice. Jednoduchý příklad příkazů v jazyce Matlab jsme již viděli v sekci1.2.1. Více o jazyce Matlab se dozvíte v kapitole 2.Obsah19. strana ze 309◭ ◭ ◮ ◮◭◮1.4. Matlab jako knihovnaSystém Matlab zahrnuje také rozsáhlou sadu funkcí v jazyce Matlab:Zavřít dokumentCelá obrazovka ⧸︀ Okno


20∙ základní i pokročilá matematika – např. generování a práce s hustými a řídkýmimaticemi, lineární algebra, polynomy, numerické a optimalizační metody∙ import a export dat∙ datová analýza – např. konvoluce, interpolace, regrese, Fourierova transformace∙ grafická vizualizace dat – např. 2D a 3D grafy funkcí, zobrazení obrázků∙ tvorba uživatelského rozhraní∙ rozhraní k externím aplikacím a jazykům – např. MS Excel, C/C++, Java.Možnosti Matlabu lze dále rozšiřovat pomocí tzv. toolboxů, což jsou specializované sadyfunkcí rozšiřující základní sadu, zaměřené často na specifickou aplikační oblast (např. ImageProcessing Toolbox, Statistics Toolbox). Zjistit, které toolboxy máme k dispozici, lze např.zobrazením nápovědy (nabídka Help / Product Help) – každý toolbox má vlastní sadumanuálových stránek reprezentovanou ikonkou knížky.Obsah20. strana ze 309◭ ◭ ◮ ◮◭◮1.5. Volně dostupné alternativy MatlabuPro úplnost dodejme, že existují také volně dostupné alternativy Matlabu. Z těch, kteréjsou Matlabu velmi podobné a jsou s ním do značné míry kompatibilní, jmenujme trojiciGNU Octave, Freemat a Scilab. Nebudeme je zde podrobněji popisovat, zájemce můžemeodkázat např. na srovnáníhttp://userpages.umbc.edu/~gobbert/papers/SharmaGobbertTR2010.pdf.Zavřít dokumentCelá obrazovka ⧸︀ Okno


21K podobným účelům jako Matlab je také používán skriptovací jazyk Python s rozšířenímijako NumPy, SciPy a Matplotlib. Tento jazyk vyniká možnostmi <strong>pro</strong>pojení s jinými jazyky.Je stále častěji používán zejména v rámci HPC (High Performance Computing). Srovnánís Matlabem najdete např. v http://web.bryant.edu/~bblais/bryant/numerical_computing/python_matlab.pdf.Obsah<strong>21.</strong> strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


22Obsah22. strana ze 309◭ ◭ ◮ ◮◭◮Obr. 1.1Prostředí MatlabZavřít dokumentCelá obrazovka ⧸︀ Okno


23Kapitola 2Základy <strong>pro</strong>gramování v jazyceMatlabObsah23. strana ze 309V této kapitole se seznámíte se základy jazyka Matlab. Doporučujeme zkoušet si vše rovnouv <strong>pro</strong>středí Matlabu. Matlab používá jednotný jazyk <strong>pro</strong> interaktivní zadávání příkazův Command Window i <strong>pro</strong> psaní <strong>pro</strong>gramů, jehož syntaxe připomíná matematickou notaci.Jedná se o jazyk slabě typový, to znamená, že se nedeklaruje typ <strong>pro</strong>měnné. Ve skutečnosti<strong>pro</strong>měnnou není třeba deklarovat vůbec, inicializuje se při prvním přiřazení hodnoty.◭ ◭ ◮ ◮◭◮AnimaceNázorné ukázky práce s Matlabem můžete vidět v instruktážních videích Datové typya Řízení toku <strong>pro</strong>gramu.Zavřít dokumentCelá obrazovka ⧸︀ Okno


242.1. Matice, vektory, skaláryZákladním datovým typem je na rozdíl od jiných jazyků matice; vektor a skalár jsou pouzespeciální případy. Matice jsou standardně komplexní s plovoucí desetinnou čárkou s dvojitoupřesností.2.1.1. Zadávání maticZadávání matic v jazyce Matlab je snadné. Jak je obvyklé ve všech jazycích, k oddělenídesetinných míst slouží tečka a záporná čísla se označují pomlčkou před číslem. Prvkymatice zadáváme po řádcích, jednotlivé prvky se oddělují mezerou nebo čárkou, řádky pakstředníkem nebo znakem zalomení řádku (Enter). Tyto způsoby lze libovolně kombinovat.Např. matici⎛ ⎞1 2A = ⎝3 4⎠5 6můžeme zadatObsah24. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


25>> A = [1 2; 3.1 -4; 5 6]; % ale take>> A = [1 ,2;3.1 , -4;5 ,6]; % nebo>> A = [1 2; 3.1 -45 6]; % nebo treba>> A = [1 23.1 , -45 6]; % atd . atd .Komentářeignorován:Znak % značí komentář, text za tímto znakem až do konce řádku je Matlabem>> % pisu si , co chci , a nikoho to nezajima>>ObsahBílé znaky Mezera mezi dvěma hodnotami odděluje sloupce matice. Zalomení řádkuodděluje řádky matice. Všude jinde jsou tyto „bílé znaky“ ignorovány a můžeme je používattřeba k přehlednějšímu zápisu.>> [ 1 + 2*3 12-8 2 ]25. strana ze 309◭ ◭ ◮ ◮◭◮ans =7 12-8 2Jak jsme si řekli, skaláry a vektory jsou pouze zvláštní případy matic. Skalár je tedymatice rozměrů 1 × 1; můžeme jej, ale nemusíme, uzavírat do hranatých závorek:Zavřít dokumentCelá obrazovka ⧸︀ Okno


26>> skalar = 1; % je zcela to same jako>> skalar = [1]skalar =1Vektor se zadává <strong>pro</strong>stě jako matice s jediným řádkem nebo sloupcem:>> sloupcovyVektor = [1;2;3]sloupcovyVektor =123>> radkovyVektor = [1 2 3]radkovyVektor =Obsah26. strana ze 309◭ ◭ ◮ ◮◭◮1 2 3Matlab zná také matice 0 × 0, které mají význam prázdné hodnoty 1 .>> A = []A =[]1 odpovídá NULL v jazyce C++Zavřít dokumentCelá obrazovka ⧸︀ Okno


272.1.2. Základní operaceJak jsme již viděli, základní aritmetické operace se zadávájí podobně jako v jiných jazycíchoperátory +, -, *, /. Mocnina se značí symbolem ^ (to je ten znak na stejné klávesejako šestka), např. 2 3 zadáme jako 2^3. Tyto operátory však pracují nejen s čísly, ale takés maticemi podle pravidel lineární algebry:>> [1 2; 3 4] * [ -1 -2; -3 -4] % nasobeni matice - maticeans =-7 -10-15 -22>> [ -1 -2; -3 -4]^2 % mocnina maticeans =7 1015 22Obsah27. strana ze 309◭ ◭ ◮ ◮◭◮Chceme-li vynutit operaci po prvcích, vložíme před operátor tečku:>> [1 2; 3 4] .* [ -1 -2; -3 -4] % nasobeni po prvcichans =-1 -4-9 -16Pro transpozici matice použijeme apostrof:Zavřít dokumentCelá obrazovka ⧸︀ Okno


28>> A = [1 2; 3 4] , A’A =ans =1 23 41 32 4Pozor, u komplexních matic se rozlišuje „obyčejná“ transpozice A T a hermitovská transpoziceA H (někdy nazývána matice konjugovaná k A), kdy dochází nejen k „překlopení“podél diagonály, ale každý prvek matice je navíc nahrazen komplexně sdruženým číslem.Pro transpozici A T je nutné apostrof opatřit tečkou:>> C = [2i;1+ i]; C’, C.’ % C^H, C^Tans =Obsah28. strana ze 309◭ ◭ ◮ ◮◭◮0 - 2.0000 i 1.0000 - 1.0000 ians =0 + 2.0000 i 1.0000 + 1.0000 iOperátory porovnání == ~= < = > a logické operátory | & ~ (disjunkce, konjunkce,negace) mohou operovat nad maticemi po prvcích; levý a pravý operand tedy musí mítstejnou velikost a výsledkem je logická matice (s hodnotami 0 a 1) stejné velikosti. Lze takéZavřít dokumentCelá obrazovka ⧸︀ Okno


29kombinovat skalár a matici, v tom případě je skalár aplikován na každý prvek matice.>> A = [3 1; 1 2] > 1A =1 00 1>> B = [5 6; 7 8] > A | B, A & B, ~Aans =1 10 1Obsah29. strana ze 309◭ ◭ ◮ ◮◭◮ans =1 00 0ans =Zavřít dokumentCelá obrazovka ⧸︀ Okno


300 11 0Operátory ||, resp. &&, (disjunkce, konjunkce) pracují pouze se skaláry, přičemž pravýoperand se vůbec nevyhodnocuje, pokud je levý operand vyhodnocen jako 1, resp. 0.2.1.3. Lomítkové operátoryOperátor ’/’ <strong>pro</strong> maticové operandy slouží k řešení maticové rovniceXA = B,přičemž <strong>pro</strong> výpočet neznámé matice X se používá notaceX = B/A.Pro skaláry A, B, X jde tedy o běžné dělení skaláru skalárem. Jazyk Matlab přináší takéoperátor ’∖’ . ZápisX = A∖B.znamená řešení maticové rovniceAX = B.Mezi oběma lomítky tedy platí vztah (B/A) T = (A T ∖B T ); v Matlabu se mnohem častějipoužívá zpětné lomítko ’∖’. Uvedené skutečnosti ilustruje následující jednoduchý příklad:>> A = [1 2; 3 4]; x = [1;2]; b = A*x;>> A\b, (b ’/A ’) ’ % v obou pripadech by melo vyjit xans =Obsah30. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


31ans =1212Všimněte si, že X = A∖B matematicky odpovídá X = B -1 A 1 a rovněž B/A = BA -1 .Rozdíl je v tom, že v případě lomítek při výpočtu není explicitně vyčíslena inverze a příkazje obvykle mnohem rychlejší a robustnější. Matlab používá sofistikovaný algoritmus 2 , kterývnitřně volá různé lineární řešiče podle toho, jaké vlastnosti má matice B. Pro symetrickématice je to Choleského rozklad, <strong>pro</strong> obecné čvercové LU rozklad a speciálně jsou ošetřenydiagonální, pásové, trojúhelníkové a řídké matice. Pro obdélníkovou matici B je X = A∖Břešení ve smyslu nejmenších čtverců, tedy řešení tzv. normální rovniceA T AX = A T B.Obsah31. strana ze 309◭ ◭ ◮ ◮◭◮2.1.4. Vestavěné funkce <strong>pro</strong> generování maticNaším prvním seznámením s používáním funkcí v jazyce Matlab bude několik vestavěnýchfunkcí <strong>pro</strong> generování matic. U následujících funkcí jedním argumentem specifikujeme velikostčtvercové matice, dvěma argumenty velikost obdélníkové matice:>> M = 3; N = 2;1 tj. násobení inverzní maticí zleva – v Matlabu X = inv(B)*A2 Pro podrobný popis algoritmu viz nápovědu Matlabu, příkaz doc mldivide, oddíl AlgorithmZavřít dokumentCelá obrazovka ⧸︀ Okno


32>> O1 = zeros (M); O2 = zeros (M,N); % same nuly>> Ones1 = ones (M); Ones2 = ones (M,N); % same jednicky>> R1 = rand (M); R2 = rand (M,N); % nahodna cisla>> I1 = eye (M), I2 = eye (M,N) % jednicky na% hlavni diagonale% ( jednotkova% <strong>pro</strong> M = N)I1 =1 0 00 1 00 0 1I2 =1 00 10 0Jako <strong>test</strong>ovací matice nám dále poslouží „magický čtverec“ generovaný funkcí magic:Obsah32. strana ze 309◭ ◭ ◮ ◮◭◮>> A = magic (4)A =16 2 3 135 11 10 89 7 6 124 14 15 1Matice je „magická“ tím, že má stejné součty všech řádků, sloupců i obou diagonál.Zavřít dokumentCelá obrazovka ⧸︀ Okno


341 3 5 7 9ans =Empty matrix : 1-by -0ans =10 8 6 4 2ans =1.0000 1.1000 1.2000 1.30002.1.6. Zjištění velikosti maticeVelikost matice můžeme zjistit pomocí funkce size:>> M = zeros (4 ,5) ;>> size (M) % vraci dvouslozkovy vektorObsah34. strana ze 309◭ ◭ ◮ ◮◭◮ans =4 5>> [m,n] = size (M) % vraci dve cislam =4Zavřít dokumentCelá obrazovka ⧸︀ Okno


35n =5Délku vektoru pohodlněji získáme funkcí length:>> length ([1 2 3])ans =32.1.7. Práce s prvky maticeNyní si ukážeme některé funkce pracující s jednotlivými prvky matice. Přesvědčte se, žemáte ve workspace magický čtverec A z oddílu 2.1.4>> AA =Obsah35. strana ze 309◭ ◭ ◮ ◮◭◮16 2 3 135 11 10 89 7 6 124 14 15 1Prvek [A] ij se vybírá pomocí notace A(i,j):>> A (3 ,2)ans =Zavřít dokumentCelá obrazovka ⧸︀ Okno


367Můžeme vybrat také více prvků najednou – submatici. Specifikujeme přitom vektor indexůřádků a vektor indexů sloupců, které chceme vybrat. Pro výběr určitého rozmezí se používáoperátor ’:’, který byl představen v kapitole 2.1.5. Speciálně, pokud zadáme pouze dvojtečkubez uvedení rozsahu, vybereme celý řádek nebo sloupec. Klíčové slovo end pak reprezentujemaximální index bez toho, abychom museli zjišťovat velikost matice.>> A (2 ,[1 3]) , A (2:3 , 1:2) , A (2 ,:) , A (2: end , 3) , A(end -1 , end )ans =5 10Obsahans =ans =5 119 736. strana ze 309◭ ◭ ◮ ◮◭◮5 11 10 8ans =10615ans =Zavřít dokumentCelá obrazovka ⧸︀ Okno


3712Pomocí funkce diag můžeme vybírat diagonály jako sloupcové vektory. Hlavní diagonálamá číslo 0, směrem nahoru mají diagonály čísla 1, 2, ..., směrem dolů -1, -2, ... . Není-li číslozadáno, bere se 0-tá diagonála.>> diag (A) ’, diag (A ,1) ’, diag (A , -2)ans =16 11 6 1ans =ans =9142 10 12Obsah37. strana ze 309◭ ◭ ◮ ◮◭◮Funkce sum vrací řádkový vektor, který obsahuje součty prvků přes každý sloupec. Speciálněsum(v), kde v je vektor, vrací sumu prvků vektoru v. Konečně přišel čas, abychom sepřesvědčili, že naše matice je skutečně magickým čtvercem:>> sum (A), sum (A ’) , sum ( diag (A)), sum ( diag ( rot90 (A)))ans =34 34 34 34Zavřít dokumentCelá obrazovka ⧸︀ Okno


38ans =34 34 34 34ans =34ans =34Najděte si sami pomocí help nebo doc, k čemu slouží funkce rot90!2.1.8. Mazání řádků a sloupců, konkatanaceZ již sestavené matice lze mazat řádky nebo sloupce přiřazením prázdné matice místo zadanýchřádků nebo sloupců:>> B = A; % zkopiruje A do B>> B (: ,1) = []; % smaze prvni sloupec B>> B ([1 3] ,:) = [] % smaze 1. a 3. radek BObsah38. strana ze 309◭ ◭ ◮ ◮◭◮B =11 10 814 15 1Matlab umožňuje také blokové zadávání, kdy místo jednotlivých prvků zadáváme submatice.Jinak řečeno slučujeme dvě nebo více matic do jedné. Říká se tomu konkatanace:Zavřít dokumentCelá obrazovka ⧸︀ Okno


39>> C = [B B +10; B +10 B]C =11 10 8 21 20 1814 15 1 24 25 1121 20 18 11 10 824 25 11 14 15 12.1.9. Elementární funkce a matematické konstantyMatlab má zabudovánu celou řadu elementárních matematických funkcí jako absolutní hodnota(abs), odmocnina (sqrt), exponenciální funkce (exp), sinus (sin) aj. Užitečný seznamtěchto funkcí, odkazující na jednotlivé stránky nápovědy, lze vypsat zadáním help elfun(nápověda přímo v příkazové řádce) nebo doc elfun (manuálová stránka) 1 .>> help elfunNěkolik speciálních funkcí vrací důležité konstanty:pi % Ludolfovo cislo 3.14159265...i, j % imaginarni jednotkaeps % relativni presnost realnych ciselrealmin % nejmensi podporovane kladne realne cislorealmax % nejvetsi podporovane realne cisloInf % nekonecno , napr . 1/0NaN % nedefinovana hodnota , napr . 0/01 Jak bylo zmíněno již v 2.1.4, help elfun vypíše čistě textovou nápovědu přímo v příkazové řádce, docelfun zobrazí grafickou manuálovou stránku v samostatném okně.Obsah39. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


402.2. ŘetězceŘetězce jsou speciální vektory, jejichž prvky nejsou interpretovány jako čísla, ale jako znaky.Každý znak má totiž svůj celočíselný kód a řetězec je ve skutečnosti vektor těchto kódů.Funkce jako size nebo přístup k prvkům fungují stejně jako u vektorů.2.2.1. Konstrukce řetězcůHodnota řetězce se zapisuje jako text ohraničený apostrofy:>> str = ’ja jsem retezec ’str =ja jsem retezecVíce řetězců lze spojit (konkatanovat) do jednoho dvěma způsoby:>> str = ’Dr. John Doe ’;>> str1 = strcat (str ,’, ’,’1970 ’) % Ignoruje mezeryObsah40. strana ze 309◭ ◭ ◮ ◮◭◮str1 =Dr. John Doe ,1970>> str2 = [str ,’, ’,’1970 ’] % Neignoruje mezerystr2 =Dr. John Doe , 1970Zavřít dokumentCelá obrazovka ⧸︀ Okno


412.2.2. Formátované řetězceFunkce sprintf slouží k zápisu formátovaných dat do řetězce. První argument je formátovacířetězec, do nějž jsou dosazovány další argumenty na místa tzv. konverzních specifikací (conversionspecifications). Konverzní specifikace je speciální podřetězec začínající znakem %.Není v našich možnostech zde uvést všechny varianty, k tomu nechť čtenáři poslouží nápovědak funkci sprintf; nejčastěji ale budete potřebovat ’%d’ <strong>pro</strong> celá čísla a ’%8.4f’ <strong>pro</strong>reálná čísla, kde 8, resp. 4, je max. počet cifer před, resp. za, desetinnou tečkou. Pro vloženíznaku tabulátoru, resp. nového řádku, vepište ’\t’, resp.’\n’.>> T =1323.56; str = sprintf (’Teplota \nT =%10.4 fK ’, T)str =TeplotaT= 1323.5600 K2.2.3. Porovnávání řetězcůNásledující funkce srovnávají dva řetězce a vracejí logickou hodnotu, 0 = neshoda, 1 =shoda.strcmp (’hello ’,’Hello ’)strncmp (’hello ’,’hell ’ ,4) % prvnich n znaku retezcustrcmpi (’hello ’,’Hello ’) % nerozlisuje mala a velkastrncmpi (’HELLO ’,’hell ’ ,4) % prvnich n znaku retezcu% ( nerozlisuje mala a velka )Obsah41. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


422.2.4. Prohledávání řetězcůFunkce strrep slouží k vyhledání všech výskytů daného podřetězce a jejich nahrazení jinýmpodřetězcem. Funkce findstr vrací index prvního výskytu daného podřetězce. Pokudpodřetězec není nalezen, vrátí []. Funkce strtok oddělí první slovo od zbytku řetězce.>> str = ’hura juchu hura ’;>> % Najde vsechny vyskyty ’hu ’ a prepise na ’hoo ’str = strrep (str ,’hu ’,’hoo ’)str =hoora juchoo hoora>> findstr (’cho ’,str )ans =9>> findstr (’hu ’,str )Obsah42. strana ze 309◭ ◭ ◮ ◮◭◮ans =[]>> % V a budou vsechny znaky od zacatku az po prvni mezeru ;% v b bude zbytek vety .>> [a,b] = strtok ( str )a =Zavřít dokumentCelá obrazovka ⧸︀ Okno


43hoorab =juchoohoora>> % lze pouzit i jiny oddelovac nez mezeru[a,b] = strtok (str ,’r’)a =hoob =ra juchoo hooraObsah43. strana ze 309◭ ◭ ◮ ◮◭◮2.2.5. Konverze řetězcůČasto potřebujeme převést řetězce převést na jiný datový typ, převést číslo v desítkovésoustavě na jinou soustavu, či převést malá písmena v řetězci na velká. A to vše takév opačném směru. Následuje výčet některých funkcí Matlabu, které k tomu slouží.double (’012 ’) % retezec na vektor ciselnych koduchar ([72 105]) % ciselne kody na retezec ’Hi ’int2str ([72 105]) % cela cisla na retezec ’72 105 ’Zavřít dokumentCelá obrazovka ⧸︀ Okno


44num2str (pi , ’%10.5 e’) % cisla na retezce% podle zadaneho formatu% ’3.14159 e +000 ’mat2str ([3.85 2.91; 7.74 8.99]) % matice na retezec% ’[3.85 2.91; 7.74 8.99] ’str2num (’72 105 ’) % [72 105]str2double (’72 105 ’) % NaNstr2num (’1 -2i’) % [1.0000 -2.0000 i]str2double (’1 +2i’) % 1.0000 - 2.0000i,dec2hex (255) % decimalni cisla na hexadecimalni jako retezecdec2bin (12) % decimalni cisla na binarni jako retezecdec2base (100 ,5) % decimalni cisla na cisla s lib . zakladem% a naopakhex2dec (’FF ’)bin2dec (’1100 ’)base2dec (’400 ’ ,5)% viz take num2hex , hex2numObsah44. strana ze 309◭ ◭ ◮ ◮◭◮lower ( str ) % Velka pismena v retezci zmeni na malaupper ( str ) % Mala pismena v retezci zmeni na velka2.3. Pole buněkPole buněk (cell array) je kolekce „paměťových buněk“, ve kterých mohou být uloženyrůzné typy dat – různě velkých matic, řetězců aj., přičemž buňky jsou na sobě nezávisléZavřít dokumentCelá obrazovka ⧸︀ Okno


45a každá může obsahovat data jiného typu a velikosti. Pole buněk mohou být jedno-, dvouivícerozměrná.2.3.1. Konstrukce pole buněkPole buněk můžeme vytvořit postupným přidáváním buněk, celé najednou nebo kombinacíobého.Konstrukce celého pole najednou Pole buněk se konstruuje podobně jako matice, jenmísto hranatých závorek použijeme složené a místo číselných prvků matice můžeme zadávatlibovolný typ dat. Zde je příklad pole, které má velikost 2x2 a obsahuje smíšená řetězcováa vektorová data:>> woman ={ ’Jonah Doe ’ ,[90 60 91]; ’Anne Black ’ ,[89 57 86]}woman =’Jonah Doe ’ [1 x3 double ]’Anne Black ’ [1 x3 double ]Obsah45. strana ze 309◭ ◭ ◮ ◮◭◮Takto vytvoříme prázdné pole:>> {} % prazdne poleans ={}Pomocí funkce cell můžeme vytvořit pole s prázdnými buňkami:Zavřít dokumentCelá obrazovka ⧸︀ Okno


46>> C = cell (2 ,3)C =[] [] [][] [] []Postupné vkládání buněk Stejné pole také můžeme sestavit po jednotlivých buňkách;můžeme též vkládat více buněk najednou jako vidíme na druhém řádku. Pole je dynamickyrealokováno, takže při nastavení obsahu neexistující buňky je tato buňka automaticky vytvořena.Buňky se indexují kulatými závorkami a konstruují složenými závorkami:>> clear woman>> woman (1 ,1) ={ ’Jonah Doe ’}; woman (1 ,2) ={[90 60 91]};>> woman (2 ,1:2) ={ ’Anne Black ’, [89 57 86]}woman =’Jonah Doe ’ [1 x3 double ]’Anne Black ’ [1 x3 double ]Obsah46. strana ze 309◭ ◭ ◮ ◮◭◮Postupné vkládání obsahů buněk Pole je dynamicky realokováno, takže při nastaveníhodnoty neexistující položky je tato položka automaticky vytvořena. Můžeme také vkládatpřímo obsahy buněk, indexují se složenými závorkami:>> clear woman>> woman {1 ,1}= ’Jonah Doe ’; woman {1 ,2}=[90 60 91];Zavřít dokumentCelá obrazovka ⧸︀ Okno


47>> woman {2 ,1}= ’Anne Black ’; woman {2 ,2}=[89 57 86]woman =’Jonah Doe ’ [1 x3 double ]’Anne Black ’ [1 x3 double ]Např. příkaz woman{1,1}=’Jonah Doe’ je třeba chápat takto: vytvoř buňku na pozici (1,1)v poli woman a vlož do ní řetězcovou hodnotu ’Jonah Doe’.2.3.2. Přístup k prvkům poleNásledující komentovaný kód ukazuje několik způsobů, jak lze přistupovat k jednotlivýmbuňkám.Obsah>> w= woman (1 ,1) % Vrati bunku , jejimz obsahem je jmeno zenyw =’Jonah Doe ’47. strana ze 309◭ ◭ ◮ ◮◭◮>> w {1} % Vrati obsah bunky w - jmeno zeny ( string )ans =JonahDoe>> w= woman {1 ,1} % Vrati obsah bunky se jmenem zeny ( string )w =Zavřít dokumentCelá obrazovka ⧸︀ Okno


48JonahDoe>> woman {1 ,2}(2) % Vrati 2. prvek matice v bunce (1 ,2)% ( obvod pasu 1. zeny )ans =602.3.3. Vnořování políBuňka může obsahovat libovolná data včetně pole buněk. Pole buněk tedy do sebe můžemevnořovat. Matlab podporuje také vnořené indexování, a to může kombinovat () i {} přístup.>> clear woman>> woman ={ ’Jonah Doe ’, {’60 kg ’ ,[90 60 91]}’Anne Black ’ ,{’56 kg ’ ,[89 57 86]} }% bunka (1 ,2) obsahuje pole bunekObsah48. strana ze 309◭ ◭ ◮ ◮◭◮woman =’Jonah Doe ’ {1 x2 cell }’Anne Black ’ {1 x2 cell }>> woman {2 ,2}{1} % ( vaha zeny 2)ans =56 kgZavřít dokumentCelá obrazovka ⧸︀ Okno


49>> woman {2 ,2}{2}(2) % obvod pasu 2. zenyans =572.3.4. Výpis obsahů buněkZavoláním funkce celldisp můžeme vypsat obsahy všech buněk pole najednou.>> celldisp ( woman )woman {1 ,1} =Jonah Doewoman {2 ,1} =Anne BlackObsah49. strana ze 309◭ ◭ ◮ ◮◭◮woman {1 ,2} =90 60 91woman {2 ,2} =89 57 86Zavřít dokumentCelá obrazovka ⧸︀ Okno


502.4. StrukturyStruktura se podobá poli buněk v tom, že může obsahovat libovolná smíšená data. Avšakk jejím položkám se nepřistupuje přes číselné indexy, ale <strong>pro</strong>střednictvím názvů položek.2.4.1. Konstrukce strukturyStrukturu můžeme vytvořit postupným přidáváním položek, celou najednou nebo kombinacíobého.Postupné přidávání položek Podobně jako pole buněk, je i struktura dynamicky realokována,takže při nastavení hodnoty neexistující položky je tato položka automatickyvytvořena.>> % zajisti , aby odstraneni studenta , byl -li jiz v pameti>> clear student ;>> student . jmeno = ’John Doe ’;>> student . predmet = ’LAM ’;>> student . znamky = [1 2 1];>> studentObsah50. strana ze 309◭ ◭ ◮ ◮◭◮student =jmeno : ’John Doe ’predmet : ’LAM ’znamky : [1 2 1]Zavřít dokumentCelá obrazovka ⧸︀ Okno


51Vytvoření celé struktury najednou Pomocí funkce struct můžeme vytvořit celoustrukturu najednou. Střídavě zadáváme názvy položek a jejich hodnoty.>> student = struct (’jmeno ’,’John Doe ’, ...’ predmet ’,’LAM ’,’ znamky ’ ,[1 2 1])student =jmeno : ’John Doe ’predmet : ’LAM ’znamky : [1 2 1]2.4.2. Přístup k položkám strukturyPro získání hodnoty položky struktury lze použít tečkovou syntaxi nebo funkci getfield.Ta umožňuje <strong>pro</strong>měnný název položky. Pro vložení hodnoty můžeme užít tečkovou syntaxinebo funkci setfield.>> sjmeno = student . jmeno % Vrati jmeno studenta , 1. zp.Obsah51. strana ze 309◭ ◭ ◮ ◮◭◮sjmeno =JohnDoe>> sjmeno = getfield ( student ,’jmeno ’) % 2. zp.sjmeno =Zavřít dokumentJohnDoeCelá obrazovka ⧸︀ Okno


52>> % 2. zp. umoznuje pouzit nazev polozky ulozeny v <strong>pro</strong>mennefield = ’jmeno ’; sjmeno = getfield ( student , field )sjmeno =JohnDoe>> sznamka = student . znamky (2) % Vrati 2. znamku studentasznamka =2>> % Nastavi jmeno studenta , 1. zp.student . jmeno = ’Jimmy White ’;>> % 2. zp., umoznuje pouzit nazev polozky ulozeny v <strong>pro</strong>mennestudent = setfield ( student ,’jmeno ’,’Jimmy White ’)student =Obsah52. strana ze 309◭ ◭ ◮ ◮◭◮jmeno : ’Jimmy White ’predmet : ’LAM ’znamky : [1 2 1]2.4.3. Vnořování strukturPodobně jako buňka, může též položka struktury obsahovat libovolná data včetně pole nebostruktury. Struktury můžeme vnořovat do sebe. Přístup do vnořené struktury je jednoduchý,můžeme použít zřetězenou tečkovou syntaxi.Zavřít dokumentCelá obrazovka ⧸︀ Okno


53>> student = struct (’jmeno ’,’John Doe ’,’ predmet ’,’LAM ’ ,...’ znamky ’, struct (’<strong>test</strong>1 ’ ,1,’<strong>test</strong>2 ’ ,2,’zkouska ’ ,1));>> student . znamky % Vypis obsahu vnorene strukturyans =<strong>test</strong>1 : 1<strong>test</strong>2 : 2zkouska : 1>> student . znamky . <strong>test</strong>1 % Pristup k polozce vnorene strukturyans =1Obsah53. strana ze 3092.4.4. Test existence položkyJak zjistit, zda daná struktura obsahuje danou položku?◭ ◭ ◮ ◮◭◮>> % Test , zda polozka ’jmeno ’ existuje ve strukture student>> isfield ( student ,’jmeno ’)ans =1>> % Test , zda polozky ’jmeno ’,’ znameni ’% existuji ve strukture student>> isfield ( student ,{ ’jmeno ’,’ znameni ’})Zavřít dokumentCelá obrazovka ⧸︀ Okno


54ans =1 02.5. SkriptySkripty slouží k tomu, abychom jedním, námi definovaným příkazem spustili celou posloupnostpříkazů místo toho, abychom je pokaždé ručně spouštěli jeden za druhým. Funkce navícmohou přijímat vstupní argumenty ovlivňující průběh výpočtu a výsledky výpočtů mohoubýt vráceny jako výstupní argumenty. Funkce <strong>pro</strong>bereme v oddíle 2.8.Psaní skriptů je velmi jednoduché. Příkazem edit se otevře nový panel Editor. Lze to<strong>pro</strong>vést také jinými způsoby 1 :∙ kliknutí na ikonku New Script v panelu nástrojů∙ klik pravým tlačítkem do panelu Current Folder a výběr New File > Script.∙ výběr File > New > Script. v hlavním menuObsah54. strana ze 309◭ ◭ ◮ ◮◭◮∙ stisknutí klávesové zkratky Ctrl+NDo editoru nyní můžeme vepsat libovolnou posloupnost příkazů v jazyce Matlab úplně stejnějako do Command Window. Zkusme např. vepsat sérii příkazů z oddílu 2.1.8 2 , která vedek vytvoření matice C:1 Podobně jako v jiných <strong>pro</strong>gramech s graf. uživ. rozhraním tedy existuje někdy mnoho možností jak<strong>pro</strong>vést tu samou akci, záleží jen na vašich preferencích. Další příkazy již takto podrobně rozebírat nebudeme.2 nejjednodušeji copy&paste z panelu Command HistoryZavřít dokumentCelá obrazovka ⧸︀ Okno


55A = magic (4) ;B = A; % zkopiruje A do BB (: ,1) = []; % smaze prvni sloupec BB ([1 3] ,:) = [] % smaze prvni a treti radek BC = [B B +10; B +10 B]Pak skript uložíme do souboru kliknutím na ikonku Save 1 . Pojmenujte jej např. generateC.m.Přípona .m je důležitá; soubory s touto příponou jsou Matlabem indexovány a lze je spustit.Říkame jim M-soubory (M-files). Pokud je skript uložen v aktuálním adresáři 2 , je od tétochvíle <strong>pro</strong> Matlab viditelný a rozšiřuje sadu příkazů, které lze spustit. Spustíme jej tedyzadáním jeho názvu v Command Window:>> generateCB =C =11 10 814 15 1Obsah55. strana ze 309◭ ◭ ◮ ◮◭◮11 10 8 21 20 1814 15 1 24 25 1121 20 18 11 10 824 25 11 14 15 11 nebo File / Save nebo klávesovou zkratkou Ctrl+S.2 adresář, který vidíme v řádku Current Folder v panelu nástrojů a v panelu Current FolderZavřít dokumentCelá obrazovka ⧸︀ Okno


56Není překvapením, že se vypsaly vrácené hodnoty B a C, <strong>pro</strong>tože příslušné příkazy nejsouukončeny středníkem.Dále si všimněte, že <strong>pro</strong>měnné zůstaly v pracovním <strong>pro</strong>storu 1 :>> whoYour variables are :A B CTo je <strong>pro</strong> skripty typické: všechny <strong>pro</strong>měnné vytvořené za běhu skriptu zůstávají v pracovním<strong>pro</strong>storu, dokud je nesmažeme.2.6. Textový výstup do příkazové řádkyJiž jsme viděli, že Matlab vypisuje vrácené hodnoty u příkazů, jež nejsou zakončeny středníkem.Nyní se podívejme na funkce Matlabu, které umožňují sofistikovanější textový výstupdo příkazové řádky. Funkce disp vypíše pouze hodnotu <strong>pro</strong>měnné a nic víc:Obsah56. strana ze 309◭ ◭ ◮ ◮◭◮>> str = [’MiG -’ num2str (21) ];>> strstr =MiG -21>> disp ( str )MiG -211 vizte také obsah panelu WorkspaceZavřít dokumentCelá obrazovka ⧸︀ Okno


57>> disp ([1 22; 33 4]) ;1 2233 4Funkce fprintf (kapitola ??) umožňuje formátovaný výstup. Je podobná funkci sprintf(viz 2.2.2), ale výstup jde do příkazové řádky a ne do řetězce:>> T =1323.56; fprintf (’Teplota \nT =%10.4 fK\n’, T)TeplotaT = 1323.5600 K2.7. Řízení toku <strong>pro</strong>gramuNyní se seznámíme s příkazy, které nám umožní psát skutečné algoritmy. Reálné kódy musípři svém běhu reagovat na data, větvit se na základě logických podmínek a iterovat, tj.opakovat stejnou sadu příkazů, dokud není splněna určitá podmínka. Byť lze toto činiti v příkazové řádce, význam to má zejména <strong>pro</strong> skripty a funkce, o kterých bude nyní řeč.Obsah57. strana ze 309◭ ◭ ◮ ◮◭◮2.7.1. Podmínkový blok (if-elseif-else)Základním způsobem větvení <strong>pro</strong>gramu je konstrukce if-elseif-else-end. Obecně vypadátakto:if podminka1% prikazy , jez se <strong>pro</strong>vedou pri splneni podminka1elseif podminka2% prikazy , jez se <strong>pro</strong>vedou , pokud neni splnenaZavřít dokumentCelá obrazovka ⧸︀ Okno


58% podminka1 a zaroven je splnena podminka2else% prikazy , ktere se <strong>pro</strong>vedou v ostatnich pripadechend % konec ifJak vidíme, ukončuje se klíčovým slovem end. A zde máme konkrétní příklad:if n 0 a sude , podel ho 2.a = n /2;else% Je -li n >0 a liche , zvetsi ho o 1 a podel 2.a = (n +1) /2;endTento kousek kódu můžeme uložit jako ex1.m. Podívejme se, jak skript ex1 reaguje na různéhodnoty n:Obsah58. strana ze 309◭ ◭ ◮ ◮◭◮>> n = -10; ex1 ; aVstupni argument n musi byt kladny !a =NaN>> n = 10; ex1 ; aa =Zavřít dokumentCelá obrazovka ⧸︀ Okno


595>> n = 7; ex1 ; aa =4Matlab podporuje i maticové podmínky:if A >=0% pokud jsou vsechny prvky A >=0 ruzne od nulydisp ( sqrt (A));elsedisp (’A neni nezaporne ’)endPo uložení do souboru ex2.m měníme A, monitorujeme logickou matici A>=0 a spouštímeskript ex2:>> A =[1 4; -9 1]; A >=0 , ex2Obsah59. strana ze 309◭ ◭ ◮ ◮◭◮ans =1 10 1A neni nezaporne>> A =[1 4; 9 1]; A >=0 , ex2ans =Zavřít dokumentCelá obrazovka ⧸︀ Okno


601 11 11 23 12.7.2. Výhybkový blok (switch-case-otherwise)Někdy je vhodnější použít poněkud speciálnější konstrukci switch-case-otherwise-end, kdyběh <strong>pro</strong>gramu pokračuje za návěstím case odpovídajícím hodnotě řídící <strong>pro</strong>měnné a přednásledujícím návěstím case vyskočí ven z bloku switch až za end. Kód za návěstím otherwiseje použit tehdy, když hodnotě řídící <strong>pro</strong>měnné neodpovídá žádné návěstí case.switch varcase 1disp (’var is 1’)case {2 ,3 ,4}disp (’var is 2 or 3 or 4’)case 5disp (’var is 5’)otherwisedisp (’var is something else ’)endObsah60. strana ze 309◭ ◭ ◮ ◮◭◮Po uložení do souboru ex3.m měníme x a spouštíme skript ex2:>> x =1; ex3x is 1>> x =3; ex3Zavřít dokumentCelá obrazovka ⧸︀ Okno


61x is 2 or 3 or 4>> x =5; ex3x is 5>> x =9; ex3x is something elseTento příklad by se dal ekvivalentně, ale méně čitelně napsat pomocí if-elseif-else-end:if x ==1disp (’x is 1’)elseif x ==2 || x ==3 || x ==4disp (’x is 2 or 3 or 4’)elseif x ==5disp (’x is 5’)elsedisp (’x is something else ’)end2.7.3. Cyklus s podmínkou (while)Když běh <strong>pro</strong>gramu dorazí do bloku while-end, vyhodnotí podmínku. Pokud není splněna,skočí za end, jinak pokračuje dalším řádkem až po příslušný end, načež skočí zpět na whilea příběh se opakuje, a tak kód iteruje.n = 1;while <strong>pro</strong>d (1: n) < 1 e10n = n + 1;enddisp (n -1) ;Uvedený kód vypíše 13. Proč?Obsah61. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


622.7.4. Cyklus se známým počtem iterací (for)O<strong>pro</strong>ti while se cyklus for používá tehdy, když je již před vstupem do smyčky znám početiterací. Zpravidla se používá <strong>pro</strong> iterování nad polem. Sleduje se hodnota iterační <strong>pro</strong>měnné,která se při každém průchodu zvyšuje nebo snižuje o konstantu (zpravidla 1). Colon operatorzde nevytváří nový vektor, ale určuje, v jakém rozmezí půjde iterační <strong>pro</strong>měnná.x= zeros (1 ,6) ;x (1) =1;for i =2: length (x)x(i) =2* x(i -1) ;endxUvedený kód vypíše hodnoty 1 2 4 8 16 32.Poznamejme, že cykly lze libovolně vnořovat jako zde:A =[];m =3; n =2;A= zeros (3 ,2) ;for i =1: mfor j =1: nA(i,j)=i^j;endendObsah62. strana ze 309◭ ◭ ◮ ◮◭◮Také např. v těle cyklu for může být cyklus while a naopak, může zde být libovolné větvení,zkrátka libovolný kód...Zavřít dokumentCelá obrazovka ⧸︀ Okno


632.7.5. Přerušení cyklu (break, continue)Příkazy break a continue slouží k řízení cyklu zevnitř. Příkaz break úplně přerušuje smyčkua přesměruje běh <strong>pro</strong>gramu až za end ukončující cyklus. Příkaz continue ukončuje aktuálníiteraci a přesměruje běh <strong>pro</strong>gramu zpět na while nebo for.A =[0 1 2 3 2 1 2 3 4 5 1];% Pokud je soucet prvku j- teho sloupce mensi nez 3,% pak se tento soucet nevytisknedisp (’smycka 1’);for j=As= sum (j);% Je -li splneno , preskoc nasledujici prikazy% a jdi na dalsi sloupecif s


64smycka 20122.8. FunkceFunkce se odlišují od skriptů tím, že akceptují vstupní argumenty (žádný, jeden nebo více)a vracejí výstupní argumenty (žádný, jeden nebo více).2.8.1. Základní struktura funkceOtevřeme okno editoru stejně jako v případě psaní skriptu (viz 2.5) a můžeme do něj vepsattuto základní strukturu funkce:function [ vystup1 , vystup2 ] = nazevFunkce ( vstup1 , vstup2 )% NAZEVFUNKCE strucny popis (H1)% Podrobna napoveda k funkci ...% ...%% See also jinaFunkce1 , jinaFunkce2 , ...Obsah64. strana ze 309◭ ◭ ◮ ◮◭◮endLze také použít nabídku File > New > Function, v tomto případě dostaneme předpřipravenétělo funkce. Můžeme ji uložit do souboru nazevFunkce.m.Zavřít dokumentCelá obrazovka ⧸︀ Okno


65Řádek 1 obsahuje signaturu funkce. Tento řádek je nejdůležitější, <strong>pro</strong>tože zde stanovujemenázev funkce a její vstupní a výstupní argumenty. Název funkce musí být stejný jakoje název daného M-souboru. Do kulatých závorek za název funkce uvádíme vstupní argumentyoddělené čárkami. Výstupní argumenty uvádíme do hranatých závorek před znakrovnítka a název funkce. Pro jeden nebo žádný argument můžeme použít zjednodušenýzápis deklarace:function funkce1 % zadne argumentyfunction funkce2 ( vstup ) % pouze jeden vstupni argumentfunction vystup = funkce3 % pouze jeden vystupni argumentVraťme se k prvnímu výpisu. Řádky 2 až 6 jsou komentáře, které ale Matlab interpretujespeciálně. Řádek 2, takzvaný H1, obsahuje název funkce (podle konvencí velkými písmeny)a jednořádkový popis funkce. Tento řádek je zobrazen, pokud voláme help nad celým adresářem1 nebo při použití funkce lookfor, která <strong>pro</strong>hledává všechny M-soubory v Matlabemsledovaných adresářích 2 :>> help ( pwd ) % pwd vraci aktuani adresarContents of hap014 :Obsah65. strana ze 309◭ ◭ ◮ ◮◭◮nazevFunkce - strucny popis (H1)>> lookfor nazevFunkcenazevFunkce - strucny popis (H1)Řádky 3 až 6 obsahují podrobný popis funkce, zpravidla se uvádí různé možnosti volánífunkce, příklady použití apod. Za výrazem "See also" se uvádějí názvy souvisejících funkcí,1 Místo pwd můžeme použít libovolnou adresářovu cestu, vypíší se funkce v daném adresáři2 tzn. aktuální adresář pwd a adresáře, které vypisuje path, viz help pathZavřít dokumentCelá obrazovka ⧸︀ Okno


66Matlab je automaticky zobrazuje jako hypertextové odkazy, pokud jsou to <strong>pro</strong> něj viditelnéfunkce. Dobrým příkladem podrobně napsané nápovědy je např. help rand. V případě našíprvní funkce uvidíme toto:>> help nazevFunkceNAZEVFUNKCE strucny popis (H1)Podrobna napoveda k funkci ......See also jinaFunkce1 , jinaFunkce2 , ...Řádky pod úvodním komentářem (7 a dále) tvoří tělo funkce, v tuto chvíli je prázdné,takže naše funkce nic nedělá:>> nazevFunkce (1 ,2)>>Kíčové slovo end na konci funkce není povinné, pokud v daném M-souboru uvádíme pouzejednu funkci.2.8.2. Volání funkcePojďme si nyní napsat trochu rozumnější funkci, která spočítá základní statistiky souborudat x uloženého jako vektor. Můžeme použít předchozí funkci jako šablonu.function [ mean_x , min_x , max_x , mode_x , med_x ] = statistics (x)% STATISTICS zakladni statistiky vstupniho vektoru x% [ mean_x , min_x , max_x , mode_x , med_x ] = STATISTICS (x) vraci% zakladni statistiky spoctene z ciselnych dat ulozenych% ve vstupnim vektoru x:% mean_x - stredni hodnotaObsah66. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


67% min_x - minimum% max_x - maximum% mode_x - modus% med_x - median%% See also mean , std , var , min , max , mode , median% Spocti zakladni statistikymean_x = mean (x);min_x = min (x);max_x = max (x);mode_x = mode (x);med_x = median (x);Nyní zkusme funkci zavolat:>> compute_statistics??? Input argument "x" is undefined .Error in == > compute_statistics at 19mean_x = mean (x); std_x = std (x); var_x = var (x);Obsah67. strana ze 309◭ ◭ ◮ ◮◭◮Matlab hlásí chybu, <strong>pro</strong>tože jsme nespecifikovali vstupní argument x. Tak jej zadejme:>> x = [1 2 2 3 3 3];>> compute_statistics (x)ans =2.3333Zavřít dokumentCelá obrazovka ⧸︀ Okno


68Nespecifikovali jsme výstupní argumenty, Matlab automaticky vrátil hodnotu prvního, tedymeanx, uloženou ve speciální <strong>pro</strong>měnné ans. Pokud chceme získat hodnoty všech výstupníchargumentů, musíme si o to explicitně říci. Stačí vykopírovat deklaraci bez klíčového slovafunction:>> [ mean_x , min_x , max_x , mode_x , med_x ] = statistics (x)mean_x =min_x =2.33331max_x =3mode_x =Obsah68. strana ze 309◭ ◭ ◮ ◮◭◮3med_x =2.5000Všimněme si, že hranaté závorky v tomto případě neznamenají vektor, ale seznam samostatných<strong>pro</strong>měnných.Zavřít dokumentCelá obrazovka ⧸︀ Okno


69Kapitola 3Načítaní a ukládání dat v MatlabuObsahMatlab umí načítat řadu formátů. Ať se už jedná o soubory textové, binární, excelovské,grafické, či zvukové. Nejčastěji se načítají textové a binární soubory. Nejjednodušší cestou,jak do Matlabu načíst externí data z disku, je použití průvodce <strong>pro</strong> import. Průvodceumožní uživateli najít potřebná data a definovat <strong>pro</strong>měnné <strong>pro</strong> použití v pracovním <strong>pro</strong>storuMatlabu.Průvodce importem spustíme následujícím postupem:69. strana ze 309◭ ◭ ◮ ◮◭◮∙ přes hlavní menu File>Import Data∙ dvojklikem na soubor v aktuální složce v adresářovém stromu Matlabu∙ voláním funkce uiimportPokud nechceme využít průvodce <strong>pro</strong> import dat, můžeme použít funkci importdata.Zavřít dokumentCelá obrazovka ⧸︀ Okno


703.1. Import/Export souboru MATMat soubor je binárním souborem, který obsahuje data z pracovního <strong>pro</strong>středí Matlabu.Načíst soubor můžeme pomocí příkazu load(’filename.mat’). Pokud soubor obsahujevíce dat, můžeme načíst pouze několik <strong>pro</strong>měnných. Pokud tedy soubor obsahuje více <strong>pro</strong>měnných,a uživatel chce načíst například pouze <strong>pro</strong>měnnou X, příkaz load se použije taktoload(’filename.mat’,’X’). Pro výpis <strong>pro</strong>měnných, které daný soubor obsahuje bez jejichnačtení, můžeme použít příkaz whos -file filename.mat . Výstup tohoto příkazu jepotom následující:whos -file data.matName Size Bytes Class AttributesX 720x540x3 1166400 uint8a 1x1 8 doubleb 1x4 32 doubleinfo 1x1 1890 structObsah70. strana ze 309◭ ◭ ◮ ◮◭◮Pro export dat z pracovního <strong>pro</strong>středí můžeme využít příkazu save. Jeho použití jeobdobné jako u příkazu load. Všechny položky vytvořené v Matlabu se uloží do souborufilename.mat. save(’filename.mat’) Pokud chceme uložit pouze několik položek, je opětnutné příkaz modifikovat zapsáním jmen daných veličin. save(’filename.mat’,’X’)A = [1 2 3 4; 6 7 8 9];v = [9 12 -6 3.4 -65.21];I = eye (4) ;O = ones (2) ;Z = zeros (3) ;Zavřít dokumentCelá obrazovka ⧸︀ Okno


71z1 = ’ matlab ’;z2 = ’ <strong>pro</strong>gram ’;z3 = ’je ’;z4 = ’Dnes je ctvrtek a spatne pocasi !’;% ulozeni a nacteni objektu v pracovnim <strong>pro</strong>storusave moje . mat ; % Ulozi vsechny objekty do souborusave A. txt A -ASCII ; % Textovesave A. mat A; % Binarneload moje . mat ; % Nacte vsechny objekty ze souboruload A. txt ; % Textoveload A. mat ; % Binarne3.2. Import textových souborůPro otevření binárního souboru nám slouží funkce fopen, která má jako parametr jménosouboru, který chceme otevřít a vrací identifikátor, na který se dále odkazujeme napříkladpři čtení ze souboru nebo při uzavírání souboru. (fid = fopen(filename)) Pokud se nepodařísoubor otevřít, identifikátor je roven -1. Pro načtení binárních dat ze souboru sepoužívá funkce fread. Této funkci dáváme jako argument identifikátor, který nám vrátilafunkce fopen. Načtená data se ukládájí do matice (A = fread(fid)). Tento příklad by byl<strong>pro</strong> načtení celého souboru do matice A. V některých případech potřebujeme načíst jenomurčitou část a k tomu použijeme další parametr SIZE (A = fread(fid,size)), kde sizemůže být číslo N. Pro načtení N položek ze sloupcového vektoru, nebo inf <strong>pro</strong> čtení dat aždo konce souboru, nebo [M,N] <strong>pro</strong> načtení matice položek o rozměrech M x N. Pro zápisdo binárního souboru se nejčasteji používá funkce fwrite, která má dva parametry. Prvníje fid neboli identifikátor na konkrétní soubor, který jsme si otevřeli a druhý parametr jeObsah71. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


72to, co chceme do souboru zapsat. Tato funkce vrací počet elementů, které byly úspěšne zapsánydo souboru. Funkce fprintf zapisuje data do souboru ve zvoleném formátu. (COUNT =fprintf(fid,format,A,...)), kde fid je opět identifikátor otevřeného souboru, format jezvolený formát, jakým se má do souboru zapisovat, A je <strong>pro</strong>měnná (matice), která se má zapsat.Tři tečky říkají, že můžeme současně zapsat více <strong>pro</strong>měnných. count je počet úspěšnězapsaných baitů. Když se zapíší formátované data do souboru, musíme je také zpět načíst.K tomu slouží funkce fscanf. ([A,COUNT] = fscan(fid,format,size)), fid je identifikátorsouboru, format je formát v jakém se má načítat, size je stejně jako u funkce freadparametr, který říká kolik toho chceme načíst. Výstupní parametr A je matice, do kterénačítáme a COUNT je počet elementů, které jsme načetli. Funkce fgets čte řádek ze souborua nechává v něm znak nového řádku narozdíl od funkce fgetl. Pokud nastala chyba připráci se souborem, můžeme si ji zjistit pomocí funkce ferror. (MESSAGE = ferror(fid)),kde fid je identifikátor souboru.Pro práci s textovými soubory nejvíce používáme funkce dlmread, dlmwrite, textscan.Funkce dlmread čte numerická data ze ASCII souboru. Parametrem je přímo jméno souboru.(např. A = dlmread(’filename.txt’,”,range)) Načte obsah souboru’filename.txt’ s oddělovačem nt (tabulátor) do matice A v zadaném rozsahu, kde v rangezadáváme levý horní a pravý dolní roh v datech. (např. range = [1 0 12 10]) Funkcedlmwrite zapisuje textový soubor s definovaným oddělovačem. (např.A = dlmwrite(’filename.txt’,matice,’,’)) Zapíše <strong>pro</strong>měnnou matice do sourborufilename.txt, ve kterém jsou jednotlivé prvky odděleny čárkou. Funkce textscan čte formátovanédata nebo řetězec.C = textscan(fid,’format’)), kde fid je identifikátor otevřeného souboru, format jeformát načítaného souboru a C je pole buněk. Pokud chceme načítat a zapisovat ASCIIdata oddělených čárkou, mužeme použít funkce csvread a csvwrite.Obsah72. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


73fid1 = fopen (’soubor1 . dat ’,’w’);if fid1 == -1message = ferror ( fid1 );disp ( message );elsecount = fwrite (fid1 , A);count = fwrite (fid1 , v);count = fwrite (fid1 , z4);fclose ( fid1 );end% nacteni binarniho souborufid2 = fopen (’soubor1 . dat ’, ’r’);if fid2 == -1message = ferror ( fid2 );disp ( message )elseAA = fread (fid2 ,[2 ,4]) ;fclose ( fid2 );end% vytvoreni textoveho souborufid3 = fopen (’soubor2 . txt ’,’wt ’);if fid3 == -1message = ferror ( fid3 );disp ( message );elsex = 0:.1:1;y = [x; exp (x)]’;fprintf (fid3 ,’Exponential Function \n\n’);fprintf (fid3 ,’%10.3 f %10.5 f\n’, y);status = fclose ( fid3 );endObsah73. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


74% nacteni textoveho souborufid4 = fopen (’soubor2 . txt ’,’rt ’);title = fgetl ( fid4 );[ table , count ] = fscanf (fid4 ,’%f’ ,[11 2]) ;status = fclose ( fid4 );Pro načítání xls souboru z MS Excel se používá funkce xlsread. (např.A = xlsread(’filename.xls’,’list2’,’A5:E5’)). Data se načtou v rozsahu buněk A2až E5 z listu2 ze souboru filename.xls.3.3. Import obrázkůPři načítání obrázku si můžeme zvolit z mnoha formátu. Matlab zpracovává tři typy rastrovýchobrazů:∙ indexované (vztah mezi údaji v matici obrazu - indexy a barevnou škálou). Pokud jematice obrazu třídy double, odpovídá první bod této matice prvnímu řádku barevnéškály. Jsou-li data třídy uint8, nebo uint16, odpovídá první bod matice obrazu druhéhořádku škály, druhý bod třetímu, atd. Je zde posunutí o 1.Obsah74. strana ze 309◭ ◭ ◮ ◮◭◮∙ ve škále šedi (intensity images) každý prvek datové matice odpovídá jednomu pixeluv obraze, data mohou být ve tříde double, uint8 a uint16.∙ RGB (truecolor), barva 1 pixelu se skládá ze tří barev červené, zelené a modré. Nejvyššíhodnota, jakou můžeme každé barvě nastavit, je 1 a nejnižší 0 při reprezentaci doublea 0 až 255 při reprezentaci uint8. Podle toho, jaké kombinace hodnot u jednotlivýchbarev použijeme, dostaneme výslednou barvu.Zavřít dokumentCelá obrazovka ⧸︀ Okno


75Pro čtení rastrových obrázku většinou používáme tyto funkce: imread, image,imfinfo. Jednou z možností načtení obrázku je funkce imread, která má parametry FI-LENAME a FMT, kde FILENAME je jméno souboru v apostrofech a FMT je text, kterýspecifikuje formát načítaného souboru. Tato funkce nám vrací matici, která má rozměrypodle obrázku a zvoleného formátu, napříkladrgb = imread(’filename.jpg’,’jpg’). Funkce imread podporuje tyto formáty obrázku:JPEG(Joint Photographic Experts Group), TIFF(Tagged Image File Format), GIF(GraphicsInterchange Format), BMP(Windows Bitmap), PNG(Portable Network Graphics), CUR(CursorFile), HDF(Hierarchical Data Format) atd. viz. help Matlabu.Pro získání informací o grafickém souboru lze použít příkaz imfinfo. Tento příkaz vracístrukturu obsahující informace o obrázku, které jsou uloženy v souboru na disku. Například<strong>pro</strong> obrázek pejsek.jpg získáme informace o tomto souboru zadáníminfo = imfinfo(’pejsek.jpg’). Potom struktura info obsahuje následující informace:info =Filename : ’ pejsek . jpg ’FileModDate : ’16 -8 -2011 09:29:09 ’FileSize : 130123Format : ’jpg ’FormatVersion : ’’Width : 540Height : 720BitDepth : 24ColorType : ’ truecolor ’FormatSignature : ’’NumberOfSamples : 3CodingMethod : ’ Huffman ’CodingProcess : ’ Sequential ’Comment : {}Obsah75. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


76Pro načtení tohoto obrázku můžeme použít příkazpejsek = imread (\ textcolor { string }{ ’ pejsek . jpg ’} ,\ textcolor { string }{ ’jpg ’})V pracovním <strong>pro</strong>storu Matlabu se nám objeví trojrozměrné pole pejsek. Pro zobrazenínačteného obrázku použijeme příkaz image(pejsek) (obr. (3.1)). Správné zobrazenípoměrů stran zajistíme pomocí příkazuaxis equal.100Obsah20030040076. strana ze 309◭ ◭ ◮ ◮◭◮5006007000 100 200 300 400 500Obr. 3.1Výstup příkazu image(pejsek)Zavřít dokumentCelá obrazovka ⧸︀ Okno


773.4. Import zvukových a video souborůMatlab umí pracovat i s multimediálními soubory jako je video a audio signál. Audio signálje v souboru reprezentován jako série vzorků zachycující amplitudu zvuku v čase. Vzorkovacífrekvence je počet samostatných vzorků za vteřinu v Hertzech. Přesnost vzorků je závislá nabitové hloubce, to jest na počtu bitů na vzorek, což je dáno dostupným hardware. Funkcev Matlabu používají <strong>pro</strong> čtení a ukládání mono signálu jeden sloupcový vektor a <strong>pro</strong> stereosignál dva vektory uložené v jedné matici. Pro stereo signál obsahuje první sloupec levýkanál a druhý sloupec pravý kanál. Audio soubor můžeme do Matlabu načíst přes menuFile>Data Import, nebo například <strong>pro</strong> načtení souboru s koncovkou WAV můžeme použítpříkaz wavread. Tento příkaz má jeden vstup FILENAME a dva výstupy Y, Fs, kde Y jesignál a Fs je vzorkovací frekvence. Příklad použití příkazu:[ shortWave Fs] = wavread (\ textcolor { string }{ ’ shortWave . wav ’})Pro přehrání zvukové stopy je potřeba vytvořit objekt audioplayeru Matlabu a následněpřehrát tento objekt příkazem play.ShortWave_Object = audioplayer ( ShortWave , Fs);play ( ShortWave_Object )Obsah77. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


780.80.60.40.20−0.2−0.4−0.6−0.80 1 2 3 4 5 6 7 8x 10 4Obr. 3.2Zobrazení signálu ShortWaveZvukovou stopu si můžete poslechnout zde:Obsah78. strana ze 309◭ ◭ ◮ ◮◭◮Stejně jako u obrázků, je i u audia a videa možné zobrazit informace od daném multimediálnímsouboru.info = mmfileinfo (\ textcolor { string }{ ’ shortWave . wav ’});info =Filename : ’ shortWave . wav ’Zavřít dokumentCelá obrazovka ⧸︀ Okno


79Path : ’d:\ textbackslash {} LA\ textbackslash {} Audio \ textbackslash {}Radio ’Duration : 6.5976Audio : [1 x1 struct ]Video : [1 x1 struct ]info . Audio =Format : ’PCM ’NumberOfChannels : 1Pro import videa ze souboru můžeme opět využít načítání přes menu File>Data Import,nebo přes příkazovou řádku, kde je nutné vytvořit multimediální objekt pomocí příkazummreader, a dále načtení videa <strong>pro</strong>běhne pomocí příkazu read. Informace o videu lze vyvolatpomocí příkazu get s argumentem multimediálního objektu.vidObject = mmreader (\ textcolor { string }{ ’video . avi ’});vidFrames = read ( vidObject );info = get ( vidObject )info =Duration : 0.6250Name : ’ spring . avi ’Path : ’d:\ textbackslash {} LA\ textbackslash {} Video ’Tag : ’’Type : ’ mmreader ’UserData : []BitsPerPixel : 24FrameRate : 24.0000Height : 688NumberOfFrames : 15VideoFormat : ’RGB24 ’Obsah79. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


80Width : 8043.5. CvičeníTextový soubor mpdata.dat obsahuje dva materiálové modely. První obsahuje veličiny EX,PRXY, DENS a druhý obsahuje KXX,C. První dvě konstanty prvního materiálového modelujsou definovány <strong>pro</strong> dvě odlišné teploty. Navrhněte strukturu MaterialModels a naplňteji z textového souboru.Vypis souboru mpdata . dat :MPTEMPMPTEMP , 1, 0.2000000 E+02 , 0.5000000 E+03 ,MPDATA ,EX , 1, 1, 0.2100000 E+06 , 0.1900000 E+06 ,MPTEMPMPTEMP , 1, 0.0000000 E+00 ,MPDATA ,DENS , 1, 1, 0.7850000 E -08 ,MPTEMPMPTEMP , 1, 0.2000000 E+02 , 0.5000000 E+03 ,MPDATA ,PRXY , 1, 1, 0.3000000 E+00 , 0.3200000 E+00 ,MPTEMPMPTEMP , 1, 0.0000000 E+00 ,MPDATA , KXX , 2, 1, 0.2000000 E+02 ,MPTEMP MPTEMP , 1, 0.0000000 E+00 ,MPDATA ,C , 2, 1, 0.3000000 E+03 ,Obsah80. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


81Kapitola 4GUI v MatlabuObsahGUI (graphical user interface) je grafické zobrazení v jednom či více oknech obsahujícíkomponenty <strong>pro</strong> interaktivní obsluhu a řízení <strong>pro</strong>gramu. GUI může obsahovat komponentyrůzných typů, jako jsou menu, ikony, tlačítka, list boxy, editovatelné texty nebo mohouumožňovat zobrazování dat v podobě tabulek a obrázků. Následující obrázek ukazuje jednoduchéGUI, které obsahuje komponenty:81. strana ze 309◭ ◭ ◮ ◮◭◮∙ axes <strong>pro</strong> zobrazení grafu∙ pop-up menu, které umožňuje měnit příkazy matlabu∙ statický text <strong>pro</strong> popis pop-up menu∙ tři tlačítka, která umožňují změnu zobrazení grafuZavřít dokumentCelá obrazovka ⧸︀ Okno


82Obr. 4.1Jednoduché GUIToto GUI funguje tak, že uživatel vybere příkaz z pop-up menu.Každá komponenta, i GUI samotné, má jednu nebo více rutin (spustitelných kódůMatlabu), kterým se říká tzv. callback funkce, které žádají Matlab o <strong>pro</strong>vedení příslušnéakce. Vyvolání definované callback funkce <strong>pro</strong>běhne vždy po určité akci <strong>pro</strong>vedené uživatelem,například stiskem tlačítka na obrazovce, zadáním řetězce, nebo výběrem položkyz nabídky. GUI poté reaguje na uživatelcké akce.Obsah82. strana ze 309◭ ◭ ◮ ◮◭◮AnimaceNázorná ukázka tvorby grafického zobrazení je k vidění v animaci GUI.Zavřít dokumentCelá obrazovka ⧸︀ Okno


834.1. Návrh GUIPři vytváření grafického uživatelského rozhraní je nejdůležitější jeho návrh. Než tedy začnemevytvářet GUI, je nutné rozhodnout∙ kdo bude uživatel GUI∙ co od GUI očekáváme∙ jak bude uživatel s GUI pracovat∙ jaké kompotenty bude GUI obsahovat <strong>pro</strong> splnění funkčnostiZ tohoto výčtu je patrné, že při návrhu software musíme nejdříve pochopit účel nového GUIa dále pochopit požadavky <strong>pro</strong> uživatelské ovládání aplikace.Je dobré si nejdříve GUI rozvrhnout například na papír, kde si můžeme řádně rozmysletcelkový koncept a rozmístění jednotlivých komponent. Tento postup velice urychluje postuppři následném vytváření GUI.Po z<strong>pro</strong>voznění uživatelského rozhraní je nutné jej o<strong>test</strong>ovat <strong>pro</strong> ujištění, že se chováv reálných podmínkách tak jak bylo zamýšleno. Testování je dobré svěřit jiné osobě než jejeho tvůrce, vzhledem ke snadnějšímu odhalení chyb (volí například jiné cesty ovládání nežbyly zamýšleny tvůrcem).Obsah83. strana ze 309◭ ◭ ◮ ◮◭◮4.2. Tvorba GUIMatlab GUI je okno, které obsahuje ovládací prvky, jejichž rozmístění si můžeme zvolit.Pomocí callback funkcí můžete ovládat jednotlivé komponenty a řídit tak chování úživatelepři používání software.Zavřít dokumentCelá obrazovka ⧸︀ Okno


84GUI v Matlabu můžeme vytvořit dvěma způsoby:∙ s použitím GUIDE (GUI Development Environment)∙ vytvořením souboru obsahující kód tvořící GUIPrvní přístup s použitím GUI Development Environment umožňuje uživateli Matlabu vytvořitgrafický návrh GUI pomocí nástroje implementovaného v Matlabu.Obsah84. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


85Obsah85. strana ze 309◭ ◭ ◮ ◮◭◮Obr. 4.2GUI Development EnvironmentGUIDE při spuštění vytvoří okno NameGUI.fig, ve kterém lze velice snadno pomocí dostupnýchikon sestavit potřebný návrh GUI. Lze zde vkládat jednotlivé komponenty a nastavovatjim pomocí okna Inspector jejich atributy. Lze jednoduše seřazovat, zarovnávatjednotlivá tlačítka, vytvářet oddělené panely nebo vytvářet menu. Po uložení návrhu GUIse vytvoří dva soubory NameGUI.fig a NameGUI.m. První obsahuje okno s rozvržením po-Zavřít dokumentCelá obrazovka ⧸︀ Okno


86lohy jednotlivých komponent, druhý je řídícím kódem <strong>pro</strong> GUI. S použitím GUIDE lze potésnadno GUI oživit přidáním potřebných callback funkcí.GUI lze ovšem vytvořit i přímo pomocí přímého na<strong>pro</strong>gramování. Lze tedy napsat pouzeřídící kód GUI NameGUI.m, který bude obsahovat i vytvoření jednotlivých komponenta případnou modifikaci jejich atributů.PříkladVytvoření jednoduchého GUI <strong>pro</strong> sčítání dvou čísel s využitím GUIDE.Obsah86. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


87Obsah87. strana ze 309◭ ◭ ◮ ◮◭◮Obr. 4.3GUI <strong>pro</strong> součet dvou číselPro vytvoření GUI podle obrázku potřebujeme tři základní typy komponent a to:∙ dvě editovatelná textová okna∙ čtyři statická textová oknaZavřít dokumentCelá obrazovka ⧸︀ Okno


88∙ jedno tlačítkoZadáním příkazu guide se spustí GUIDE quick start okno, kde zvolíme Blank GUI (Default).Poté se objeví nové GUI s možností přidání jednotlivých komponent.Obsah88. strana ze 309◭ ◭ ◮ ◮◭◮Jednoduše tedy přidáme do okna GUI všechny potřebné komponenty, jak je vidět naobrázku.Dále můžeme editovat jednotlivé vlastnosti komponent. Poklikáním na jednotlivé komponentyse otevře Property Inspector, kde můžeme změnit jednotlivé atributy příslušejícídané komponentě. Například <strong>pro</strong> naše GUI potřebujeme změnit parametr String ze StaticText na + .Zavřít dokumentCelá obrazovka ⧸︀ Okno


89Dále můžeme změnit například velikost písma.ObsahStejným postupem změníme jednotlivé atributy u následujících statických textů a tozměnou na = a na nadpis Moje GUI. Poslední statický text bude vracet hodnotu součtu,<strong>pro</strong>to jeho atribut String nastavíme na 0. Dále nastavíme jeho Tag, což je vlastně názevkomponenty. Nastavíme tedy jméno komponenty na Odpoved.89. strana ze 309◭ ◭ ◮ ◮◭◮Nastavíme tedy jméno komponenty na Odpoved.Zavřít dokumentCelá obrazovka ⧸︀ Okno


90Nyní by náš návrh gui měl vypadat následovněObsah90. strana ze 309◭ ◭ ◮ ◮◭◮Dalším krokem bude nastavení atributů String a Tag <strong>pro</strong> editovatelné textové pole. Jakojméno komponenty <strong>pro</strong> první cifru v součtu zvolíme např. cislo_1 a String nastavíme na0. Obdobně nastavíme Tag <strong>pro</strong> druhé editovatelné pole na cislo_2.Zavřít dokumentCelá obrazovka ⧸︀ Okno


91Poslední komponentou <strong>pro</strong> editaci atributů je komponenta klikacího tlačítka, kde změníměString např. na Soucet.Obsah91. strana ze 309◭ ◭ ◮ ◮◭◮Po vhodném uspořádání jednotlivých komponent by okno gui mělo vypadat jako nanásledujícím obrázku.Zavřít dokumentCelá obrazovka ⧸︀ Okno


92ObsahNyní můžeme GUI uložit. Při ukládání se vytvoří dva soubory: moje_gui.fig a moje_gui.m.První ze souborů obsahuje okno právě vytvořeného GUI a druhý soubor obsahuje řídící kódGUI, který je uveden níže.function varargout = moje_gui ( varargin )% MOJE_GUI M- file for moje_gui . fig% MOJE_GUI , by itself , creates a new MOJE_GUI or raises the existing }% singleton *.%% H = MOJE_GUI returns the handle to a new MOJE_GUI or the handle to% the existing singleton *.%% MOJE_GUI (’ CALLBACK ’, hObject , eventData , handles ,...) calls the local% function named CALLBACK in MOJE_GUI .M with the given input92. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


93arguments .%% MOJE_GUI (’ Property ’,’ Value ’ ,...) creates a new MOJE_GUI or raisesthe% existing singleton *. Starting from the left , <strong>pro</strong>perty value pairsare% applied to the GUI before moje_gui_OpeningFcn gets called . An% unrecognized <strong>pro</strong>perty name or invalid value makes <strong>pro</strong>pertyapplication% stop . All inputs are passed to moje_gui_OpeningFcn via varargin .%% * See GUI Options on GUIDE ’s Tools menu . Choose " GUI allows onlyone% instance to run ( singleton )".%% See also : GUIDE , GUIDATA , GUIHANDLES% Edit the above text to modify the response to help moje_gui% Last Modified by GUIDE v2 .5 09 - Sep -2011 00:50:36}% Begin initialization code - DO NOT EDITgui_Singleton = 1; gui_State = struct (’gui_Name ’,mfilename ,...’ gui_Singleton ’, gui_Singleton ,...’ gui_OpeningFcn ’, @moje_gui_OpeningFcn ,...’ gui_OutputFcn ’, @moje_gui_OutputFcn ,...’ gui_LayoutFcn ’, [] , ...’ gui_Callback ’, []) ;if nargin && ischar ( varargin {1})gui_State . gui_Callback = str2func ( varargin {1}) ;endObsah93. strana ze 309◭ ◭ ◮ ◮◭◮ifnargout[ varargout {1: nargout }] = gui_mainfcn ( gui_State , varargin {:}) ;Zavřít dokumentCelá obrazovka ⧸︀ Okno


94elsegui_mainfcn ( gui_State , varargin {:}) ;end% End initialization code - DO NOT EDIT% --- Executes just before moje_gui is made visible .function moje_gui_OpeningFcn ( hObject , eventdata , handles , varargin )% This function has no output args , see OutputFcn .% hObject handle to figure% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data ( see GUIDATA )% varargin command line arguments to moje_gui ( see VARARGIN )% Choose default command line output for moje_guihandles . output = hObject ;% Update handles structureguidata ( hObject , handles );% UIWAIT makes moje_gui wait for user response ( see UIRESUME )% uiwait ( handles . figure1 );% --- Outputs from this function are returned to the command line .function varargout = moje_gui_OutputFcn ( hObject , eventdata , handles )% varargout cell array for returning output args ( see VARARGOUT );% hObject handle to figure% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data ( see GUIDATA )% Get default command line output from handles structurevarargout {1} = handles . output ;function cislo_1_Callback ( hObject , eventdata , handles )% hObject handle to cislo_1 ( see GCBO )% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data ( see GUIDATA )% Hints : get ( hObject ,’ String ’) returns contents of cislo_1 as text }% str2double ( get ( hObject ,’ String ’)) returns contents of cislo_1 as aObsah94. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


95double% --- Executes during object creation , after setting all <strong>pro</strong>perties .function cislo_1_CreateFcn ( hObject , eventdata , handles )% hObject handle to cislo_1 ( see GCBO )% eventdata reserved - to be defined in a future version of MATLAB% handles empty - handles not created until after all CreateFcns called% Hint : edit controls usually have a white background on Windows .% See ISPC and COMPUTER .if ispc && isequal ( get ( hObject ,’BackgroundColor ’)get (0 , ’ defaultUicontrolBackgroundColor ’))set ( hObject ,’BackgroundColor ’,’white ’);endfunction cislo_2_Callback ( hObject , eventdata , handles )% hObject handle to cislo_2 ( see GCBO )% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data ( see GUIDATA )% Hints : get ( hObject ,’ String ’) returns contents of cislo_2 as text% str2double ( get ( hObject ,’ String ’)) returns contents of cislo_2 asa double% --- Executes during object creation , after setting all <strong>pro</strong>perties .function cislo_2_CreateFcn ( hObject , eventdata , handles )% hObject handle to cislo_2 ( see GCBO )% eventdata reserved - to be defined in a future version of MATLAB% handles empty - handles not created until after all CreateFcns called% Hint : edit controls usually have a white background on Windows .% See ISPC and COMPUTER .if ispc && isequal ( get ( hObject ,’BackgroundColor ’)get (0 , ’ defaultUicontrolBackgroundColor ’))set ( hObject ,’BackgroundColor ’,’white ’);Obsah95. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


96end% --- Executes on button press in pushbutton1 .function pushbutton1_Callback ( hObject , eventdata , handles )% hObject handle to pushbutton1 ( see GCBO )% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data ( see GUIDATA )Nyní lze snadno editací jednotlivých callback funkcí vytvořit funkční GUI. Jako prvnípřidáme funkčnost editovatelným textovím polím. Takže do funkce:function cislo_1_Callback ( hObject , eventdata , handles )% hObject handle to cislo_1 ( see GCBO )% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data ( see GUIDATA )% Hints : get ( hObject ,’ String ’) returns contents of cislo_1 as text% str2double ( get ( hObject ,’ String ’)) returns contents of cislo_1 asa doublepřidáme následující řádkyvstup = str2num ( get ( hObject ,’String ’));Obsah96. strana ze 309◭ ◭ ◮ ◮◭◮if ( isempty ( vstup ))set ( hObject ,’String ’,’0’)endguidata ( hObject , handles );Tato část kódu zajišťuje správnost zadaného vstupu. Je možné zadávat pouze číselnéhodnoty. Poslední řádek aktualizuje ukazatele v GUI, neboli zachovává aktuální ukazatelevždy po volání callback funkce. Stejnou část kódu můžeme vložit i do funkce cislo_2_Callback.Zavřít dokumentCelá obrazovka ⧸︀ Okno


97Nyní budeme editovat callback funkci <strong>pro</strong> tlačítko Soucet% --- Executes on button press in pushbutton1 .function pushbutton1_Callback ( hObject , eventdata , handles )% hObject handle to pushbutton1 ( see GCBO )% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data ( see GUIDATA )přidáním kódua = get ( handles . cislo_1 ,’String ’);b = get ( handles . cislo_2 ,’String ’);SOUCET = str2num (a) + str2num (b);c = num2str ( SOUCET );set ( handles . Odpoved ,’String ’,c);guidata ( hObject , handles );První dva řádky po stisku tlačítka Soucet přiřadí string v editovatelných polích do<strong>pro</strong>měnných a, b, dále se <strong>pro</strong>vede součet těchto dvou čísel a nastaví se výsledný součet dostatického textu jako výstup pomocí příkazu set. Po uložení těchto změn, lze GUI spustitpříkazem Moje_GUI.Obsah97. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


98Kapitola 5Testové otázkyObsah98. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


995.1. Test - základy MatlabuTest (Iterační metody, metoda sítí, MKP)1. (1b.) Kterou z následujících ingrediencí sada Matlab neobsahuje?(a) <strong>pro</strong>gramovací jazyk(b) grafický editor(c) příkazový řádek(d) knihovna funkcí2. (1b.) Mezi volně šířitelné alternativy Matlabu nepatří:(a) GNU Octave(b) Freemat(c) ScilabObsah99. strana ze 309◭ ◭ ◮ ◮◭◮(d) Maple3. (1b.) Cyklus (blok) for musí být ukončen následovně:(a) end for(b) end(c) end doZavřít dokumentCelá obrazovka ⧸︀ Okno


100(d) for end4. (1b.) U výhybkového bloku se běh <strong>pro</strong>gramu dostane do části otherwise v případě, že(a) není splněna žádna podmínka v části case(b) jsou splněny všechny podmínky v části case(c) není splněna alespoň jedna podmínka v části case5. (1b.) Do cyklu for je možné(a) vnořit pouze jeden další vnitřní cyklus for(b) vnořovat další vnitřní cykly bez omezení6. (1b.) Pomocí kterého příkazu lze předčasně ukončit cyklus for?(a) stop(b) breakObsah100. strana ze 309◭ ◭ ◮ ◮◭◮(c) end7. (1b.) Jaká je návratová hodnota příkazu 2:-3:-2 ?(a) [2 0 -2](b) [2 -2]Zavřít dokumentCelá obrazovka ⧸︀ Okno


101(c) [](d) [2 -1]8. (1b.) Máme-li v pracovním <strong>pro</strong>storu matici A = [1 2 3;4 5 6],vrátí příkaz size(A(:,2:end)) hodnotu:(a) [3 1](b) [2 1](c) [2 2](d) [3 2]9. (1b.) Který z těchto příkazů skončí chybou?(a) [[1 2];[3;4]](b) [[1;2];[3;4]’]Obsah101. strana ze 309◭ ◭ ◮ ◮◭◮(c) [[1 2];[3,4]](d) [[1;2],[3;4]]10. (1b.) Který z těchto příkazů odstraní první řádek matice A?(a) A(:,1)=[];(b) A(1,:)=[];Zavřít dokumentCelá obrazovka ⧸︀ Okno


102(c) clear A(:,1);(d) []=A(:,1);11. (1b.) Jakou hodnotu má řetězec str po <strong>pro</strong>vedení následující série příkazů?str1 = ’ ABC ’; str2 = ’DEF’; str = [str1 str2 ’G’](a) ’ABCDEFG’(b) ’ ABC DEFG’(c) ’ABCD EFG’(d) ’ ABCDEFG’12. (1b.) Co vypíše příkaz fprintf(’T=%1.4K\n’, 0.321)?(a) T=%1.4K\n0.321(b) T=0.321KObsah102. strana ze 309◭ ◭ ◮ ◮◭◮(c) T=3.2100e-01K(d) T=3.2100K13. (1b.) Máme zadáno pole woman pomocí příkazůwoman(1)={’Jonah Doe’};woman{2}=’Anne Black’; příkaz disp(woman{1})potom vypíše:(a) ’Jonah Doe’Zavřít dokumentCelá obrazovka ⧸︀ Okno


103(b) {’Jonah Doe’}(c) [’Jonah Doe’](d) Jonah Doe14. (1b.) Mezi následujícími příkazy je jeden, který generuje odlišnou strukturu s nežostatní tři. Který to je?(a) s=struct(’jmeno’,’John Doe’); s=struct(’predmet’,’LAM’);(b) s=struct(’jmeno’,’John Doe’); s.predmet=’LAM’);s = struct(’jmeno’,’John Doe’); s.predmet=’LAM’;(c) s=struct(’jmeno’,’John Doe’,’predmet’,’LAM’);(d) s=struct(’jmeno’,’John Doe’); s=setfield(s,’predmet’,’LAM’);15. (1b.) Matlabovský soubor s uživatelem definovanou funkcí (resp. skriptem) má příponu:(a) txtObsah103. strana ze 309◭ ◭ ◮ ◮◭◮(b) dat(c) xls(d) m16. (1b.) Který z těchto znaků nelze použít k oddělení sloupců?Zavřít dokumentCelá obrazovka ⧸︀ Okno


104(a) středník(b) čárka(c) mezera(d) tabulátor17. (1b.) Který z těchto znaků uvozuje zadání matice po prvcích?(a) {(b) [(c) ((d) |18. (1b.) Jakým klíčovým slovem musí být uvozena funkce v Matlabu?(a) scriptObsah104. strana ze 309◭ ◭ ◮ ◮◭◮(b) function(c) fun(d) privateFunction19. (1b.) V příkazu [1 2] ? [3 4] - [3 8] nahraďte otazník jedním z uvedených operátorůtak, aby vrácená hodnota byla [0 0]:Zavřít dokumentCelá obrazovka ⧸︀ Okno


105(a) *(b) +(c) .*(d) .+20. (1b.) Který příkaz realizuje transpozici matice B?(a) B^T(b) T(B)(c) B’(d) B!<strong>21.</strong> (1b.) Příkaz [1 2 3] ~= [3 2 1] vrátí tuto hodnotu:(a) [1 0 1]Obsah105. strana ze 309◭ ◭ ◮ ◮◭◮(b) 1(c) [0 1 0](d) 022. (1b.) Pro nalezení vektoru x, který je řešením rovnice A*x=b, lze využít příkaz:(a) x = A/bZavřít dokumentCelá obrazovka ⧸︀ Okno


106(b) x = A^b(c) x = A&b(d) x = A\b23. (1b.) Pro nalezení vektoru x, který je řešením rovnice A*x=b’, kde b, je řádkový vektora A je symetrická pozitivně definitní matice, lze využít příkaz:(a) x = (b/A)’(b) x = A^b’(c) x = A&b’(d) x = A\b’24. (1b.) Mějme vektor x = [1, 1.1, 1.2, 1.3]. Který z následujících zápisů funkcey = sin x · cos x je správný?(a) y=sin(x)*cos(x)Obsah106. strana ze 309◭ ◭ ◮ ◮◭◮(b) y=sin(x).*cos(x)(c) y=sin(x)cos(x)(d) y=sin*x*cos*x25. (1b.) Návratovou hodnotou součinu [1 1].*[1 1]budeZavřít dokumentCelá obrazovka ⧸︀ Okno


107(a) výsledek [1 1](b) výsledek [2 2](c) chybová hláška v důsledku neshodujících se dimenzí26. (1b.) Návratovou hodnotou součinu[1 1].*[1;1] bude(a) výsledek 1(b) výsledek 2(c) chybová hláška v důsledku neshodujích se dimenzí27. (1b.) Pomocí kterého příkazu vypýšeme cestu aktuálně nastaveného pracovního adresáře?(a) cd(b) pwdObsah107. strana ze 309◭ ◭ ◮ ◮◭◮(c) dir(d) mkdir28. (1b.) Pomocí kterého příkazu se z aktuálního adresáře přesuneme o úroveň výše?(a) cd(b) pwdZavřít dokumentCelá obrazovka ⧸︀ Okno


108(c) dir(d) mkdirSprávně zodpovězené otázky:Získané body:Procento úspěšnosti:Obsah108. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


110(b) ke každé <strong>pro</strong>měnné v souboru jsou vypsány další informace (dimenze, velikost, typ)5. (1b.) Jaká funkce se používá <strong>pro</strong> načítání Excelovských souborů?(a) xlsread(b) xlswrite(c) xlmread(d) xlmwrite6. (1b.) Jakou funkci lze použít <strong>pro</strong> načítání rastrových obrázků?(a) imread(b) image(c) imagereadObsah110. strana ze 309◭ ◭ ◮ ◮◭◮(d) pictureread7. (1b.) Lze do Matlabu importovat zvukové soubory jako je např. wav?(a) ANO(b) NE8. (1b.) Jakou funkci lze použít <strong>pro</strong> vytvoření identifikátoru <strong>pro</strong> otevření souboru?Zavřít dokumentCelá obrazovka ⧸︀ Okno


111(a) fread(b) fopen(c) fclose(d) fwrite9. (1b.) Jak lze vytvářet GUI v Matlabu?(a) přímím <strong>pro</strong>gramováním(b) kombinací <strong>pro</strong>gramování a použití GUIDE(c) plně postačuje aplikace GUIDEObsah111. strana ze 309Správně zodpovězené otázky:Získané body:Procento úspěšnosti:◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


112Část IISoustavy rovnicObsah112. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


113Kapitola 6Obecné řešení soustav lineárníchrovnicObsah113. strana ze 3096.1. Přeurčená soustava rovnic◭ ◭ ◮ ◮◭◮Začněme motivačním příkladem.Zavřít dokumentCelá obrazovka ⧸︀ Okno


115psát^f 1 = k 1^u 1 + k 2^u 2 1^f 2 = k 1^u 2 + k 2^u 2 2.^f n = k 1^u n + k 2^u 2 n,nebo maticovou symbolikou^f = Uk, (6.2)kde(︂ )︂ T ^u1 ^uU =2 · · · ^u n^u 2 1 ^u 2 2 · · · ^u 2 .nObecně nemusí existovat žádný vektor k = (k 1 , k 2 ) T , <strong>pro</strong> který by rovnost v (6.2) platila,což lze jednoduše ukázat. Experimentátor <strong>pro</strong>vede měření <strong>pro</strong> sílu 30 N, nasledně <strong>pro</strong> 60 Na opět <strong>pro</strong> 30 N. Zjistí, že aby docílil v posledním měření stejné deformace jako v měřeníprvním, musí sílu navýšit o 0.05 N na 30.05 N. Rozdíl sil může být způsoben např. chybnýmodečítáním z použitého měřidla, nebo změnou teploty, na která tuhost pružiny také závisí.Nezávisle na příčině jsme obdrželi tři rovnice:Obsah115. strana ze 309◭ ◭ ◮ ◮◭◮měření I. k 1 2.9 + k 2 2.9 2 = 30měření II. k 1 5.6 + k 2 5.6 2 = 60měření III. k 1 2.9 + k 2 2.9 2 = 30.05,z nichž I. a III. se liší pouze pravou stranou. Proto <strong>pro</strong> vzniklou soustavu neexistuježádná dvojce k 1 , k 2 (resp. vektor k), <strong>pro</strong> kterou by byly rovnice I. a III. splněny současněZavřít dokumentCelá obrazovka ⧸︀ Okno


116(^f /∈ ImU). Zaveďme tzv. reziduum ve tvarur = ^f − Uka vektor k hledejme takový, <strong>pro</strong> který bude ||r|| minimální (konvexní funkce mající právějedno minimum).6.1.1. Řešení přeurčených soustavMetoda nejmenších čtvercůSe znalostí vlastností ||r|| zaveďme||r|| 2 = (r, r) =(︁^f, ^f)︁)︁+ (Uk, Uk) − 2(︁^f, Uk , (6.3)což je hladká konvexní funkce mající jediné minimum (shodné s min (||r||)). Minimalizací||r|| 2 obdržímek = (︀ U T U )︀ −1UT^f. (6.4)Obsah116. strana ze 309◭ ◭ ◮ ◮◭◮Mooreova-Penroseova inverzeStejné řešení dostaneme aplikací U + na vektor pravých stran, což je tzv. Mooreova-Penroseovainverze a můžeme ji spočítat pomocí SVD rozkladu (kapitola 14). Koeficienty tuhostiobdržíme zk = U +^f. (6.5)Zavřít dokumentCelá obrazovka ⧸︀ Okno


117QR rozkladV Matlabu lze úlohu vyřešit dle k = U∖^f. Pro obdélníkovou matici se vždy použije QRrozklad. Chceme-li pracovat s maticemi přímo, můžeme zapsat příkaz [Q,R]=qr(U,0). JelikožU je obdélníková, druhý argument „0“ zajistí, že matice R bude čtvercová (R má obecněshodný rozměr jako matice na vstupu) a hledaný vektor spočteme dlek = R −1 Q T ^f. (6.6)ObsahPříklad 6.1.Pružina dole pevně uchycená je na druhém konci postupně zatěžována hodnotami sil30, 60, 30.05 a 90 Newtonů a výchylky k tomu změřené jsou 2.9, 5.6, 2.9 a 8.2 milimetrů.Vypočítejte konstanty k 1 a k 2 v rovnici (6.1). Nejprve sestavíme potřebnou matici U a vektor117. strana ze 309◭ ◭ ◮ ◮◭◮^f:U =⎛⎜⎝2.9 8.415.6 31.362.9 8.418.2 67.24⎞⎟⎠ , ^f =⎛⎜⎝306030.0590Nyní stačí vybrat jeden z postupů (6.4), (6.5), (6.6) a vyřešením obdržíme hledané konstantyk 1 = 10.0489 a k 2 = 0.1138.⎞⎟⎠Zavřít dokumentCelá obrazovka ⧸︀ Okno


118Zpětným dosazením známých posuvů do (6.1) obdržíme a<strong>pro</strong>ximaci silf = Uk =⎛⎜⎝30.099259.843430.099290.0545Nakolik je navržená kubická závislost (6.1) mezi posuvem a silou platná, můžeme měřitvelikostí normy rezidua vztaženého k velikosti normy ||^f||⎞⎟⎠ .tzv. relativní chybou.100 ||r||||^f|| = 0.1715%Obsah118. strana ze 3096.2. Nedourčená soustava rovnic6.2.1. Čtvercová matice◭ ◭ ◮ ◮◭◮Uvažujme pružinu na obr. (6.2) vlevo s lineární charakteristikouf = kΔu, (6.7)kde k je tuhost pružiny (nezáporná), Δu = u b −u a je změna délky pružiny (rozdíl posunutí)a f síla přímo uměrná Δu . O<strong>pro</strong>ti předešlému příkladu k = k 1 a k 2 = 0. V bodě a je pružinauchycena (u a = 0) a v bodě b tažena silou f.Zavřít dokumentCelá obrazovka ⧸︀ Okno


119Obr. 6.2Řešení.Rovnice rovnováhy <strong>pro</strong> jednu pružinu v bodech a a b jsoua maticověk (u a − u b ) = f a = −fk (−u a + u b ) = f b = fKu = f. (6.8)Je-li pružina tažena na pravém konci silou f, na levém bude působit stejně velká síla s opačnýmznaménkem. Úkolem je spočíst a vyjádřit vektor posuvů konců pružiny. Pokud bychomchtěli soustavu vyřešit pomocí inverze matice soustavy, zjistili bychom, že to není možné,neboť její inverze neexistuje. Neexistující inverzi nahradíme Mooreovou-Penroseovou inverzí.Součtem jeho partikulárního a homogenního řešení rovnice (6.8) dostávámeObsah119. strana ze 309◭ ◭ ◮ ◮◭◮u = u p + u h . (6.9)Partikulární část spočítáme z rovniceu p = K + f, (6.10)Zavřít dokumentCelá obrazovka ⧸︀ Okno


120a homogenní zu h = Ng. (6.11)Lineární obal sloupců matice N tvoří celé jádro matice K (zde N = (1, 1) T ) a platí, žeKN = O. (6.12)Zpětným dosazením řešení u do rovnice (6.8) obdržímeK (︀ K + f + Ng )︀ = KK + f.Zde součin KK + je <strong>pro</strong>jektor na ImK (viz [1]) a jelikož f ∈ ImK, pak platíKK + f = f.Rovnice rovnováhy má v závislosti na g nekonečně mnoho řešení. Jsou-li zadány okrajovépodmínky (v našem případě je pružina pevně uchycena v bodě a, tj. u a = 0), potom sespočítá g tak, aby jim bylo vyhověno a ze všech možných řešení splňujících rovnici (6.8)vybíráme pouze jediné, <strong>pro</strong> které je posuv levého konce pružiny skutečně nulový.Příklad 6.2.Obsah120. strana ze 309◭ ◭ ◮ ◮◭◮Spočtěte deformaci pružiny na obr. 6.2 s tuhostí k = 1, která je na levém konci drženaa na pravém konci zatížena silou f = 1. Rovnice rovnováhy je(︂ )︂ (︂ )︂ (︂ )︂1 −1 ua −1= .−1 1 u b 1K výpočtu partikulárního řešení dle (6.10) vyčíslíme Mooreovou-Penroseovou inverzi maticeK a toZavřít dokumentCelá obrazovka ⧸︀ Okno


121K + = 1 4(︂ 1 −1−1 1)︂a obdržímeHomogenní řešení jeu p =(︂ −0.50.5)︂.u h = Ng, N = (1 1) Ts neznámou g ∈ R n (jelikož n = 1, potom g = g). Dosazením do (6.9) (u a = 0) píšemeObsah0 = −0.5 + gu b = 0.5 + g.Z první rovnice spočítáme, že g = 0.5 a ze druhé hledanou deformaci u b = 1.1<strong>21.</strong> strana ze 309◭ ◭ ◮ ◮◭◮6.2.2. Obdélníková maticeV kapitole 18 je odvozena rovnice rovnováhy struny.Příklad 6.3.Pro strunu délky 1 m pevně uchycenou v krajních bodech, s pěti uzly (krok sítě h = 0.25),zatíženou jednotkovou hustotou sil použitím metody sítí (kapitola ??) obdržíme soustavuZavřít dokumentCelá obrazovka ⧸︀ Okno


122rovnic 6.8 rozepsanou⎛⎝−1 2 −1 0 00 −1 2 −1 00 0 −1 2 −1⎛⎞⎠⎜⎝⎞u 1u 2u 3⎟u 4u 5⎛⎠ = 0.252 ⎝což jsou tři rovnice rovnováhy ve vnitřních uzlech struny (všechny uzly vyjma krajních).Matice soustavy je obdélníková a k výpočtu partikulárního řešení dojdeme rovnicí (6.10)111⎞⎠ ,Homogenní řešeníu p = (︀ −0.0625 0.03125 0.0625 0.03125 −0.0625 )︀ T .u h =(︂ 0 0.25 0.5 0.75 11 0.75 0.5 0.25 0)︂ T (︂g1g 2)︂s libovolým vektorem g = (g 1 , g 2 ) T v součtu s řešením partikulárním splňuje podmínkurovnováhy (6.10). Abychom vyhověli okrajovým podmínkám (u 1 = u 5 = 0), volíme g 1 == g 2 = 0.0625. Deformace struny ve všech uzlech sítě budeObsah122. strana ze 309◭ ◭ ◮ ◮◭◮u = (︀ 0, 0.09325, 0.125, 0.09325, 0 )︀ T .6.3. Příklady soustav se čtvercovou maticíV řadě technických <strong>pro</strong>blému se vyskytují matice, které jsou čtvercové.Zavřít dokumentCelá obrazovka ⧸︀ Okno


1236.3.1. Regulární matice soustavy - jediné řešení⎛⎞ ⎛1 1 1 1A = ⎜ 1 2 3 4⎟⎝ 1 3 6 10 ⎠ a b = ⎜⎝1 4 10 20V výpočtu v Matlabu použijeme zpětné lomítko a potvrdíme klávesou Enter. V příkazovéřádce by se nám mělo objevit>> x=A\bx =4321⎞⎟⎠ .5-100K výpočtu byla použita Gaussova eliminace, která je např. o<strong>pro</strong>ti způsobuObsah123. strana ze 309◭ ◭ ◮ ◮◭◮>> x= inv (A)*bve kterém se inverze skutečně spočítala, rychlejší, má nižší šíření chyb, menší nároky napaměť. Použijeme-li zpětné lomítko, Matlab na pozadí vyhodnocuje vlastnosti konkrétnímatice soustavy a k řešení použije optimální metodu (Choleského, LU, QR rozklad apod.).Zavřít dokumentCelá obrazovka ⧸︀ Okno


1246.3.2. Singularní matice soustavy - případ s nekonečně mnoho rešeními⎛ ⎞ ⎛ ⎞1 2 31A = ⎝ 3 2 1 ⎠ a b = ⎝ 1 ⎠ .4 4 42Je-li matice soustavy singulární (v této soustavě rovnic je třetí rovna součtu předešlýchdvou), zpětné lomítko vrátí hodnotu NaN. Soustavu lze vyřešit pomocí Mooreovy-Penroseovyinverze zápisemx= pinv (A)*bx =0.16670.16670.1667Uvedený způsob minimalizje normy vektorů Ax − b a x.6.3.3. Singularní matice soustavy - případ, kdy žádné přesné řešení neexistuje⎛ ⎞ ⎛ ⎞1 2 31A = ⎝ 3 2 1 ⎠ a b = ⎝ 1 ⎠ .4 4 43Matice soustavy A je singulární (shodná s maticí předešlého příkladu), ale <strong>pro</strong> prvky vektorub neplatí b 3 = b 1 + b 2 , tzn. poslední rovnice není lineární kombinací předešlých dvou.K výpočtu opět použijeme Mooreovu-Penroseovu inverziObsah124. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


125x =0.22220.22220.2222Pro další možný způsob výpočtu rozšíříme soustavu o nulový řádek⎛ ⎞ ⎛ ⎞1 2 31A = ⎜ 3 2 1⎟⎝ 4 4 4 ⎠ a b = ⎜ 1⎟⎝ 3 ⎠ ,0 0 00čímž „přinutíme“ Matlab použít QR rozklad, který minimalizuje normu Ax − b.Obsah125. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


126Kapitola 7Ukládání a práce s řídkýmimaticemiObsah126. strana ze 309V mnoha případech použití numerické matematiky se při sestavení matic obsahujících různorodýtyp dat stává, že matice obsahuje mnohem menší počet nenulových prvků než jecelkový počet prvků dané matice. Tyto matice mají tzv. malou hustotu zaplnění a mluvímeo nich jako o řídkých maticích. Při výpočtu s použitím řídkých matic je efektivnější ukládatpouze nenulové prvky dané matice. Existuje celá řada základních předpisů <strong>pro</strong> ukládánířídkých matic, ale většina z nich je založena na stejném principu. Základním principemje uložení všech nenulových prvků matice do jednorozměrného pole, jež má přístup k pomocnýmpolím, které popisují polohu umístění nenulových prvků v řídké matici. Způsobvytvoření pomocných polí pak odlišuje různé přístupy ukládání řídkých matic.Ukládání nenulových prvků řídké matice do jednorozměrného pole se <strong>pro</strong>vádí průcho-◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


127dem celé matice po jednotlivých řádcích (řádková komprese) nebo po jednotlivých sloupcích(sloupcová komprese) a postupném ukládání nenulových prvků do jednorozměrného polev pořadí daném průchodem řídké matice. Při ukládání symetrických matic je nutné ukládatpouze horní trojúhelníkovou nebo dolní trojúhelníkovou část matice. Tři základní typykomprese řídkých matic jsou uvedeny níže.Obsah127. strana ze 309nz = 5495 nz = 952Obr. 7.1Hustá vs. řídká matice◭ ◭ ◮ ◮◭◮7.1. CSR FormátV tomto odstavci je detailně popsána struktura ukládání řídké matice založená na řádkovékompresi CSR (compressed sparse row format). CSR formát je jeden ze základních typůkomprese řídkých matic. Struktura formátu CSR je dána třemi nebo čtyřmi poli:1. [hodnoty, sloupce, indexyRadku]2. [hodnoty, sloupce, ukazatelA, ukazatelB]Zavřít dokumentCelá obrazovka ⧸︀ Okno


128Následující tabulka popisuje tato pole v závislosti na prvcích řídké matice a jejich polozevzhledem k sloupcům a řádkům matice.Varianta 1hodnotysloupceReálné nebo komplexní pole obsahující nenulové prvky matice A. Jednotlivéprvky matice A jsou mapovány do pole hodnoty s použitím řádkové komprese.I-tý prvek pole čísel typu integer sloupce obsahuje číslo sloupce v matici Apříslušející I-tému prvku v poli hodnotyindexyRadku J-tý prvek pole typu integer indexyRadku vrací index prvku v poli hodnoty,který je první nenulový prvek v J-tém řádku matice ADélka pole hodnoty a sloupce je dána počtem nenulových prvků matice A. Vzhledemk tomu, že pole indexyRadku obsahuje polohu prvního nenulového prvku v řádku, a nenulovéprvky jsou uloženy za sebou, je tedy počet nenulových prvků v I-tém řádku rovenrozdílu indexyRadku (I + 1)−indexyRadku (I). Aby tento vztah platil i <strong>pro</strong> poslední řádekmatice, je nutné na konec pole indexyRadku přidat integer jehož hodnota je rovna celkovémupočtu nenulových prvků +1. Proto je délka pole indexyRadku o jedničku vyšší nežje počet řádků v matici.Obsah128. strana ze 309◭ ◭ ◮ ◮◭◮Varianta 2 První dvě pole hodnoty, sloupce, jsou shodné s variantou 1. Pole ukazatelAje shodné s polem indexyRadku, s tím rozdílem, že neobsahuje poslední hodnotu tohotopole.ukazatelA J-tý prvek pole čísel typu integer ukazatelA vrací index prvku v poli hodnotykterý je první nenulový prvek v J-tém řádku matice A.Zavřít dokumentCelá obrazovka ⧸︀ Okno


129ukazatelB pole čísel typu integer obsahující indexy řádků, a to tak, že ukazatelB(J)-ukazatelA(1)je index prvku v poli hodnoty, který je posledním nenulovým prvkemv J-tém řádku matice A.Příklad 7.1. Mějme čtvercovou matici A:⎡⎤2 −5 * −2 *−5 3 * * *A=⎢ * * 2 4 *⎥⎣ −7 * * 8 * ⎦* * 7 * −13Převedením této matice do CSR formátu dostaneme jednorozměrná pole jednoznačně popisujícířídkou matici. Pole <strong>pro</strong> variantu 1 je uvedeno v tabulce 7.1, pole <strong>pro</strong> variantu 2v tabulce 7.2.číslování od jedničkyhodnoty = [ 2 -5 -2 -5 3 2 4 -7 8 7 -13 ]sloupce = [ 1 2 4 1 2 3 4 1 4 3 5 ]indexyRadku = [ 1 4 6 8 10 12 ]číslování od nulyhodnoty = [ 2 -5 -2 -5 3 2 4 -7 8 7 -13 ]sloupce = [ 0 1 3 0 1 2 3 0 3 2 4 ]indexyRadku = [ 0 3 5 7 9 11 ]Tab. 7.1Pole <strong>pro</strong> uložení řídké matice ve formátu CSR Varianta1Obsah129. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


130číslování od jedničkyhodnoty = [ 2 -5 -2 -5 3 2 4 -7 8 7 -13 ]sloupce = [ 1 2 4 1 2 3 4 1 4 3 5 ]ukazatelA = [ 1 4 6 8 10 ]ukazatelB = [ 4 6 8 10 12 ]číslování od nulyhodnoty = [ 2 -5 -2 -5 3 2 4 -7 8 7 -13 ]sloupce = [ 0 1 3 0 1 2 3 0 3 2 4 ]ukazatelA = [ 0 3 5 7 9 ]ukazatelB = [ 3 5 7 9 11 ]Tab. 7.2Pole <strong>pro</strong> uložení řídké matice ve formátu CSR Varianta2Použití tohoto způsobu ukládání matic můžeme demonstrovat na příkladu výpočtu násobenímatice a vektoru. Násobení matice-vektor x = Ab lze pomocí CRS formátu vyjádřitjako:x i = ∑︁ ja i,j b j ,Obsah130. strana ze 309◭ ◭ ◮ ◮◭◮Potom součin matice A m×m a vektoru b je dán kódem:\ textcolor { keyword }{ for } i = 1:mx(i) = 0;\ textcolor { keyword }{ for } J = indexyRadku (i): indexyRadku (i +1) -1x(i) = x(i) + hodnoty (J)*b( sloupce (J));\ textcolor { keyword }{ end }\ textcolor { keyword }{ end }Zavřít dokumentCelá obrazovka ⧸︀ Okno


1317.2. CSC FormátCSC (compressed sparse column format) je obdobou předchozí řádkové komprese řídkýchmatic, s tím rozdílem, že <strong>pro</strong> kompresi se nepoužívají řádky ale sloupce. Pokud bychom tedypoužili formát CSR na transponovanou matici A, obdržíme sloupcovou kompresi matice A.TedyCSC(A) = CSR(A T ).Tato komprese je tedy obdobně jako v předchozím případě dána třemi nebo čtyřmi poli1. [hodnoty, radky, indexySloupcu]2. [hodnoty, radky, ukazatelA, ukazatelB]Následující tabulka popisuje tyto pole v závislosti na prvcích řídké matice a jejich polozevzhledem k sloupcům a řádkům matice.Varianta 1Obsah131. strana ze 309◭ ◭ ◮ ◮◭◮hodnotyradkyReálné nebo komplexní pole obsahující nenulové prvky matice A. Jednotlivéprvky matice A jsou mapovány do pole hodnoty s použitím sloupcové komprese.I-tý prvek pole typu integer radky obsahuje číslo řádku v matici A příslušejícíI-tému prvku v poli hodnoty.indexySloupcu J-tý prvek pole typu integer indexySloupcu vrací index prvku v poli hodnoty,který je první nenulový prvek v J-tém sloupci matice A.Zavřít dokumentCelá obrazovka ⧸︀ Okno


132Délka pole hodnoty a sloupce je opět dána počtem nenulových prvků matice A. Jakou CSR formátu, je nutné poslední pole čísel typu integer upravit podle stejného klíče.Pole indexySloupcu obsahuje polohu prvního nenulového prvku ve sloupci, nenulové prvkyjsou uloženy za sebou, počet nenulových prvků v I-tém sloupci je tedy roven rozdíluindexySloupcu (I + 1) − indexySloupcu (I). Aby tento vztah platil i <strong>pro</strong> poslední sloupcematice, je nutné na konec pole indexySloupcu přidat integer jehož hodnota je rovna počtunenulových prvků +1. Proto je délka pole indexySloupcu o jedničku vyšší než je početsloupců v matici.Varianta 2 První dvě pole hodnoty, sloupce, jsou shodné s variantou 1. Pole ukazatelAje shodné s polem indexySloupcu, s tím rozdílem, že neobsahuje poslední hodnotu tohotopole.ukazatelA J-tý prvek pole typu integer ukazatelA vrací index prvku v poli hodnoty kterýje první nenulový prvek v J-tém sloupci matice A.ukazatelB Pole typu integer obsahující indexy sloupců, a to tak, že ukazatelB(J)-ukazatelA(1)je index prvku v poli hodnoty, který je posledním nenulovým prvkemv J-tém sloupci matice A.Obsah132. strana ze 309◭ ◭ ◮ ◮◭◮Příklad 7.2. Pro čtvercovou matici A z předchozího příkladu vytvořte pole popisujícísloupcovou kompresi CSC. Převedením řídké matice do CSC formátu dostaneme jednorozměrnápole popsaná výše. Pole <strong>pro</strong> variantu 1 je uvedeno v tabulce 7.3, pole <strong>pro</strong> variantu 2v tabulce 7.4.Zavřít dokumentCelá obrazovka ⧸︀ Okno


133číslování od jedničkyhodnoty = [ 2 -5 -7 -5 3 2 7 -2 4 8 -13 ]radky = [ 1 2 4 1 2 3 5 1 3 4 5 ]indexySloupcu = [ 1 4 6 8 11 12 ]číslování od nulyhodnoty = [ 2 -5 -7 -5 3 2 7 -2 4 8 -13 ]radky = [ 0 1 3 0 1 2 4 0 2 3 4 ]indexySloupcu = [ 0 3 5 7 10 11 ]Tab. 7.3Pole <strong>pro</strong> uložení řídké matice ve formátu CSC Varianta1číslování od jedničkyhodnoty = [ 2 -5 -7 -5 3 2 7 -2 4 8 -13 ]radky = [ 1 2 4 1 2 3 5 1 3 4 5 ]ukazatelA = [ 1 4 6 8 11 ]ukazatelB = [ 4 6 8 11 12 ]číslování od nulyhodnoty = [ 2 -5 -7 -5 3 2 7 -2 4 8 -13 ]radky = [ 0 1 3 0 1 2 3 0 3 2 4 ]ukazatelA = [ 0 3 5 7 10 ]ukazatelB = [ 3 5 7 10 11 ]Obsah133. strana ze 309◭ ◭ ◮ ◮◭◮Tab. 7.4Pole <strong>pro</strong> uložení řídké matice ve formátu CSC Varianta2Zavřít dokumentCelá obrazovka ⧸︀ Okno


1347.3. Souřadnicová kompreseSouřadnicový typ ukládání řídkých matic je jedním z nejjednodušších postupů komprese.Tento typ ukládání řídkých matic je také použit v Matlabu při zadávání řídké matice.Systém ukládání matice je dán třemi poli, kde jsou uloženy pouze nenulové prvky maticea souřadnice jednotlivých prvků. Mějme tedy tři pole hodnoty, sloupce, radky, které obsahují:hodnotyradkyReálné nebo komplexní pole obsahující nenulové prvky matice A. Jednotlivéprvky matice A jsou mapovány do pole hodnoty s použitím sloupcové komprese.I-tý prvek pole typu integer radky obsahuje číslo řádku v matici A příslušejícíI-tému prvku v poli hodnotyObsahsloupceI-tý prvek pole typu integer sloupce obsahuje číslo sloupce v matici A příslušejícíI-tému prvku v poli hodnotyPříklad 7.3. Pro čtvercovou matici A z příkladu 1 vytvořte pole popisující sloupcověorientovanou souřadnicovou kompresi (pole hodnoty vytvářeno postupně po sloupcích, polesloupce je neklesající).134. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


135číslování od jedničkyhodnoty = [ 2 -5 -7 -5 3 2 7 -2 4 8 -13 ]radky = [ 1 2 4 1 2 3 5 1 3 4 5 ]sloupce = [ 1 1 1 2 2 3 3 4 4 4 5 ]číslování od nulyhodnoty = [ 2 -5 -7 -5 3 2 7 -2 4 8 -13 ]radky = [ 0 1 3 0 1 2 4 0 2 3 4 ]sloupce = [ 0 0 0 1 1 2 2 3 3 3 4 ]Tab. 7.5Pole <strong>pro</strong> uložení řídké matice v souřadnicovém formátu (CSC komprese prvků)7.4. Práce s řídkými maticemi v MatlabuMatlab nikdy nevytváří řídké matice automaticky. Uživatel musí vždy nejdříve rozhodnout,zda se vyplatí použít řídkou matici namísto matice plné. Zda použít plnou nebo řídkoumatici můžeme rozhodnout pomocí faktoru hustoty zaplnění matice. Matice s malou hustotouzaplnění 1 je dobrým kandidátem <strong>pro</strong> použití zápisu řídkého formátu. Hustota zaplněnímatice je dána jako podíl počtu nenulových prvků s celkovým počtem prvků v matici.V Matlabu se tedy hustota zaplnění matice určí jako:Obsah135. strana ze 309◭ ◭ ◮ ◮◭◮hustota = nnz (A)/ <strong>pro</strong>d ( size (A));Pro sestavení řídké matice v Matlabu je možné použít několik základních příkazů.Například jednotkovou matici vytvoříme příkazem1 každý prvek matice je reprezentován ve třech polích, <strong>pro</strong>to za „malou" hustotu zaplnění může býtpovažována hodnota < 0, 3Zavřít dokumentCelá obrazovka ⧸︀ Okno


136I =speye (m,n);kde m,n, je rozměr jednotkové matice. Diagonální matici vytvoříme příkazemD =spdiags (B,d,m,n);Příkaz umístí j-tý sloupec z matice B(:,j) na j-tou diagonálu d (za nultou je považovánahlavní diagonála) v matici o rozměrech m,n. Mějme matici⎡A= ⎣2 −1 0−1 2 −10 −1 2Diagonální řídkou matici vyskládáme pomocí následujícího kódu:n = 3;b = ones (n ,1) ;B = [-b 2*b -b];D = spdiags (B , -1:1 ,n,n);⎤⎦ .Obsah136. strana ze 309◭ ◭ ◮ ◮◭◮Řídkou matici s náhodnými prvky s rovnoměrným rozložením vygenerujeme příkazemsprand(m,n,dens), kde m,n je rozměr matice a dens je hustota zaplnění matice.Existující plnou matici můžeme převést na řídkou příkazem sparse.Zavřít dokumentCelá obrazovka ⧸︀ Okno


137S =sparse (A);Řídkou matici můžeme převést na plnou příkazem full.A =full (S);Řídkou matici však můžeme sestavit přímo s použitím souřadnicového zápisu řídké matice.Mějme matici⎡A=⎢⎣2 −5 0 −2 0−5 3 0 0 00 0 2 4 0−7 0 0 8 00 0 7 0 −13Použitím příkazu sparse s 5 argumenty sparse(i,j,v,m,n), kde i,j,v jsou vektory reprezentujícímatici v souřadnicovém zápisu (odstavec ??) v pořadí radky, sloupce, hodnotya m,n je počet řádku a sloupců matice dostaneme řídkou matici S.⎤⎥⎦ .Obsah137. strana ze 309◭ ◭ ◮ ◮◭◮i = [1 2 4 1 2 3 5 1 3 4 5];j = [1 1 1 2 2 3 3 4 4 4 5];v = [2 -5 -7 -5 3 2 7 -2 4 8 -13];m = 5; n = 5;S = sparse (i,j,v,m,n);Pro zjištění polí i,j,v existující matice lze použít příkaz find.[i,j,v] =find (S);Zavřít dokumentCelá obrazovka ⧸︀ Okno


138Příkazy <strong>pro</strong> práci s řídkými maticemiissparse(S)nnz(s)nonzeros(S)nzmax(S)spones(S)spfun(@sin,S)spy(S)určí, zda je vstupní argument řídká matice.vrátí počet nenulových prvků maticevrátí nenulové prvky maticevrátí množství paměti alokované <strong>pro</strong> nenulové prvkynahradí nenulové prvky matice jedničkamiaplikuje zadanou funkci na nenulové prvky maticezobrazení struktury řídké matice (poloha nenulových prvků)0102030405060708090100012345Obsah138. strana ze 309◭ ◭ ◮ ◮◭◮0 20 40 60 80nz = 174060 1 2 3 4 5 6nz = 11Obr. 7.2Výstup příkazu spy, spy(S,’x’,8)Zavřít dokumentCelá obrazovka ⧸︀ Okno


139Pokud používáme řídké matice, musíme mít na paměti, že ne všechny příkazy Matlabujsou použitelné <strong>pro</strong> počítání s řídkými maticemi. Například <strong>pro</strong> výpočet vlastních čísel plnématice se použije příkaz eig, ale <strong>pro</strong> výpočet vlastních čísel řídké matice musíme použítekvivalentní příkaz <strong>pro</strong> řídké matice, tedy eigs.7.5. Cvičení1. Vyskládejte efektivně řídkou matici⎡A= ⎢⎣1 0 2 0 00 1 0 0 12 0 0 2 03 1 2 0 0⎤⎥⎦ .2. Vyskládejte efektivně řídkou matici B tvořenou 6 × 8 bloky A.3. Vyskládejte efektivně řídkou matici C tvořenou 8 bloky A na diagonále.Obsah139. strana ze 309◭ ◭ ◮ ◮◭◮4. Napište funkci, která sestaví řídkou 5 diagonální matici D rozměru 10 × 10, s prvky−1, −2, 3, 2, 1 na diagonálách −2 : 2.Zavřít dokumentCelá obrazovka ⧸︀ Okno


140Kapitola 8Gaussova eliminace a LU rozkladObsahV této kapitole se budeme věnovat Gaussově eliminační metodě, která se používá k řešenísoustav lineárních rovnic. V první části si metodu stručně popíšeme a vysvětlíme její principna jednoduchém příkladě. Implementaci si pak přestavíme v kapitole společně s LUrozkladem, který můžeme chápat jako maticový zápis Gaussovy eliminace.140. strana ze 309◭ ◭ ◮ ◮◭◮Budeme se zabývat řešením soustavyAx = b, (8.1)kde A ∈ R m,n , x ∈ R n , b ∈ R m . Jedná se o soustavu m lineárních rovnic o n neznámýchZavřít dokumentCelá obrazovka ⧸︀ Okno


141x 1 , . . . , x n , kterou můžeme zapsat ve tvarua 11 x 1 + a 12 x 2 + · · · + a 1n x n = b 1a 21 x 1 + a 22 x 2 + · · · + a 2n x n = b 2.. (8.2)a m1 x 1 + a m2 x 2 + · · · + a mn x n = b m ,kde čísla a ij nazýváme koeficienty soustavy, b i pravé strany.Chceme-li tuto soustavu řešit, budeme postupovat následovně. Nejprve pomocí ekvivalentníchúprav převedeme soustavu Ax = b na soustavu ekvivalentí Ux = y s hornítrojúhelníkovou maticí U. Této fázi říkáme dopředná redukce. V druhé části tuto soustavuvyřešíme. Protože budeme postupně napočítávat jednotlivé neznámé od konce, říkáme tétofázi zpětná substituce.Definice 8.1. Ekvivalentními úpravami soustavy lineárních rovnic nazýváme následujícíúpravy:Obsah141. strana ze 309◭ ◭ ◮ ◮◭◮(E1) Vzájemná výměna libovolných dvou rovnic soustavy.(E2) Násobení obou stran některé rovnice soustavy nenulovým číslem.(E3) Přičtení nenulového násobku některé rovnice soustavy k jiné rovnici.Lemma 8.2. Jestliže soustava Ãx = ˜b vznikla ze soustavy Ax = b pomocí ekvivalentníchúprav, pak jsou soustavy Ãx = ˜b a Ax = b ekvivalentní.Zavřít dokumentCelá obrazovka ⧸︀ Okno


142Běžně se setkáme také se zápisem soustavy pomocí rozšířené matice soustavy⎛⎞a 11 a 12 . . . a 1n b 1a 21 a 22 . . . a 2n b 2(A|b) = ⎜⎟⎝ .⎠ . (8.3)a m1 a m2 . . . a mn b mKaždá rovnice je tedy reprezentovaná jedním řádkem v matici (A|b). Ekvivalentním úpravámsoustavy rovnic pak odpovídají operace s řádky rozšířené matice soustavy, které nazývámeelementární (řádkové) operace.Definice 8.3. Elementární řádkové operace rozšířené matice soustavy nazýváme následujícíoperace:(e1) Vzájemná výměna libovolných dvou řádků.(e2) Násobení některého řádku nenulovým číslem.(e3) Přičtení nenulového násobku některého řádku k jinému řádku.Obsah142. strana ze 309◭ ◭ ◮ ◮◭◮8.1. Gaussova eliminace bez pivotizaceSestavíme rozšířenou matici soustavy, kterou budeme pomocí elementárních úprav převádětna schodový tvar. Matice je ve schodovém tvaru, jestliže první nenulové prvky řádků (vedoucíprvky) jsou uspořádány jako schody, klesající zleva doprava. Navíc požadujeme, aby vedoucíprvky nebyly nad sebou a případné nulové řádky byly dole. Schéma tohoto <strong>pro</strong>cesu jeZavřít dokumentCelá obrazovka ⧸︀ Okno


143znázorněno na obrázku 8.1. Je-li matice A singulární, a nebo obdélníková, může schodovýtvar vypadat jako na obrázku 8.2.Obr. 8.1Dopředná redukce.Obsah143. strana ze 309◭ ◭ ◮ ◮◭◮Obr. 8.2Schodový tvar může vypadakt třeba takto, je-li A singulární nebo obdélníková.Matici A budeme během <strong>pro</strong>cesu eliminace zapisovat jako A j , kde index j značí, kterýsloupec byl naposledy nulován. Po (k − 1)-tém kroku eliminace můžeme matici soustavyZavřít dokumentCelá obrazovka ⧸︀ Okno


144zapsat jako⎛A k−1 =⎜⎝⎞11 . . . a k−11,k−1a k−11k. . . a k−11n.. .. . . . .. .0 . . . a k−1k−1,k−1a k−1k−1,k. . . a k−1k−1,n0 . . . 0 a k−1kk. . . a k−1.kn.. .. . . . .. ⎟ . ⎠0 . . . 0 a k−1nk. . . a k−1nna k−1Toto odpovídá matici na obrázku 8.1 u<strong>pro</strong>střed.Příklad 8.4. Řešte soustavu lineárních rovnicŘešení.⎛(A|b) = ⎝2 −1 2 −11 0 3 4−3 3 6 212x 1 − x 2 + 2x 3 = −1x 1 + 3x 3 = 4−3x 1 + 3x 2 + 6x 3 = 21−→⎛⎝⎞⎠−→r 2 − 1 2 r 1r 3 + 3 2 r 1⎛⎝2 −1 2 −10 1/2 2 9/20 0 3 62 −1 2 −10 1/2 2 9/20 3/2 9 39/2⎞⎠ = (U|y).. (8.4)⎞⎠−→r 3 − 3r 2Přepsali jsme si zadanou soustavu do rozšířené matice. V prvním kroku eliminujeme neznámév prvním sloupci. První řádek (r 1 ) zůstává nezměněn. Do r 2 zapíšeme r 2 − 1 2 r 1, abyObsah144. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


145na první pozici byla nula. Do r 3 zapíšeme součet r 3 + 3 2 r 1, opět aby na první pozici bylanula. V dalším kroku eliminujeme v druhém sloupci. Achychom na pozici 3 2získali nulu,musíme do r 3 zapsat výsledek operace r 3 − 3r 2 . Získáváme matici ve schodovém tvaru. Matici si můžeme přepsat opět jako soustavu2x 1 − x 2 + 2x 3 = −112 x 92 + 2x 3 =23x 3 = 6. (8.5)V další fázi postupně vyčíslíme jednotlivé neznámé. Začínáme od konce. Z poslední rovnicevidíme, že x 3 = 2. Výsledek dosadíme do rovnice předešlé, spočítáme x 2 . Již známé výsledkyzase dosadíme do předešlé rovnice, atd. Po dosazení do první rovnice získáme řešeníx = (−2, 1, 2) T .V následující kapitole si ukážeme implementaci Gaussovy eliminace. Využijeme k tomutzv. LU rozklad, který můžeme chápat jako maticový zápis Gaussovy eliminace, přičemžL −1 je matice transformace, která převede A na U, tj. L −1 A = U.Obsah145. strana ze 309◭ ◭ ◮ ◮◭◮8.2. LU rozkladUvažujeme regulární čtvercovou matici A ∈ R n,n , kterou chceme rozložit na horní trojúhelníkovoumatici U a dolní trojúhelníkovou matici L s jedničkami na diagonále, aby platiloA = LU.Zavřít dokumentCelá obrazovka ⧸︀ Okno


146V předchozí kapitole jsme si ukázali, jak pomocí elementárních řádkových úprav převéstmatici A na horní trojúhelníkovou matici U. Zbývá nám ukázat, jak získáme matici L.Operace <strong>pro</strong>váděné s řádky matice si budeme zapisovat do matic L k . Do k-tého sloupcejednotkové matice zapíšeme li k násobky řádků, kterými vynulujeme odpovídající pozice v k--tém sloupci matice A k−1 . Těmto prvkům říkáme multiplikátory a spočítáme je podlepředpisu (8.7). Matici L k [?] můžeme zapsat ve tvaru⎞⎛1L k = I + l k e T k = ⎜⎝. ..1lk+1 k 1.. ..ln k 1kde l k = (0, . . . , 0, lk+1 k , . . . , lk n) T a e k je k-tý vektor standardní báze R n . V k-tém krokutedy získávámeA k = L k A k−1 , A 0 = A. (8.6)Pro odvození multiplikátorů [?], uvažujme eliminaci prvků v k-tém sloupci matice A k−1⎛a k−1 ⎞ ⎛a 1k.k ⎞1ks A k−1k=a k−1.k−1,ka k−1−→a k k−1,k= s A k⎜ ⎟ ⎜ a⎝kk.k k .kk ⎟⎠ ⎝ 0 ⎠a k−10nk,⎟⎠Obsah146. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


147Ze vztahu (8.6) plyne, že tuto eliminaci můžeme zapsat také ve tvaruL k s A k−1k= s A kk .Z této rovnosti získávámetakže multiplikátoryl k j a k−1kk+ a k−1jk= 0, <strong>pro</strong> j = k + 1, . . . , n,lj k = − ak−1 jka k−1kk, <strong>pro</strong> j = k + 1, . . . , n, a kk ≠ 0. (8.7)Postupným dosazováním do (8.6) eliminujeme prvky v jednotlivých sloupcích a můžemepsátL n−1 . . . L 2 L 1 A = U,kde L 1 nuluje prvky v prvním sloupci, L 2 ve druhém, atd. Přenásobením obou stran rovnostimaticemi L −1kdostanemekdeA = L −11 L−1 2 . . . L −1n−1 U ⇒ A = LU,Snadno ověříme, že chceme-li získat matici L −1kL = L −11 L−1 2 . . . L −1n−1 . (8.8)stačí mimodiagonální prvky v matici L kObsah147. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


148přenásobit −1. TedyL −1k⎛= I − l k e T k = ⎜⎝1. ..1−lk+1 k 1.. ..−ln k 1⎞.⎟⎠Matici L můžeme vyjádřit po jednoduchých úpravách taky jakoL = L −11 . . . L −1n−1= (I − l 1 e T 1 ) . . . (I − ln−1 e T n−1 )= I − n−1(8.9)∑︀l k e T k .k=1Příklad 8.5. Naším úkolem je spočítat LU rozklad matice A z příkladu 8.4. Budemepostupovat stejně jako dříve, jenom zvolíme jiný způsob zápisu.Řešení. Matice soustavy je⎛A = ⎝2 −1 21 0 3−3 3 6Do matice L 1 si zapíšeme multiplikátory řádkových operací, které nám vynulují prvky⎞⎠ .Obsah148. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


149v prvním sloupci matice A, takže⎛1 0⎞0⎛L 1 = ⎝ −1/2 1 0 ⎠ , A 1 = L 1 A = ⎝3/2 0 12 −1 20 1/2 20 3/2 9⎞⎠ .Dále sestavíme stejným způsobem matici L 2 , která nám po přenásobení vynuluje druhýsloupec, získáváme tedy⎛1 0⎞0⎛2 −1⎞2L 2 = ⎝ 0 1 0 ⎠ , A 2 = L 2 A 1 = ⎝ 0 1/2 2 ⎠ = U.0 −3 10 0 3Zbývá nám dopočítat matici L. Podle vztahu (8.9) můžeme psátL = L −11 L−1 2 =⎛⎝1 0 01/2 1 0−3/2 0 1⎞ ⎛⎠ ⎝1 0 00 1 00 3 1⎞⎛⎠ = ⎝1 0 01/2 1 0−3/2 3 1⎞⎠ .Obsah149. strana ze 309◭ ◭ ◮ ◮◭◮8.3. Základní algoritmusV algoritmech 8.1 a 8.2 ukážeme základní verzi implementace, ve které sestavujeme každoumatici zvlášť. V prvním případě postupně odečítáme řádky, ve druhém sloupce. V algoritmu8.3 pak ukážeme, že můžeme všechny operace <strong>pro</strong>vádět přímo na matici A. Výsledná maticeZavřít dokumentCelá obrazovka ⧸︀ Okno


150má pod hlavní diagonálou prvky matice L a na hlavní diagonále a nad ní prvky matice U.Formát výsledné matice můžeme zapsat jako⎛⎞u 11 u 12 . . . u 1n.A =l .. 21 .⎜⎝. .. . ..⎟⎠ .l n1 . . . l n,n−1 u nnPro sestavení matice L, resp. U, použijeme příkazy tril, resp. triu. Na hlavní diagonálumatice L nesmíme zapomenout přičíst jednotkovou matici.Poznámka 8.6. Symbolem I v algoritmech značíme jednotkovou matici, kterou vytvořímev Matlabu následovně:n = size(A, 1);I = eye(n);Algoritmus 8.1LU rozklad: řádková verzeL = I; U = A;for k =1:n -1L(k +1:n,k) = U(k +1:n,k)/U(k,k); % multiplikatoryfor j = k +1: nU(j,k:n) = U(j,k:n)-L(j,k)*U(k,k:n); % radkyendendAlgoritmus 8.2LU rozklad: sloupcová verzeObsah150. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


151L = I; U = A;for k = 1:n -1L(k +1:n,k) = U(k +1:n,k)/U(k,k); % multiplikatoryfor j = k:nU(k +1:n,j) = U(k +1:n,j)-L(k +1:n,k)*U(k,j); % sloupceendendAlgoritmus 8.3LU rozklad: řádková verze: přepisujeme Afor k = 1:n -1A(k +1:n,k) = A(k +1:n,k)/A(k,k); % multiplikatoryfor j = k +1: nA(j,k +1: n) = A(j,k +1: n)-A(j,k)*A(k,k +1: n); % radkyendendL = tril (A , -1)+I;U = triu (A);8.4. Další možnost implementaceDalší možností implementace je postupně dopočítávat prvky obou matic současně. Ukážemesi postup [2], jak dopočítat k-té sloupce matic L a U, známe-li k − 1 sloupců těchto matic.Tato situace je zachycena na obrázku 8.3.Uvažujme rozklad A = LU zapsaný blokově ve tvaru⎛⎝⎞A 11 A 1k A 13A k1 A kk A k3⎠ =A 31 A 3k A 33⎛⎝⎞L 11 O OL k1 L kk O ⎠L 31 L 3k L 33⎛⎝⎞U 11 U 1k U 13O U kk U k3⎠ , (8.10)O O U 33Obsah151. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


152=Obr. 8.3LU rozklad: výpočet k-tých sloupců matic L a U.kde index k označuje prvky v k-tém řádku či sloupci, takže např. blok A k1 má jeden řádeka k − 1 sloupců a blok A 33 má n − k řádků i sloupců. Vyjádřeme si nyní k-tý sloupecmatice A jako soustavuA 1k = L 11 U 1kA kk = L k1 U 1k + L kk U kk (8.11)A 3k = L 31 U 1k + L 3k U kk ,ve které jsme podtržením zvýraznili neznámé. Poznamenejme, že L kk = 1. Řešením prvnírovnice získáme neznámé U 1k , které můžeme dosadit do dalších rovnic. Z druhé rovnicedopočítáme U kk a dosadíme do třetí rovnice, ze které pak dopočteme L 3k .Ukažme si způsob implementace tohoto výpočtu podrobněji. Soustavu (8.11) si můžemepřepsat jako(︂ )︂ (︂ )︂ (︂ )︂Akk Lk1 LA 1k = L 11 U 1k a=kk U1k.A 3k L 3k U kkL 31Obsah152. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


153Z první rovnice dostáváme U 1k . Z druhé si vyjádříme(︂ )︂ (︂ )︂ (︂ )︂ (︂ )︂vk Akk Lk1Lkk U= − Uv 3 A 3k L 1k =kk.31 L 3k U kkJelikož L kk = 1 stačí dopočítatL 3k = v 3 /v k a U kk = v k .Tento postup výpočtu LU rozkladu je zapsán v algoritmu 8.4.Obsah153. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


154Algoritmus 8.4LU rozkladL = I; U = 0;for k = 1:nif k == 1,v(k:n) = A(k:n,k);elsez = L (1:k -1 ,1:k -1) \A (1:k -1 ,k);U (1:k -1 ,k) = z;v(k:n) = A(k:n,k)-L(k:n ,1:k -1) *z;endif k < n, L(k +1:n,k) = v(k +1: n)/v(k); endU(k,k) = v(k);endObsah8.5. Řešení soustav pomocí LU rozkladuUvažujme soustavu Ax = b. Můžeme-li zapsat A = LU, pakL(Ux) = b ⇒ Lz = b, a Ux = z.154. strana ze 309◭ ◭ ◮ ◮◭◮8.6. Příklady1. Nahraďte řádek 4 v algoritmu 8.3 cyklemfor i=k +1: nA(j,i)=A(j,i)-A(j,k)*A(k,i);endZavřít dokumentCelá obrazovka ⧸︀ Okno


155Na dostatečně velké matici porovnejte rychlost původního a upraveného algoritmu.Získané výsledky vysvětlete.2. Upravte algoritmus 8.2, tak aby se matice L a U zapisovaly přímo do matice A.3. Upravte výše uvedené algoritmy <strong>pro</strong> případ, že A je singulární nebo obdélníkovámatice.Obsah155. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


156Kapitola 9PivotizaceObsahBěhem odvozování předchozích algoritmů jsme v (8.7) předpokládali, že v k-tém kroku jea kk ≠ 0. Nebude-li tento předpoklad splněn, může dojít k dělení nulou a algoritmus selže.Bez tohoto předpokladu se obejdeme, budeme-li mít možnost nahradit prvek na pozici (k, k)v matici A k jiným vhodným prvkem, tzv. pivotem. Vybírat můžeme podle různých kritérií,záleží na tom, čeho potřebujeme dosáhnout. Pro zlepšení numerické stability budeme vybíratpivot podle jeho velikosti. Množina, ze které pivot vybíráme, je156. strana ze 309◭ ◭ ◮ ◮◭◮∙ sloupec A k (k : n, k) u částečné pivotizace,∙ submatice A k (k : n, k : n) u úplné pivotizace.Obě varianty jsou zakresleny na obrázku 9.1.Zavřít dokumentCelá obrazovka ⧸︀ Okno


157Obr. 9.1Množina potenciálních pivotů <strong>pro</strong> částečnou a úplnou pivotizaci.9.1. Částečná pivotizaceLU rozklad s částečnou pivotizací můžeme chápat jako rozklad bez pivotizace přepermutovanématice, tedyPA = LU, (9.1)kde P je permutační matice. Podívejme se, jak tento rozklad vznikne.Chceme-li v matici A k nahradit prvek na pozici (k, k) prvkem na pozici (p, k), <strong>pro</strong>hodímeřádky k a p v dané matici. Tuto operaci budeme značitObsah157. strana ze 309◭ ◭ ◮ ◮◭◮A k (k, :) ↔ A k (p, :).Index p určíme tak, aby|A(p, k)| =max {|a i,k|}.i=k,...,nPivot je tedy prvek, který je v absolutní hodnotě největší z prvků A k (k : n, k).Zavřít dokumentCelá obrazovka ⧸︀ Okno


158Prohazování řádků by mohlo být časově náročné, <strong>pro</strong>to si <strong>pro</strong>váděné operace budemepouze zaznamenávat do permutační matice P, takže{︁}︁A k (k, :) ↔ A k (p, :) ⇒ P k+1 A k . (9.2)Následně <strong>pro</strong>vedeme eliminaci v k-tém sloupci, takžePostupným eliminováním podle (9.3) získávámeL k+1 P k+1 A k = A k+1 . (9.3)Zaveďme značení [?]L 1 P 1 A = A 1L 2 P 2 A 1 = A 2.L n−1 P n−1 · · · L 2 P 2 L 1 P 1 A = UObsah158. strana ze 309◭ ◭ ◮ ◮◭◮L ′ 3 = L 3 ,L ′ 2 = P 3 L 2 P −13 , L′ 1 = P 3 P 2 L 1 P −12 P−1 3<strong>pro</strong> n = 4. Není těžké ověřit, že platíL 3 P 3 L 2 P 2 L 1 P 1 = L ′ 3L ′ 2L ′ 1P 3 P 2 P 1 .Obecně tedy můžeme psátU = (︀ L ′ n−1 · · · L ′ 2L ′ 1)︀(︀Pn−1 · · · P 2 P 1)︀A,Zavřít dokumentCelá obrazovka ⧸︀ Okno


159kdea tedyL ′ k = P n−1 · · · P k+1 L k P −1k+1 · · · P−1 n−1(︀L′n−1 · · · L ′ 2L ′ )︀ −1U (︀ )︀1 = Pn−1 · · · P 2 P 1 A ⇔ LU = PA.kpObsah159. strana ze 309Obr. 9.2Prohazování částí řádků v matici L při částečné pivotizaci.Začlenění pivotizace do algoritmu není obtížné. Podívejme se podrobněji jak vložit pivotizacinapř. do algorimu 8.4. Na pozici (k, k) zde umisťujeme prvek v(k). V případě částečnépivotizace, chceme na tuto pozici vybrat vhodný prvek z v(k : n). Řekněme, že vhodný prvek,který chceme přesunout, je na pozici p. Budeme tedy <strong>pro</strong>hazovat řádky k a p, jak jeukázáno na obrázku 9.2 [2]. Vidíme taky, že se změna netýká pouze vektrou v. Zaměňovattedy budemev(k) ↔ v(p)P(k, :) ↔ P(p, :)A(k, :) ↔ A(p, :).◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


160Implementace LU rozkladu s částečnou pivotizací je ukázána v algoritmu 9.1.Algoritmus 9.1LU rozklad s částečnou pivotizacífunction [L,U,P] = my_lu_piv (A)n = size (A ,1) ; I = eye (n); O = zeros (n); L = I; U = O; P = I;function change_rows (k,p)x = P(k ,:) ; P(k ,:) = P(p ,:) ; P(p ,:) = x;x = A(k ,:) ; A(k ,:) = A(p ,:) ; A(p ,:) = x;x = v(k); v(k) = v(p); v(p) = x;endfunction change_L (k,p)x = L(k ,1:k -1) ; L(k ,1:k -1) = L(p ,1:k -1) ; L(p ,1:k -1) = x;endfor k = 1:nif k == 1, v(k:n) = A(k:n,k);elsez = L (1:k -1 ,1: k -1)\ A (1:k -1 ,k); U (1:k -1 ,k) = z;v(k:n) = A(k:n,k)-L(k:n ,1:k -1) *z;endif k 1, change_L (k,p); endendU(k,k) = v(k);endendPříklad 9.1. Pomocí LU rozkladu s částečnou pivotizací vyřešte soustavu rovnic Ax = b,kdeObsah160. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


161⎛A = ⎝1 1 1−4 1 32 3 2⎞⎛⎠ , b = ⎝183⎞⎠ .Řešení.⎛A = ⎝1 1 1−4 1 32 3 2⎞⎠−→r 1 ↔ r 2⎛⎝−4 1 31 1 12 3 2⎞⎠−→r 2 + 1 4 r 1r 3 + 1 2 r 1−→ ⎛ ⎝−4 1 35047027472⎞⎠−→r 2 ↔ r 3⎛⎝−4 1 37025047274⎞⎠−→r 3 − 514 r 2⎛⎝−4 1 3702720 012Při <strong>pro</strong>hození řádků v matici L musíme <strong>pro</strong>hodit také odpovídající sloupce.⎛1 0⎞0 −→⎛1 0⎞0 −→˜L = ⎝ 0 1 0 ⎠ r 1 ↔ r 2⎝ 0 1 0 ⎠ r 2 − 1 4 r 10 0 1 s 1 ↔ s 2 0 0 1 r 3 − 1 2 r 1⎞⎠ = UObsah161. strana ze 309◭ ◭ ◮ ◮◭◮−→ ⎛ ⎝1 0 0− 1 41 0− 1 20 1⎞⎠−→r 2 ↔ r 3s 2 ↔ s 3⎛⎝1 0 0− 1 21 0− 1 40 1V matici P zaznamenáme všechny záměny řádků.⎞⎠−→r 3 + 514 r 2⎛⎝1 0⎞0− 1 21 0 ⎠ = L− 1 45141Zavřít dokumentCelá obrazovka ⧸︀ Okno


162⎛(˜P) = ⎝1 0 00 1 00 0 1⎞⎠−→r 1 ↔ r 2⎛⎝0 1 01 0 00 0 1⎞⎠−→r 2 ↔ r 3⎛⎝0 1 00 0 11 0 0⎞⎠ = PZbývá nám vyřešit samotnou soustavu. Z PA = LU si vyjádříme A = P T LU a dostadímedo Ax = b. Získáváme P T LUx = b, po úpravě pak L(Ux) = Pb. Budeme tedy řešit2 soustavy s trojúhelníkovými maticemi, Lz = Pb a následně Ux = z. Příklad již zvládnetesami dopočítat.9.2. Úplná pivotizaceLU rozklad s úplnou pivotizací můžeme chápat jako rozklad bez pivotizace matice s přepermutovanýmiřádky i sloupci, tedyPAQ = LU, (9.4)kde P a Q jsou permutační matice. Podívejme se, jak tento rozklad vznikne.Chceme-li v matici A k nahradit prvek na pozici (k, k) prvkem na pozici (p, q) <strong>pro</strong>hodímeřádky k a p a sloupce k a q v dané matici. Tuto operaci budeme značitA k (k, :) ↔ A k (p, :),Obsah162. strana ze 309◭ ◭ ◮ ◮◭◮Určíme indexy p a q tak, abyA k (:, k) ↔ A k (:, q).|A(p, q)| =maxi=k,...,nj=k,...,n{|a i,j |}.Zavřít dokumentCelá obrazovka ⧸︀ Okno


163Pivot je tedy prvek, který je v absolutní hodnotě největší z prvků A k (k : n, k : n).Prováděné operace si budeme zaznamenávat do permutačních matic, do P přehazovánířádků, do Q <strong>pro</strong>hazování sloupců. Můžeme psát{︂ }︂Ak (k, :) ↔ A k (p, :)⇒ PA k (:, k) ↔ A k (:, q)k+1 A k Q k+1 . (9.5)Následně <strong>pro</strong>vedeme eliminaci v k-tém sloupci, takžeL k+1 P k+1 A k Q k+1 = A k+1 . (9.6)Podobným způsobem jako v předchozí kapitole odvodíme vztah (9.4).Poznámka 9.2. Vhodnou permutací můžeme ovlivnit zaplněnost matice. Více se dozvímev kapitole 11.Poznámka 9.3. Místo permutačních matic P a Q můžeme využít permutační vektory pa q a nepřímé adresování.9.3. Funkce MatlabuObsah163. strana ze 309◭ ◭ ◮ ◮◭◮∙ [L,U] = lu(sparse(A),0) . . . bez pivotizace . . . LU = A∙ [L,U,P] = lu(A) . . . s částečnou pivotizací . . . LU = PA∙ Y = lu(A) . . . alternativa předešlého, kde Y = U + L − I∙ [L,U,P,Q] = lu(sparse(A)) . . . s pivotizací a řídkým přeuspořádáním . . . LU == PAQVíce podrobností najdete v [3].Zavřít dokumentCelá obrazovka ⧸︀ Okno


164Kapitola 10LDL T a Choleského rozkladObsahV numerických metodách se snažíme využít speciální strukturu matic, kdykoliv je to možné.Je zřejmé, že při práci se symetrickými maticemi stačí v paměti uchovávat pouze polovinuprvků. Je tedy přirozené se ptát, zda můžeme řešit soustavu Ax = b s využitím symetriematice A.Uvažujme nejprve rozklad (obecné) čtvercové matice A ∈ R n,n ve tvaru164. strana ze 309◭ ◭ ◮ ◮◭◮A = LDM T , (10.1)kde U = DM T , R n,n ∋ D = diag(d) je diagonální matice s prvky vektoru d na diagonále,L ∈ R n,n a M ∈ R n,n jsou dolní trojúhelníkové matice s jedničkami na diagonále.Odvoďme nyní algoritmus <strong>pro</strong> výpočet tohoto rozkladu. Budeme postupovat podobnějako v kapitole 8.4. Předpokládejme tedy, že již známe k − 1 sloupců matic L, D a M T .Zavřít dokumentCelá obrazovka ⧸︀ Okno


165Vyjádřeme si k-tý sloupec matice A z (8.10) ve tvaru(︂ )︂ (︂ )︂ (︂ )︂A1k L11 O v1=a AA kk L kk v 3k = (︀ )︀ (︂ )︂vL 31 L 13k , (10.2)k v kL k1kde v = DM T (k, :). Z první soustavy vyčíslíme (v 1 , v k ) T a můžeme dopočítat M T k1 = v 1·/d 1z v 1 = D 11 M T k1 , a jelikož MT kk = 1 dostáváme d k = v k z v k = d k M T kk. Dále dosadíme(v 1 , v k ) T do druhé soustavy a dopočítáme L 3k = (A 3k − L 31 v 1 )/v k .10.1. LDL T rozkladBude-li A ∈ R n,n matice symetrická A T = A, pak bude M = L ∈ R n,n a obdržíme rozkladve tvaruA = LDL T .Výpočet je analogický z předchozím postupem. Z první soustavy (10.2) získáme (v 1 , v k ) Ta určíme d k = v k . Z druhé soustavy pak dopočítáme L 3k . Implementace je uvedena jakoalgoritmus 10.1.Obsah165. strana ze 309◭ ◭ ◮ ◮◭◮Poznámka 10.1. Matici L můžeme efektivně ukládat do dolní trojúhelníkové části maticeA a složky matice D na diagonále matice A.L = I; d = o;for j = 1:nif j = 1,d(j) = A(j,j);Algoritmus 10.1LDL T rozkladZavřít dokumentCelá obrazovka ⧸︀ Okno


166L(j +1:n,j) = A(j +1:n,j)/d(j);elsev = d (1:j -1) .*L(j ,1:j -1) ’;d(j) = A(j,j)-L(j ,1:j -1) *v;L(j +1:n,j) = (A(j +1:n,j)-L(j +1:n ,1:j -1) *v)/d(j);endend10.2. Choleského rozkladUvažujme rozklad symetrické a positivně definitní matice A ∈ R n,n ve tvaruA = LL T .Dosazením U = L do (8.10) dostáváme relace (10.2) s v 1 = L T k1 a v k = L kk .Z první soustavy (10.2) pak dostáváme L kk = √ A kk − L k1 v 1 . Z druhé soustavy pakdopočítáme L 3k . Postup výpočtu je zapsán jako algoritmus 10.2.Obsah166. strana ze 309◭ ◭ ◮ ◮◭◮Poznámka 10.2. Choleského faktorizaci můžeme použít také ve spojení s pivotizací. Zdemluvíme o symetrické pivotizaci ve tvaruPAP T = LL T .Do P můžeme zahrnout také optimalizaci zaplnění.Zavřít dokumentCelá obrazovka ⧸︀ Okno


167Příklad 10.3. Řešte soustavu Ax = b, kde⎛2 −1 0 . . . 0−1 2 . . . .A =. 0 .. . .. . .. 0⎜ .⎝ . .. 2 −10 . . . 0 −1 2⎞⎛, b =⎜⎟ ⎝⎠−1.−1⎞,⎟⎠Choleského rozkladem.Řešení. Vytvoříme m-funkci s názvem chol1.m s hlavičkoua tělem podle algoritmu 10.2.function L = chol1(A)Sestavení matice soustavy a vektoru pravých stran:n=5;A=speye(ones(n,1)*[-1,2,1],[-1,0,-1],n,n);b=-ones(n,1);Obsah167. strana ze 309◭ ◭ ◮ ◮◭◮Vlastní rešení:L=chol1(A);y=L\b; x=L’\y;Zavřít dokumentCelá obrazovka ⧸︀ Okno


168Algoritmus 10.2Choleského rozkladL = 0;for j = 1:nif j = 1L(j,j) = sqrt (A(j,j));L(j +1:n,j) = A(j +1:n,j)/L(j,j);elsev = L(j ,1:j -1) ’;L(j,j) = sqrt (A(j,j)-L(j ,1:j -1) *v);L(j +1:n,j) = (A(j +1:n,j)-L(j +1:n ,1:j -1) *v)/L(j,j);endend10.3. Funkce Matlabu∙ [L,D] = ldl(full(A)) . . . bez pivotizace . . . LDL T = A∙ [L,D,P] = ldl(A) . . . s pivotizací . . . LDL T = P T APObsah168. strana ze 309◭ ◭ ◮ ◮◭◮∙ R = chol(A) . . . <strong>pro</strong> pozitivně definitní A vrací horní trojúhelníkovou matici R, žeplatí R T R = A, pracuje pouze s horní trojúhelníkovou částí matice A, předpokládá,že A = A T∙ L = chol(A,’lower’) . . . <strong>pro</strong> pozitivně definitní A vrací dolní trojúhelníkovou maticiL, že platí LL T = A, pracuje pouze s dolní trojúhelníkovou částí matice A∙ [L,p,s] = chol(A,’lower’,’vector’) . . . <strong>pro</strong> p = 0 vrací dolní trojúhelníkovoumatici L a permutační vektor s takový, že A(s, s) = LL TZavřít dokumentCelá obrazovka ⧸︀ Okno


169Více podrobností najdete v [3].10.4. Příklady1. Implementujte algoritmus popsaný v poznámce 10.1.2. Naimplementujte algoritmus se symetrickou pivotizací popsaný v poznámce 10.2.3. Využitím Choleského rozkladu spočítejtey = G T (GG T ) −1 x,kde G ∈ R m,n je libovolná matice taková, že m > n a vektor x je libovolný vektorvhodné dimenze.Obsah169. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


170Kapitola 11Přeuspořádávací algoritmyObsahInformace této kapitoly jsou převzaty z [3].11.1. Základní přeuspořádáníJak už jsme se zmínili v předchozí kapitole, vhodné přeuspořádání řádků/sloupců matice Apomocí permutačních matic P a Q (případně permutačních vektorů p a q) může ovlivnitřídkost jejích LU a QR faktorů či Choleského faktoru. Nejjednodušší takové přeuspořádáníje setřídit sloupce podle počtu nenulových prvků. Tento postup může dobře fungovat <strong>pro</strong>matice s velmi nepravidelnou strukturou, zvláště pokud jsou velké rozdíly v počtu nenulovýchprvků v řádcích či sloupcích.Funkce p = colperm(A) počítá toto přeuspořádání. Soubor colperm.m má pouze jeden170. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


171řádek:Postupně se <strong>pro</strong>vádí tyto kroky:[∼, p] = sort(sum(spones(A)));1. Funkce spones vytvoří řídkou matici s jedničkami na pozicích všech nenulových prvkův matici A.2. Funkce sum sečne sloupce této matice, takže vrátí vektor s početem nenulových prvkův každém sloupci.3. Funkce sort seřadí hodnoty ve vzestupném pořadí. Druhý výstupní argument je požadovanýpermutační vektor.11.2. Přeuspořádání s redukcí šířky pásu (RCM)Reverzní Cuthill-McKee algoritmus slouží k redukci šířky pásu matice. Není zaručeno, žealgoritmus najde nejmenší šířku pásu, ale obvykle tomu tak bývá. Funkce symrcm(A) pracujenad nenulovou strukturou symetrické matice A + A T .Obsah171. strana ze 309◭ ◭ ◮ ◮◭◮11.3. Přeuspořádání pomocí a<strong>pro</strong>ximace minimálního stupně(AMD)Stupeň uzlu v grafu je dán počtem hran, které do tohoto uzlu zasahují. Je to stejný počet,jako počet nediagonálních nenulových prvků v příslušném řádku matice sousednosti. AlgoritmusAMD sleduje, jak se v průběhu Gaussovy eliminace nebo Choleského faktorizacemění tyto stupně. Na základě toho pak generuje přeuspořádání s minimálním stupněm.Zavřít dokumentCelá obrazovka ⧸︀ Okno


172Jedná se o složitý a výkonný algoritmus, který obvykle vede k řidším faktorům nežvětšina jiných přeuspořádávacích algoritmů. Vzhledem k tomu, že sledování stupně každéhouzlu je velmi časově náročné, využívá se v algoritmu pouze přibližná hodnota. V MATLAButento algoritmus <strong>pro</strong>vádějí tyto funkce:∙ symamd - <strong>pro</strong> symetrické matice,∙ colamd - <strong>pro</strong> nesymetrické matice a symetrické matice tvaru AA T nebo A T A.Různé parametry algoritmu se dají nastavovat pomocí funkce spparms.Více podrobností najdete v [3].Poznámka 11.1. Přeuspořádávací algoritmy jsou zabudovany do algoritmů lu, cholapod., ale aktivují se pouze při některých způsobech volání.Příklad 11.2. Spusťte následující zdrojový kód [3] v Matlabu a <strong>pro</strong>studujte vygenerovanéobrázky.Algoritmus 11.1Ukázka algoritmů symrcm a symamdB = bucky +4* speye (60) ;r = symrcm (B);s = symamd (B);R = B(r,r);S = B(s,s);figuresubplot (2 ,2 ,1) , spy (R ,4) , title (’B(r,r)’)subplot (2 ,2 ,2) , spy (S ,4) , title (’B(s,s)’)subplot (2 ,2 ,3) , spy ( chol (R) ,4) , title (’chol (B(r,r))’)subplot (2 ,2 ,4) , spy ( chol (S) ,4) , title (’chol (B(s,s))’)Obsah172. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


173Kapitola 12QR rozkladObsahV této kapitole si ukážeme, jak prakticky ortogonalizovat množinu lineárně nezávislýcharitmetických vektorů tvořících sloupce matice A, představíme si QR rozklad a popíšemesi několik způsobů, jak tento rozklad implementovat. Začneme Gramovým-Schmidtovýmalgoritmem, pak představíme matici rotace a s ní související Givensovu transformaci a všezakončíme maticí zrcadlení a Householderovou transformací.S ortogonálními maticemi se často setkáváme v numerických metodách, neboť jejichinverzní matici lze získat transponováním a násobení ortogonálními maticemi nezesilujezaokrouhlovací chyby. Jak uvidíme v kapitole 13, QR rozklad můžeme využít také napříkladk výpočtu spektrálního rozkladu.173. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


174Definice 12.1. Čtvercová matice Q, která splňujeQ T Q = Ise nazývá ortogonální matice. Ortogonální matice má tedy ortonormální sloupce a splňujeQ −1 = Q T .Sloupce matice Q tvoří ortonormální množinu vektorů, t.j.{︂(q i , q j ) = qi T 1, i = jq j =0, i ≠ j ,kde (·, ·) značí Euklidovský skalární součin a q i označuje sloupec matice Q.Nechť A ∈ R m,n je libovolná matice, pak existuje ortogonální matice Q ∈ R m,m a hornítrojúhelníková matice R ∈ R m,n takové, že platíA = QR.Uvažujme, nejprve že m = n. Rozepišme si rozklad A = QR, jako v [?], ve tvaru⎛⎞ ⎛⎞ ⎛⎞r 11 r 12 · · · r 1n⎜ a 1 a 2 . . . a n ⎟⎝⎠ = ⎜ q 1 q 2 . . . q n ⎟r 22 r 2n⎝⎠ ⎜⎝. ..⎟. ⎠ .r nnJednotlivé sloupce matice A můžeme zapsat jako lineární kombinaci sloupců matice Q,Obsah174. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


175takže získáváme [?]a 1 = r 11 q 1 ,a 2 = r 12 q 1 + r 22 q 2 , (12.1).a n = r 1n q 1 + r 2n q 2 + · · · + r nn q n .12.1. Gramův-Schmidtův <strong>pro</strong>cesNaším úkolem je sestavit QR faktorizaci matice A, tedy ke známým sloupcům a 1 , . . . , a nmatice A chceme dopočítat sloupce q 1 , . . . , q n matice Q a prvky horní trojúhelníkové maticeR.Proces ortonormalizace začínáme volbouv 1 = a 1 , q 1 = v 1‖v 1 ‖ ,Předpokládejme nyní, že již známe vektoryr 11 = ‖v 1 ‖.Obsah175. strana ze 309◭ ◭ ◮ ◮◭◮q 1 , . . . , q j−1 .Vektor a j si můžeme vyjádřit jako lineární kombinaci vektorů q 1 , . . . , q j ve tvarua j = r 1j q 1 + · · · + r ij q i + · · · + r j−1,j q j−1 + r jj q j . (12.2)Označme si nynív j = r jj q j . (12.3)Zavřít dokumentCelá obrazovka ⧸︀ Okno


176Pro pomocný vektor v j můžeme z (12.2) psátv j = a j − r 1j q 1 − . . . − r ij q i − . . . − r j−1,j q j−1 .Požadujeme, aby vektor v j byl ortogonální k již známým vektorům q 1 , . . . , q j−1 . Proto <strong>pro</strong>k = 1, . . . , j − 1 musí platit0 = (q k , v j ) = (q k , a j − r 1j q 1 − . . . − r ij q i − . . . − r j−1,j q j−1 ).Jelikož (q k , q i ) = 0 <strong>pro</strong> k ≠ i dostáváme(q i , a j − r ij q i ) = (q i , a j ) − r ij (q i , q i )⏟ ⏞=1Normováním získáváme hledaný ortonormální vektor q j , tedyq j =v j podle (12.3)=‖v j ‖= 0 ⇒ r ij = (q i , a j ).v jr jj⇒ r jj = ‖v j ‖.Obsah176. strana ze 309◭ ◭ ◮ ◮◭◮Je-li m > n můžeme QR rozklad uvažovat ve dvou verzích∙ v plné A = QR∙ v redukované A =˜Q ˜RImplementace <strong>pro</strong> m = n je uvedena jako algoritmus 12.1. Implementaci <strong>pro</strong> m > n ponechávámena samostatné <strong>pro</strong>cvičení.Zavřít dokumentCelá obrazovka ⧸︀ Okno


177=Obr. 12.1Úplný QR rozklad.=Obsah177. strana ze 309◭ ◭ ◮ ◮Obr. 12.2Redukovaný QR rozklad.◭◮Q= zeros (n,n); R= zeros (n,n);for j =1: nv=A(: ,j);for i =1:j -1R(i,j)=Q(: ,i) ’*A(: ,j);v=v-R(i,j)*Q(: ,i);endAlgoritmus 12.1Gramův-Schmidtův <strong>pro</strong>cesZavřít dokumentCelá obrazovka ⧸︀ Okno


178R(j,j)= norm (v);Q(: ,j)=v/R(j,j);end12.2. Givensova transformaceGivensova transformace využívá v <strong>pro</strong>cesu ortogonalizace matici rotace, nazývanou takéGivensova matice. Začněme tedy odvozením této matice.12.2.1. Odvození matice rotaceUvažujme dva souřadné systémy xy a x ′ y ′ , které svírají úhel α, jak je znázorněno na obrázku12.3. Bod A má rouřadnice A = (a, b), resp. A = (a ′ , b ′ ). Naším úkolem bude vyjádřit jehosouřadnice v čárkovaných souřadnicích využitím souřadnic nečárkovaných.K odvození budeme potřebovat definiční vztahy goniometrických funkcí sin a cos. Uvažujmepravoúhlý trojúhelník jako na obrázku 12.4 s odvěsnami u, v a přeponou w. Označmeúhel svíraný stranami v, w jako φ. Můžeme tedy psátObsah178. strana ze 309◭ ◭ ◮ ◮◭◮sin φ = u w a cos φ = v w .Užitím těchto vztahů z obrázku 12.5 odvodíme, žea ′ = a cos α + b sin α (12.4)b ′ = −a sin α + b cos α.Zavřít dokumentCelá obrazovka ⧸︀ Okno


179y'ybAx'b'a'Obsahαax179. strana ze 309◭ ◭ ◮ ◮◭◮Obr. 12.3Odvození matice rotace.První rovnice vznikne součtem červeně znázorněných úseček, druhá rovnice pak rozdílemzelených úseček z obrázku 12.5. Tuto soustavu pak můžeme zapsat maticově(︂ )︂ (︂ )︂ (︂ )︂a′ cos α sin α ab ′ =− sin α cos α bZavřít dokumentCelá obrazovka ⧸︀ Okno


180wuφvObr. 12.4Definice finkcí sin a cos.Matici(︂ )︂cos α sin αG =− sin α cos α(12.5)pak nazýváme maticí rovinné rotace, která vektor (a, b) T otočí o úhel −α. V dalším textupoužíváme značení c = cos α a s = sin α.Obsah180. strana ze 309◭ ◭ ◮ ◮◭◮12.2.2. Nulování prvkůMatici rotace můžeme využít k nulovaní prvků ve vektoru. Uvažujme [2], že(︂G T cx =s)︂ (︂ )︂ (︂ √−s a a=2 + b 2c b0)︂.Zavřít dokumentCelá obrazovka ⧸︀ Okno


181y'ybAx'b'αa'αaObr. 12.5Odvození matice rovinné rotace.xObsah181. strana ze 309◭ ◭ ◮ ◮◭◮Není těžké dopočítat, žec =a√a 2 + b 2 a s =−b√a 2 + b 2 .Tento postup můžeme zobecnit také <strong>pro</strong> vektory délky n. Zaveďme matici rotace v roviněZavřít dokumentCelá obrazovka ⧸︀ Okno


182ij [2] ve tvaru⎛G ij =⎜⎝1. ..c s. ..−s c. ..1⎞ij⎟⎠.Jedná se tedy o jednotkovou matici, do které umístíme na odpovídající pozice v i-téma j-tém řádku a i-tém a j-tém sloupci matici rovinné rotace (12.5).Podívejme se na operaciy = G T ijx.Jednotlivé složky vektoru y budou definovány jako [2]⎧⎨ cx i − sx j , k = i,y k = sx i + cx j , k = j,⎩x k , k ≠ i, j.Obsah182. strana ze 309◭ ◭ ◮ ◮◭◮Pro vynulování prvku v j-tém řádku vektoru x pakc =x i√︁x 2 i + x2 j, s =−x j√︁ .x 2 i + x2 jPoznámka 12.2. Matice G ij je ortogonální a součin ortogonálních matic je opět ortogonálnímatice.Zavřít dokumentCelá obrazovka ⧸︀ Okno


18312.2.3. Givensova QR metodaPro vynulování prvku v i-tém řádku sestavíme matici rotace ve tvaruG(i − 1, i), kde c =x i−1√︁x 2 i−1 + x2 i, s =−x√︁ i.x 2 i−1 + x2 iBudeme tedy upravovat matici A. Postup výpočtu vypadá takto⎛ ⎞ ⎛ ⎞* * ** * *A = ⎝ * * * ⎠G(2, 3)T⎝ * * * ⎠G(1, 2)T−→−→* * *0 * *⎛⎝* * *0 * *0 * *⎞⎠G(2, 3)T−→⎛⎝* * *0 * *0 0 *⎞⎠ = R.Postupnou aplikací jednotlivých rotačních matic jsme získali matici R. Můžeme tedy psát{︁}︁G T p . . . G T 1 A = R ⇔ QT A = R⇓A = QR, Q = G 1 . . . G p .Implementace je znázorněna v algoritmu 12.2.Příklad 12.3. Pomocí Givensovy QR metody spočítejte QR rozklad matice⎛−1 4⎞−1A = ⎝ −2 −1 −11 ⎠ .2 10 2Obsah183. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


184Řešení. Pro vynulování prvku A(3, 1) potřebujeme sestavit matici rotace G 1 (2, 3) T . Určímehodnoty−2c = √︀(−2) 2 + 2 = −√ 22 2 , s = −2√︀(−2) 2 + 2 = −√ 22 2a získávámedále pak⎛1G 1 (2, 3) = ⎝⎛A 1 = G 1 (2, 3) T A = ⎝⎞− √ 2/2 − √ √2/2 ⎠√,2/2 − 2/2−1 4 −12 √ 2 11 √ 2/2 13 √ 2/20 −9 √ 2/2 9 √ 2/2⎞⎠ .ObsahaDále budeme nulovat prvek A 1 (2, 1) pomocí G 2 (1, 2). Získáváme c = −1/3, s = −2 √ 2/3⎛G 2 (1, 2) = ⎝−1/3 −2 √ 2/32 √ 2/3 −1/3⎛A 2 = G 2 (1, 2) T A 1 = ⎝1⎞⎠3 6 90 −9 √ 2/2 −3 √ 2/20 −9 √ 2/2 9 √ 2/2Další prvek, který budeme nulovat je A 2 (3, 2). Sestavovat budeme G 3 (2, 3), tedy c = −⎞⎠ .184. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


185− √ 2/2, s = − √ 2/2 a pak⎛G 3 (2, 3) = ⎝1− √ √2/2 2/2− √ 2/2 − √ 2/2⎞⎠ .Násleně můžeme psát⎛A 3 = G 3 (2, 3) T A 2 = ⎝3 6 90 9 −30 0 −6⎞⎠ = R.Matici Q získáme ve tvaru⎛Q = G 1 (2, 3)G 2 (1, 2)G 3 (2, 3) = ⎝Snadno ověříme, že opravdu platí QR = A.−1/3 2/3 −2/3−2/3 1/3 2/32/3 2/3 1/3⎞⎠ .Obsah185. strana ze 309◭ ◭ ◮ ◮◭◮Q= eye (m); R=A;for j =1: nfor i=m :( -1) :j+1x=R(: ,j);if norm ([x(i -1) ,x(i)]) >0c=x(i -1) / norm ([x(i -1) ,x(i)]);s=-x(i)/ norm ([x(i -1) ,x(i)]);Algoritmus 12.2Givensova QR metodaZavřít dokumentCelá obrazovka ⧸︀ Okno


186G= eye (m);G([i -1 ,i],[i -1 ,i]) =[c,s;-s,c];R=G ’*R;Q=Q*G;endendend12.3. Householderova transformaceZačněmě popisem obrázku 12.6. K zadanému vektoru x umíme sestrojit jeho <strong>pro</strong>jekci Pxdo osy x stejné délky [?]. Můžeme tedy psát⎛ ⎞⎛ ⎞x 1‖x‖x 20x =x 3P−→ Px =0= ‖x‖e 1 ,⎜ ⎟⎜ ⎟⎝ . ⎠⎝ . ⎠x n 0kde e 1 = (1, 0, 0, . . . , 0) T je první vektor standardní báze. Vektor Px má tedy nenulovoupouze první složku, ostatní se díky <strong>pro</strong>jekci vynulují. Chceme, aby Px byl stejné délky jakox, tedy ‖Px‖ = [Px] 1 = ‖x‖.Na vektor Px můžeme pohlížet také jako na zrcadlový obraz vektoru x s osou souměrnostiH. Tato osa <strong>pro</strong>chází počátkem a je kolmá k vektoruv = Px − x = ‖x‖e 1 − x. (12.6)V následujícím odstavci si ukážeme, jak vypadá matice zrcadlení P.Obsah186. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


187xHvPxObsah187. strana ze 309Obr. 12.6Zrcadlení.◭ ◭ ◮ ◮◭◮12.3.1. Odvození matice zrcadleníZ obrázku 12.7 je zřejmé, že můžeme Px vyjádřit ve tvaruPx = x − 2x v , (12.7)kde x v je složka vektoru −x zobrazeného do směru vektoru v. Tuto složku můžeme vyjádřitve tvarux v = v n ‖x‖ cos α, (12.8)Zavřít dokumentCelá obrazovka ⧸︀ Okno


188kdeudává směr a ‖x‖ cos α určuje velikost.v n =v‖v‖xHαxvvObsah188. strana ze 309◭ ◭ ◮ ◮Px = ||x||e1◭◮Obr. 12.7Zrcadlení.V dalším kroku dosadíme do (12.8) za v n , rozšíříme ‖v‖ a využijeme definici skalárníhosoučinuv T x = ‖v‖‖x‖ cos α.Zavřít dokumentCelá obrazovka ⧸︀ Okno


189Můžeme tedy psátx v = v n ‖x‖ cos α =Dosazením do (12.7) získávámev ‖x‖ cos α =v‖v‖‖v‖‖x‖ cos α =v‖v‖ 2Px = x − 2x v = x − 2 vvT‖v‖ 2 x = (︁I − 2 vvT‖v‖ 2 )︁x.Matice zrcadlení (nebo také Householderova matice) má tedy tvar‖v‖ 2 vT x.P = I − 2 vvT‖v‖ 2 = I − 2vvT v T v .Všimněme si, že obraz vektoru x není definovaný jednoznačně [?]. Může být zobrazen dolibovolného vektoru z‖x‖e 1 , kde |z| = 1. V oboru reálných čísel máme tedy dvě možnosti,jak je vidět z obrázku 12.8.Aby tato metoda nebyla citlivá na zaokrouhlovací chyby, budeme požadovat, aby <strong>pro</strong>jekcez‖x‖e 1 nebyla příliš blízko x. Budeme tedy volit z = −sign(x 1 ), kde x 1 je prvnísouřadnice vektoru x. Definujme sign(0) = 1. Vektor v pak bude mít tvarv = −sign(x 1 )‖x‖e 1 − x. (12.9)Poznámka 12.4. Pokud by osa zrcadlení H + svírala s osou x velmi malý úhel [?], pakby vektor x ležel blízko svému obrazu. Vektor v by byl mnohem kratší než x a v důsledkuodčítání dvou velmi blízkých hodnot ve vektoru v, by pak vznikaly zaokrouhlovací chyby.Tomuto předejdeme, budeme-li vektor v počítat podle předpisu (12.9).Poznámka 12.5. Snadno ověříme, že <strong>pro</strong>jekce P je symetrická ortogonální matice. A připomeňme,že součin ortogonálních matic je opět ortogonální matice.Obsah189. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


190H -xH +-||x||e 1- x+||x||e 1- x-||x||e 1+||x||e 1Obsah190. strana ze 309Obr. 12.8Zrcadlení.◭ ◭ ◮ ◮◭◮12.3.2. Householderova QR metodaPostup popsaný v předchozí kapitole můžeme využít k výpočtu QR rozkladu [?]. Budemesestavovat <strong>pro</strong>jekce P i , které nám postupně vynulují prvky v jednotlivých sloupcích. Sché-Zavřít dokumentCelá obrazovka ⧸︀ Okno


191maticky tento <strong>pro</strong>ces můžeme znázornit takto:⎛ ⎞ ⎛ ⎞* * ** * *⎜ * * *⎟ P 1⎜ 0 * *⎟ P 2⎝ * * * ⎠ −→ ⎝ 0 * * ⎠ −→* * *0 * *⎛⎜⎝* * *0 * *0 0 *0 0 *⎞⎟⎠P 3−→⎛⎜⎝* * *0 * *0 0 *0 0 0Postupným nulováním nám vznikla trojúhelníková matice R. Maticově pak můžeme psátP n · · · P 2 P 1 A = Q T A = R ⇒ A = QR, Q = P 1 . . . P n , (12.10)⎞⎟⎠kde n je počet sloupců matice A.Implementaci tohoto postupu uvádíme v algoritmu 12.3.Příklad 12.6. Pomocí Householderovy QR metody spočítejte QR rozklad matice⎛−1 4⎞−1A = ⎝ −2 −1 −11 ⎠ .2 10 2Obsah191. strana ze 309◭ ◭ ◮ ◮◭◮Řešení. V prvním kroku budeme pracovat s prvním sloupcem a tedyx = (−1, −2, 2) T , ‖x‖ = √ 1 + 4 + 4 = 3, sign(x 1 ) = −1.Pro vektor v můžeme podle vztahu (12.9) psátv = −sign(x 1 )‖x‖e 1 − x = ‖x‖e 1 − x = ⎝⎛300⎞⎛⎠ − ⎝−1−22⎞⎛⎠ = ⎝42−2⎞⎠ .Zavřít dokumentCelá obrazovka ⧸︀ Okno


192První <strong>pro</strong>jekční matice pak má tvara její aplikací pak získáváme⎛P 1 = I − 2 vvTv T v = ⎝⎛R 1 = P 1 A = ⎝−1/3 −2/3 2/3−2/3 2/3 1/32/3 1/3 2/33 6 90 0 −60 9 −3⎞⎠ .⎞⎠V další kroku budeme pracovat s druhým sloupcem této matice a tedyZ vektorupak získávámex = (0, 9) T , ‖x‖ = 9, sign(x 1 ) = 1.(︂ −9v = −‖x‖e 1 − x =0(︂P ′ 2 = I − 2 vvT 0 −1v T v = −1 0)︂ (︂ 0−9)︂=⎛)︂, ⇒ P 2 = ⎝(︂ −9−9)︂1 0 00 0 −10 −1 0⎞⎠Obsah192. strana ze 309◭ ◭ ◮ ◮◭◮a tedy⎛R 2 = P 2 P 1 A = ⎝3 6 90 −9 30 0 6⎞⎠ .Zavřít dokumentCelá obrazovka ⧸︀ Okno


193Matici Q pak podle (12.10) získáváme ve tvaru⎛−1/3 −2/3⎞2/3Q = P 1 P 2 = ⎝ −2/3 −1/3 −2/3 ⎠ .2/3 −2/3 −1/3Algoritmus 12.3Householderova QR metodaQ= eye (m); R=A;for j =1: nx=R(j:m,j);v=- sign (x (1) )* norm (x)* eye (m-j +1 ,1) -x;if norm (v) >0,v=v/ norm (v);P=I; P(j:m,j:m)=P(j:m,j:m) -2*v*v ’;R=P*R;Q=Q*P;endendObsah193. strana ze 309◭ ◭ ◮ ◮◭◮12.4. Funkce Matlabu∙ [Q,R] = qr(A) . . . plná verze∙ [Q,R] = qr(A,0) . . . redukovaná verze. Pokud m ≦ n, funkce funguje stejně jako[Q,R] = QR(A).Další možnosti a více podrobností najdete v [3].Zavřít dokumentCelá obrazovka ⧸︀ Okno


19412.5. Příklady1. Implementujte Gramův-Schmidtův <strong>pro</strong>ces <strong>pro</strong> m > n. Plnou i redukovanou variantu.Obsah194. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


195Kapitola 13Vlastní čísla a spektrální rozkladObsahProblém vlastních čísel a vektorů se vyskytuje v mnoha fyzikálních a inženýrských aplikacích.Jako příklad můžeme zmínit analýzu stability systémů nebo třeba fyziku rotujícíchtěles.V této kapitole si představíme vlastní čísla matice, s nimi související spektrální rozklada několik algoritmů <strong>pro</strong> výpočet tohoto rozkladu. Jak uvidíme, využijeme k tomu s výhodounám již známý QR rozklad.Uvažujme čtvercovou matici A řádu n. Nenulový vektor v nazýváme vlastním vektoremmatice A a λ příslušné vlastní číslo matice A, platí-li195. strana ze 309◭ ◭ ◮ ◮◭◮Av = λv. (13.1)Tento vztah můžeme přepsat ve tvaru(A − λI)v = o.Zavřít dokumentCelá obrazovka ⧸︀ Okno


196Jelikož v ≠ o, musí být matice A − λI singulární a tedydet(A − λI) = 0. (13.2)Vlasní čísla matice A jsou pak kořeny rovnice (13.2), která se nazývá charakteristická rovnice.Jelikož hledání kořenů takovéto rovnice patří mezi tzv. np těžké <strong>pro</strong>blémy (jejichnáročnost roste s p-tou mocninou n), hledáme jiné cesty k určení vlastních čísel.13.1. Spektrální rozkladRovnici (13.1) můžeme zapsat také maticově ve tvarukdeΛ =⎛⎜⎝λ 1. ..λ n⎞AV = VΛ, (13.3)⎟⎠ a V =⎛⎝ v 1 . . . v n⎞⎠ .Obsah196. strana ze 309◭ ◭ ◮ ◮◭◮Vidíme tedy, že jestliže v j je j-tý sloupec matice V a λ j je j-tý diagonální prvek matice Λ,pak Av j = λ j v j .Nechť je dána realná symetrická matice A řádu n. Pak existují ortogonální matice Qa diagonální matice D takové, žeA = QDQ T . (13.4)Diagonální prvky matice D jsou vlastní čísla matice A a sloupce matice Q jsou ortonormálnívlastní vektory matice A. Množinu vlastních čísel A nazýváme spektrem matice A.Zavřít dokumentCelá obrazovka ⧸︀ Okno


19713.2. Výpočet spektrálního rozkladu pomocí QR algoritmuPro nalezení spektrálního rozkladu A = QDQ T se přímo nabízí využít QR rozkladu a totak [?], že po každém vynulování části sloupce pod diagonálním prvkem bychom se pokusilivynulovat stejnou transformací i část řádku za diagonálním prvkem, tedyA = Q 1 R 1 ⇒ Q T 1 A = R 1 =⎛⎜⎝* * * *0 * * *0 * * *0 * * *⎞⎟⎠ , (13.5)avšakQ T 1 AQ 1 = R 1 Q 1 =⎛⎜⎝* 0 0 0* * * ** * * ** * * *⎞⎟⎠ . (13.6)Z předchozího je tedy patrné, že aplikací stejné ortogonální transformace na sloupce seprvky vynulované ve sloupci mohou opět změnit na nenulové [?]. Nicméně lze dokázat, žepostupObsah197. strana ze 309◭ ◭ ◮ ◮◭◮A 0 = AQ k R k = A k−1A k = R k Q kZavřít dokumentCelá obrazovka ⧸︀ Okno


198konverguje ke spektrálnímu rozkladu. Postupně získávámeA 1 = Q T 1 AQ 1 ,A 2 = Q T 2 A 1 Q 2 = Q T 2 Q T 1 AQ 1 Q 2 ,.A k = Q k A k−1 Q k = Q T k . . . QT 2 Q T 1⏟ ⏞˜Q T kA Q 1 Q 2 . . . Q⏟ ⏞ k ,˜Q ka tedyPro k −→ ∞ můžeme psáttakžeTento postup je zapsán v algoritmu 13.1.A = ˜Q k A k ˜QT k .˜Q k −→ Q a A k −→ D,A = QDQ T .Algoritmus 13.1QDQ T rozklad pomocí QR metodyD = A; Q = I;while norm (D- diag ( diag (D))) >= eps[Qk ,Rk] = qr(D);D = Rk*Qk;Q = Q*Qk;endPoznámka 13.1. V podmínce cyklu while lze použít jakoukoli normu.Obsah198. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


19913.3. Modifikovaná QR metodaMožné modifikace [?] v algoritmu 13.1:1. Před započetím iterací je možno redukovat obecnou symetrickou matici na třidiagonálnítvar pomocí konečného počtu symetrických QR transformací.2. Místo matice A k−1 rozkládáme matici s posunutým spektremA k−1 − μ k−1 I,kde μ k−1 je odhad některého z vlastních čísel, např. μ k−1 = A k−1 (n, n).Redukce na třídiagonální tvarNa následujícím příkladě si ukážeme postup redukce libovolné symetrické matice pomocíHouseholderových transformací na třídiagonální tvar [?]. Postupnými úpravami získáváme⎛⎞⎛⎞* * * ** * 0 0Q T 1 A = ⎜ * * * *⎟⎝ 0 * * * ⎠ , QT 1 AQ 1 = ⎜ * * * *⎟⎝ 0 * * * ⎠ ,0 * * *0 * * *Q T 2 Q T 1 AQ 1 =⎛⎜⎝* * 0 0* * * *0 * * *0 0 * *⎞⎟⎠ , QT 2 QT 1 AQ 1Q 2 =⎛⎜⎝* * 0 0* * * 00 * * *0 0 * *Zvýrazněny jsou ty prvky, které jsou v daném kroku modifikovány. Je tedy patrné, že jednouvynulované prvky se již znovu nemohou stát nenulovými. Možný způsob implementacetohoto výpočtu ukazujeme v algoritmu 13.2.⎞⎟⎠ .Obsah199. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


200Algoritmus 13.2Redukce na třídiagonální tvarQ = I;for j = 1:n -2x = A(j +1:n,j);v = sign (x (1) )* norm (x)* eye (n-j ,1) -x;if norm (v) >0,v = v/ norm (v);P = I; P(j +1:n,j +1: n) = P(j +1:n,j +1: n) -2*v*v ’;A = P*A*P;Q = Q*P;endendV algoritmu (13.3) ukazujeme modifikovaný algoritmus.Algoritmus 13.3QDQ T rozklad: modifikovaná QR metodaD = A; Q = I;for j = 1:n -2x = D(j +1:n,j);v = sign (x (1) )* norm (x)* eye (n-j ,1) -x;if norm (v) > 0,v = v/ norm (v);P = I; P(j +1:n,j +1: n) = P(j +1:n,j +1: n) -2*v*v ’;D = P*D*P;Q = Q*P;endendwhile norm (D- diag ( diag (D))) >= epsmu = D(n,n);[Qk ,Rk] = qr(D-mu*eye (n));Obsah200. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


201D = Rk*Qk+mu*eye (n);Q = Q*Qk;end13.4. Funkce Matlabu∙ <strong>pro</strong> plné matice– lambda = eig(A) . . . vrací vektor vlasních čísel– [Q,D] = eig(A) . . . vrací matice spektrálního rozkladu, platí AQ = QD.Obsah201. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


202∙ <strong>pro</strong> řídké matice– D = eigs(A) . . . vrací vektor šesti největších vlasních čísel– [V,D] = eigs(A) . . . vrací na diagonále matice D šest největších vlasních čísel,ve sloupcích matice V odpovídající vlasní vektory.Matice, jejíž vlastní čísla chceme spočítat, nemusí být sestavena explicitně. Funkce eigsnabízí možnost volání pomocí odkazu na funkci implementující akci matice na vektor. Vícepodrobností najdete v [3].Obsah202. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


203Kapitola 14Singulární rozkladObsahNechť je dána matice A ∈ R m,n . Pak existují ortogonální matice U ∈ R m,m , V ∈ R n,na diagonální matice S ∈ R m,n tak, že platíA = USV T . (14.1)203. strana ze 309◭ ◭ ◮ ◮◭◮Diagonální prvky matice S jsou nezáporné, uspořádané sestupně a nazývají se singulárníčísla matice A.14.1. Využití spektrálního rozkladu A T AHledáme rozklad A = USV T , kde A ∈ R m,n . PakA T A = VS T U T USV T = VS T SV T .Zavřít dokumentCelá obrazovka ⧸︀ Okno


204Pokud m ≧ n aA T A = QDQ T ⇒ diag(S) = √︀ diag(D),V = Q a U je taková ortogonální matice, která řeší soustavu US = AV .Poznámka 14.1. Zde využíváme toho, že matice A T A je symetrická pozitivně semidefinitní.Singulární rozklad tedy můžeme získat např. následovně:1. Sestavíme matici A T A.2. Nalezneme spektrální rozklad této matice A T A = VDV T se současnýmsestupným uspořádáním prvků na diagonále matice D, viz poznámka 14.2.3. Z odmocnin diagonálních prvků matice D sestavíme matici S typu m, n.4. Řešíme soustavu US = AV <strong>pro</strong> neznámou U (lze využít např. QR rozklad).Obsah204. strana ze 309◭ ◭ ◮ ◮◭◮Podrobně se podívejme na řešení US = AV.1. Je-li m ≧ n a má-li matice A všechna singulární čísla nenulová, jsou všechny sloupcematice AV ortogonální neboť musí být rovna matici US. Sloupce matice US jsoutotiž sloupce matice U vynásobené diagonálními prvky matice S a tudíž jsou ortogonální.Pokud tedy <strong>pro</strong>vedeme QR rozklad matice AV, obdržíme ortogonální maticiQ a matici R, která bude diagonální. Pak U = QR S , kdeR S = diag(R 11 /S 11 , . . . , R nn /S nn , 1, ..., 1)Zavřít dokumentCelá obrazovka ⧸︀ Okno


205je diagonální čtvercová matice řádu m.2. Je-li m ≧ n a má-li matice A alespoň jedno singulární čislo nulové, pak i některésloupce matice AV budou nulové, neboť musí být rovna matici US. Pokud tedybudeme <strong>pro</strong>vádět QR rozklad matice AV, je vhodné <strong>pro</strong>vádět tento rozklad pouzena nenulových sloupcích. U takto získané matice Q je pak potřeba zajistit případnoupermutaci sloupců, ke které mohlo dojít díky vynechání řádků.3. Je-li m < n, pak můžeme doplnit matici A na matici čtvercovou přidáním nulovýchřádků nebo ji nejdříve transponovat. Tímto převedeme úlohu na typ uvedený v bodě(1) nebo (2). Na závěr pak v prvním případě odebereme z matice S příslušné přidanénulové řádky a obdobně matici U redukujeme o přidané řádky a jim příslušné sloupce.14.2. Další možnost využití spektrálního rozkladuV této kapitolce si ukážeme alternativní možnost, jak využít spektrální rozklad <strong>pro</strong> výpočetrozkladu singulárního.V dalším odvozování se nám bude hodit singulární rozklad matice transponované. Podle(14.1) můžeme psátA T = (USV T ) T = VS T U T = VSU T . (14.2)Uvažujme nyní matici H definovanou vztahem(︂ OH =A OATSpektrální rozklad této matice pak můžeme zapsat ve tvaruH = QDQ T ,)︂. (14.3)Obsah205. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


206kdeQ = √ 1 (︂ V2 UMůžeme tedy psátH = QDQ T = 1 (︂ V2 U)︂ V−U)︂ (︂ V S−U ORoznásobením získáváme maticiH = 1 (︂O 2 VSU T2 2 USV T O(︂ Sa D =OO−S)︂.)︂ (︂ O VTU T )︂−S V T −U T .)︂ (︂ O=AVyužitím rovnic (14.1) a (14.2) jsme dostali předpis <strong>pro</strong> matici H definovanou ve vztahu (14.3).Vidíme tedy, že singulární rozklad čtvercové matice A je možné získat pomocí spektrálníhorozkladu matice H. Příklad výpočtu uvádíme v algoritmu 14.1, kde funkce[Q, D] = qreigm(H)je modifikovaná QR metoda <strong>pro</strong> výpočet spektrálního rozkladu, uvedená v algoritmu 13.3.ATO)︂.Obsah206. strana ze 309◭ ◭ ◮ ◮◭◮Singulární rozklad tedy můžeme získat např. následovně:1. Sestavíme matici H.2. Nalezneme spektrální rozklad této matice H = QDQ T se současným sestupnýmuspořádáním prvků matice D, viz poznámka 14.2.3. Z poloviny diagonálních prvků matice D sestavíme matici S.4. Z prvních n sloupců matice Q vybereme matice V a U.Zavřít dokumentCelá obrazovka ⧸︀ Okno


207Poznámka 14.2. Problémy může způsobit symetrická permutace řádků a sloupců maticeD reprezentovaná permutační maticí P. Matici P, která má tvarH ˜Q =˜Q ˜D, ˜D= PDPTvyužíváme <strong>pro</strong> sestupné uspořádání singulárních čísel. Odtud pakH ˜QP = ˜Q ˜DP = ˜Q PP T⏟ ⏞I˜DP = ˜QPD ⇒ Q = ˜QP.Obsah207. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


208A= rand (n);O= zeros (n);H=[O,A;A,O];[Q,D]= qreigm (H);[ds ,p]= sort ( diag (D) ,1,’descend ’);Dp=D(p,p);Qp= sqrt (2) *Q(: ,p);U=Qp(n +1:2*n ,1: n)V=Qp (1:n ,1: n)S=Dp (1:n ,1: n)norm (A-U*S*V ’)Algoritmus 14.1Singulární rozklad14.3. Mooreova-Penroseova inverzeLze ukázat, že ke každé matici A ∈ R m×n existuje tzv. zobecněná inverze A # , <strong>pro</strong> níž platírovnostAA # A = A. (14.4)Pomocí SVD rozkladu (14.1) matice A sestavíme speciální případ zobecněné inverze, tzv.Mooreovu-Penroseovu inverziObsah208. strana ze 309◭ ◭ ◮ ◮◭◮A + = VS + U T ,kde matice S + je diagonální a její prvky jsou dány předpisems + i,i = 1s i,i<strong>pro</strong> s i,j > 0s + i,i = 0 <strong>pro</strong> s i,j = 0.Zavřít dokumentCelá obrazovka ⧸︀ Okno


209Skutečně lze ukázat, že po dosazení A + za A # bude vztah (14.4) stále platit, což je mimojiné první ze čtyř tzv. Mooreových-Penroseových podmínek. Tato a zbylé tři Mooreovy--Penroseovy podmínky jsou14.4. Příklady1. AA + A = A2. A + AA + = A +3. A + A = (︀ A + A )︀ T4. AA + = (︀ AA +)︀ T .1. Pomocí singulárního rozkladu spočítejte inverzní matici matice⎛ ⎞0 2 1A = ⎝ 3 1 2 ⎠ .1 5 2Poznámka: Inverzní matici matice diagonání snadno spočteme jako převrácenou hodnotuprvků na diagonále.2. Pomocí singulárního rozkladu spočítejte tzv. pseudoinverzi A + (Mooreova-Penroseovainverze)) matice⎛0 2⎞1A = ⎝ 3 1 2 ⎠ .3 −1 1Ověřte, že platí vztah AA + A = A.Poznámka: Řešení je pouhou modifikací předchozího příkladu.Obsah209. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


21014.5. Funkce Matlabu∙ <strong>pro</strong> plné matice– [U,S,V] = svd(A) . . . vrací matice SVD rozkladu, kde S je stejné velikostijako A– S = svd(A) . . . vrací vektor singulárních čísel– [U,S,V] = svd(A,0) . . . redukovaná verze rozkladuObsah210. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


211∙ <strong>pro</strong> řídké matice– S = svds(A) . . . vrací 6 největších singulárních čísel– S = svds(A,k) . . . vrací k největších singulárních číselDalší možnosti a více podrobností najdete v [3].Obsah211. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


212Kapitola 15Lanczosova metodaObsah15.1. MotivaceVýpočet vlastních čísel je spojený s mnoha inženýrskými <strong>pro</strong>blémy. Lanczosova metoda jevhodná <strong>pro</strong> situace, kdy je předmětem zájmu výpočet dominantních vlastních čísel. Praktickyto znamená, že <strong>pro</strong> a<strong>pro</strong>ximaci se původní matice transformuje do třidiagonálníhotvaru a navíc je možné redukovat její řád. Proto Lanczosova metoda není nástrojem k výpočtuvlastních čísel, poskytuje však podklady <strong>pro</strong> algoritmy (např. mocinná metoda), kteréby <strong>pro</strong> původní matici byly nepoužitelné (<strong>pro</strong>blémy s velkými řády). Podrobnější popis metodynaleznete např. v [4].212. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


21315.2. DefiniceMějme symetrickou pozitivně definitní matici A ∈ R n,n . Pomocí podobnostní transformacepřevedeme matici A na třidiagonální tvar⎛⎞a 1 b 1 0 0 · · · 0b 1 a 2 b 2 0 · · · 0T =.⎜ . .. . .. . .. . .. .(15.1)⎟⎝ 0 · · · 0 b n−2 a n−1 b n−1⎠0 · · · 0 0 b n−1 a npodle vztahuT = Q T AQ, (15.2)kde Q ∈ R n,n je matice ortonormální.Při odvození uvažujme, že matice Q je známa. Zapišme hledanou matici T v obecnémtvaru a přepišme rovnost (15.2) do tvaruQT = AQ.Za předpokladu, že Q = (︀ q 1 , q 2 , · · · , q n)︀ , lze předešlou rovnost napsat⎛⎞a 1 b 1 0 0 · · · 0(︀q 1 , q 2 , · · · , q n)︀ b 1 a 2 b 2 0 · · · 0.⎜ . .. . .. . .. . .. .= A (︀ q 1 , q 2 , · · · , q n)︀⎟⎝ 0 · · · 0 b n−2 a n−1 b n−1⎠0 · · · 0 0 b n−1 a nObsah213. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


214a vyjádřit k-tou rovnicib k−1 q k−1 + a k q k + b k q k+1 = Aq k , (15.3)<strong>pro</strong> jejiž obecnost se s ohledem na další úpravy definujme b 0 = 0, q 0 = 0.Výpočet koeficientůPřenásobme rovnici (15.3) vektorem q k a díky ortonormalitě vektorů obdržíme(︁a k = Aq k , q k)︁ .Stejnou rovnici nyní přenásobme q k+1 a obdržíme(︁b k = Aq k , q k+1)︁ .Upravme rovnici (15.3) do tvaruq k+1 = (A − a kI) q k − b k−1 q k−1b k, (15.4)což lze považovat za předpis ortonormalizačního <strong>pro</strong>cesu. Označmea koeficientr k = (A − a k I) q k − b k−1 q k−1b k = ‖r k ‖,potom vektor následující z matice Q je dán předpisemq k+1 =rk‖r k ‖ .Obsah214. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


21515.3. Algoritmus Lanczosovy metodyVšechny potřebné vztahy <strong>pro</strong> výpočet jsou odvozeny a výpočet matice T se sestaví v nkrocích. V průběhu výpočtu se generují vektory q i a můžeme ověřit rovnost (15.2).Obsah215. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


216Algoritmus 15.1 Lanczosova metoda.A ∈ R n,n vstupní maticeT ∈ R n,n nulová matice, prvek matice t i,j = 0q 0 ∈ R n nulový vektorr 1 ∈ R n libovolný jednotkový vektorb 1 = 1for j = 1, ..., nq j = r j /b ja j = (︀ Aq j , q j)︀r j+1 = (A − a j I) q j − b j q j−1b j+1 = ‖r j+1 ‖t j,j = a jif j < n thent j+1,j = b jt j,j+1 = b jend ifend forObsah216. strana ze 309◭ ◭ ◮ ◮◭◮Je-li Lanzsosova metoda použita <strong>pro</strong> výpočet vlastních čísel λ, často se algoritmus ukončujedříve, než jsou spočteny kompletní matice. Z vlastností matice T se může výpočet λZavřít dokumentCelá obrazovka ⧸︀ Okno


217s ohledem na žádanou přesnost kontrolovat dvěma parametry. Stanoví se počet hledanýchvlastních čísel n λ a počet potřebných iterací k v relaci n λ < k. Také platí omezení k < n.Prakticky to znamená, že odhad dominantních vlastních čísel je počítán z matice, kterámůže mít výrazně menší řád, než původní.Obsah217. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


218Algoritmus 15.2 Použití Lanczosovy metody k výpočtu vlastních čísel.A ∈ R n,n vstupní matice˜T∈ R k,k nulová matice, prvek matice t i,j = 0q 0 ∈ R n nulový vektorr 1 ∈ R n libovolný jednotkový vektorb 1 = 1for j = 1, ..., kq j = r j /b ja j = (︀ Aq j , q j)︀r j+1 = (A − a j I) q j − b j q j−1b j+1 = ‖r j+1 ‖t j,j = a jif j < k then˜t j+1,j = b j˜t j,j+1 = b jend ifend forObsah218. strana ze 309◭ ◭ ◮ ◮◭◮.Výpočet n λ vlastních čísel tridiagonální matice ˜TZavřít dokumentCelá obrazovka ⧸︀ Okno


219Kód matlabuAlgoritmus 15.1Lanzosova metodafunction [ lambda ,T,Q]= lanczos (A, n_lambda , n_it )% A ... vstupni matice% n_it ... max . pocet iteraci% n_lambda ... pocet pocitanych vlastnich ciseln= size (A ,1) ;if n_it >=n || n_lambda >= n_it || nargin ~=3error (’Chyba v zadani !’)endQ= zeros (n, n_it );s= zeros (n ,1) ;r= rand (n ,1) ;r=r/ norm (r);b =1;Alpha = zeros (n_it ,1) ; Beta = zeros (n_it -1 ,1) ;for j =1: n_its_bef = s;s= r/b;Q(: ,j) = s;a = dot (s,A*s);Alpha (j) = a;r = (A-a* eye (n))*s-b* s_bef ;b = norm (r);if j


220A ∈ R n×n , n = 50, <strong>pro</strong> kterou platía i,j = 2 <strong>pro</strong> i = ja i,j = 1 <strong>pro</strong> |i − j| = 1a i,j = 0 <strong>pro</strong> |i − j| > 1redukcí na matici řádu 5, 10 a 15 použitím Lanczosovy metody.V Matlabu sestrojíme matici příkazem A=spdiags([-I, 2*I,-I],[-1 0 1],n,n), kde je n == 50 a I je vektor jedniček řádu n. Vypsáním příkazu lambda=lanczos(A,1,5) se nejprvesestaví redukovaná třídiagonální matice A r rozměru 5 × 5, spočtou se vlastní čísla, z nichžnejvětší je ˜λ max = 3.893 (Matlabem spočtená hodnota největšího vlastního čísla maticeA je λ max = 3.996). Relativní chyba je 2.595%. Tato a další dvě varianty jsou vypsányv tabulce pod textem.varianta 1 2 3řád matice A r 5 10 15˜λ max (A r ) 3.893 3.979 3.995λ max (A) 3.996ε [%] 2.595 0.437 0.040Obsah220. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


221Kapitola 16Metoda sdružených gradientůObsah16.1. MotivaceInženýrské <strong>pro</strong>blémy řešené metodou konečných prvků či metodou sítí převádí původněformulovaný fyzikální <strong>pro</strong>blém na soustavu lineárních rovnic tvaru2<strong>21.</strong> strana ze 309◭ ◭ ◮ ◮◭◮A^x = b, (16.1)kde ^x ∈ R n je hledané řešení a A ∈ R n,n , b ∈ R n . Rovnici lze řešit např. dříve popsanouGaussovou eliminací, <strong>pro</strong> kterou platí pracnost O (︀ n 3)︀ . Metoda sdružených gradientů máv nejnepříznivějším případě (plná a špatně podmíněná matice, ...) také pracnost O (︀ n 3)︀ , ale<strong>pro</strong> matice generované metodou konečných prvků (resp. sítí), které jsou řídké, je pracnostvýrazně menší. Hlubší teoretický rozbor naleznete v [1, 4].Zavřít dokumentCelá obrazovka ⧸︀ Okno


22216.2. DefiniceObr. 16.1FunkcionálŘešení rovnice (16.1) je ekvivalentní úloze nalezení minima funkcionáluObsah222. strana ze 309◭ ◭ ◮ ◮◭◮F (x) = 1 (x, Ax) − (x, b). (16.2)2Pro dvě <strong>pro</strong>měnné si funkcionál můžeme přestavit jako graf paraboloidu nad rovinou x 1 x 2 ,který přiřazuje každému vektoru x = (x 1 , x 2 ) jedinečné číslo odpovídající souřadnici kolména x 1 x 2 . Existuje x := ^x, <strong>pro</strong> které je hodnota fukcionálu minimální a které je řešenímrovnice (16.1). Pro případ na obr. 16.1 obdržíme řešení po dvou iteracích. Prvně se spočteminimum v záporném směru gradientu r 1 = Ax 1 − b, druhým vektorem v 2 již dojdemeZavřít dokumentCelá obrazovka ⧸︀ Okno


223k výsledku. Předpokládejme, že přesné řešení ^x můžeme napsat ve tvarun∑︁^x = x 1 + α i v i , (16.3)i=1nebo také^x = x 1 + Vα, (16.4)kde V = (︀ v 1 , v 2 , ..., v n)︀ je A-ortogonální báze , <strong>pro</strong> kterou platí(︀v i , Av j)︀ = 0 <strong>pro</strong> i ≠ j , (16.5)(︀v i , Av j)︀ ≠ 0 <strong>pro</strong> i = j (16.6)a α = (α 1 , α 2 , ..., α n ) T je vektor koeficientů. Dosadíme-li (16.3) do energetického funkcionálu(16.2), obdržímeObsah223. strana ze 309◭ ◭ ◮ ◮F (^x) = 1 2(︀x 1 + Vα, A (︀ x 1 + Vα )︀)︀ − (︀ x 1 + Vα, b )︀ , (16.7)◭◮a po úpravěF (^x) = F (α) = 1 2(︀α, V T AVα )︀ − (︀ α, V T (︀ b − Ax 1)︀)︀ + C, (16.8)kdeC = 1 (︀x 1 , Ax 1)︀ − (︀ x 1 , b )︀2Zavřít dokumentCelá obrazovka ⧸︀ Okno


224je konstanta bez vlivu na minimum funkcionálu. Nyní s argumentem α lze díky speciálnímvlastnostem báze (součin V T AV vede na diagonální matici) zapsat ve tvaruF (α) = 1 2 α2 1(︀v 1 , Av 1)︀ + 1 2 α2 2(︀v 2 , Av 2)︀ + ... + 1 2 α2 n (v n , Av n ) −−α 1(︀v 1 , −r 1)︀ − α 2(︀v 2 , −r 1)︀ − ... − α n(︀v n , −r 1)︀ + C.Nyní stačí funkcionál derivovat postupně podle všech α k∂∂F (α)∂∂α k(︁= 0 = α k v k , Av k)︁ −(︁v k , −r 1)︁a hledané koeficienty spočítat z(︀v k , r 1)︀α k = −(v k , Av k ) . (16.9)Pokud by byla báze V k dispozici, úloha je vyřešena, neboť koeficienty α k se dopočítajívelice jednoduše. V následující části budou podrobně rozebrány základní skalární součinypotřebné k odvození dílčích částí metody sdružených gradientů.Obsah224. strana ze 309◭ ◭ ◮ ◮◭◮16.3. AnalýzaZaveďme předpoklad, že se k řešení blížíme (obr. 16.1) pomocí vztahux k+1 = x k + α k v k , (16.10)každé následující přiblížení hledaného řešení lze vyjádřit kombinací předešlého x k s tzv.sdruženým směrem v k . Zobecněním rovnice (16.10) můžeme psát dříve zavednou (16.3).Zavřít dokumentCelá obrazovka ⧸︀ Okno


225Je-li mez <strong>pro</strong> sčítání k < n, <strong>pro</strong> x k můžeme také psát∑︁k−1x k = x 1 + α i v i . (16.11)V k-tém kroce je reziduum dáno vztahemr k = Ax k − b (16.12)a v kroce následujícím pomocír k+1 = Ax k+1 − b = r k + α k Av k . (16.13)i=1Kombinace (16.11) a (16.12) dává∑︁k−1r k = r 1 + α i Av i (16.14)Předpokládejme, že k-tý vektor A-ortonormální báze je spočten Gramm-Schmidtovým ortogonalizačním<strong>pro</strong>cesem z báze reziduí dlei=1Obsah225. strana ze 309◭ ◭ ◮ ◮◭◮∑︁k−1v k = r k + β k,j v j . (16.15)i=116.4. Definování skalárních součinůV další části textu budou odvozeny všechny potřebné skalární součiny, které se v popisudíčích částí metody objevují.Zavřít dokumentCelá obrazovka ⧸︀ Okno


226Součin (︀ r k , v j)︀Použijme obecný vektor v j a relaci (16.14).∙ Pro j ≧ knebo také(︁r k , v j)︁ = (︀ r 1 , v j)︀ ∑︁k−1(︀+ α i Av i , v j)︀ = (︀ r 1 , v j)︀ , (16.16)i=1(︀r j , v j)︀ = (︀ r j−1 , v j)︀ = (︀ r j−2 , v j)︀ = (︀ r 1 , v j)︀ . (16.17)∙ Pro j < k s využitím (16.9) a předešlého vztahu (16.16)(︀r k , v j)︀ = (︀ r 1 , v j)︀ (︀+ α j Av j , v j)︀= (︀ r 1 , v j)︀ − (rj ,v j )(v j ,Av j )(︀Av j , v j)︀ = 0.Využitím obou závislostí odvodíme další užitečnou rovnost(︁r k , v k)︁ (︁= r k , r k)︁ +∑︁k−1β k,i(︁v i , r k)︁ =i=1(16.18)(︁r k , r k)︁ = ‖r k ‖ 2 . (16.19)Obsah226. strana ze 309◭ ◭ ◮ ◮◭◮Součin (︀ r k , Av j)︀Upravme rovnici (16.15) do tvaru∑︁k−1r k = v k − β k,i v i .i=1Zavřít dokumentCelá obrazovka ⧸︀ Okno


227∙ Pro j > k∙ Pro j = k∙ Pro j < kz čehož odvodíme(︃(︁r k , Av j)︁ = v k −)︃∑︁k−1β k,i v i , Av j = 0. (16.20)i=1(︁r k , Av k)︁ (︁= v k , Av k)︁ . (16.21)(︁r k , Av j)︁ = −β k,j(︀v j , Av j)︀ , (16.22)(︀r k , Av j)︀β k,j = −(v j , Av j ) . (16.23)ObsahSoučin (︀ r k , r j)︀∙ Pro j = 1 a k = {2, 3, ..., n} platí(︂(︀r k , r 1)︀ = r 1 + k−1 )︂∑︀α i Av i , r 1i=1= (︀ r 1 , r 1)︀ + k−1 ∑︀α i A (︀ v i , r 1)︀i=1= (︀ r 1 , r 1)︀ + α 1(︀Av 1 , r 1)︀ .(16.24)V poslední úpravě je suma součinů <strong>pro</strong> i = {2, ..., k − 1} dle (16.20) nulová, zůstávápouze člen <strong>pro</strong> i = 1. S platností v 1 = r 1 a dosazením za α 1 obdržíme(︁r k , r 1)︁ = (︀ (︀r 1 , r 1)︀ r 1 , r 1)︀ (︀− Ar 1(r 1 , Ar 1 , r 1)︀ = 0)227. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


228a platí, že počáteční reziduum je kolmé ke všem následujícím.∙ Pro j = k − 1(︀r k , r k−1)︀= (︀ r k−1 + α k−1 Av k−1 , r k−1)︀= (︀ r k−1 , r k−1)︀ (︀+ α k−1 Av k−1 , r k−1)︀ .= (︀ r k−1 , r k−1)︀ − (vk−1 ,r k−1 ) (︀(v k−1 ,Av Av k−1 )k−1 , v k−1)︀ .(16.25)Opět je využito dříve odvozených relací. S platností (︀ v k−1 , r k−1)︀ = ‖r k−1 ‖ 2 jsou podalších úpravách dvě po sobě jdoucí rezidua vzájemně ortogonální.∙ Obecně <strong>pro</strong> k > j(︀r k , r j)︀= (︀ r k−1 + α k−1 Av k−1 , r j)︀= (︀ r k−1 , r j)︀ + α k−1(︀Av k−1 , r j)︀ .Zde druhý člen je <strong>pro</strong> j < k − 1 nulový v důsledku (16.20) a zůstává(︁r k , r j)︁ (︁= r k−1 , r j)︁ .(16.26)Obsah228. strana ze 309◭ ◭ ◮ ◮◭◮Rovnost je možné zobecnit postupně(︁r k , r j)︁ (︁= r k−1 , r j)︁ =(︁r k−2 , r j)︁ = · · · = (︀ r j+1 , r j)︀a <strong>pro</strong>tože jako poslední člen v řadě rovností jsou dvě po sobě jdoucí rezidua, jejichžskalární součin je nulový, součin reziduí s indexy k > j je taktéž roven nule.Zavřít dokumentCelá obrazovka ⧸︀ Okno


229AnimacePrůběh výpočtu soustavy lineárních rovnic metodou sdružených gradientů můžete sledovatv apletu Lineární algebra - interaktivní animace v záložce Metoda sdruženýchgradientů. Pro použití apletu je nutné nainstalovat CDF player.16.5. Algoritmus sdružených gradientůPro i-tý sdružený vektor patřící do postupně vytvářené A-ortogonální báze platí rovnice(16.15). Koeficienty β k,j se spočítají ze vztahu (16.23), kde v čitateli za člen Av j dosadímesubstituci odvozenou z (16.13)(︁(︀r k , Av j)︀ r k , 1 (︀β k,j = −(v k , Av k ) = − α jr j+1 − r j)︀)︁(v k , Av k .)Indexy j nabývají postupně hodnot {k − 1, k − 2, . . . , 1}. S přihlédnutím k vlastnostemortogonality rezidují vyjma j = k−1 budou všechny ostatní koeficienty rovny nule a předpis<strong>pro</strong> sdružený směr se zjednoduší naObsah229. strana ze 309◭ ◭ ◮ ◮◭◮v k = r k + β k−1 v k−1 . (16.27)Všechny potřebné vztahy <strong>pro</strong> výpočet jsou odvozeny. Připomeňme ještě, že se spokojímes⃦přibližným řešením. Pro tyto účely je zavedena konstanta ε a výpočet ukončíme např. při⃦x k+1 − x k⃦ ⃦ < ε.Zavřít dokumentCelá obrazovka ⧸︀ Okno


230Algoritmus 16.1 Algoritmus sdružených gradientů.ε > 0, x 1 , k = 1r 1 = Ax 1 − b, v 1 = r 1 , α 1 = − ‖r1 ‖ 2(Ar 1 , r 1 ) , x2 = x 1 + α 1 v 1while ||x k+1 − x k || ≧ εk = k + 1r k = r k−1 + α k−1 Av k−1β k−1 = − (rk ,Av k−1 )(Av k−1 ,v k−1 )v k = r k + β k−1 v k−1α k = − (rk ,v k )(Av k ,v k )x k+1 = x k + α k v kend whileObsah230. strana ze 309◭ ◭ ◮ ◮◭◮Části kódu lze dále upravit.Koeficient αPlatí-li ortogonalita, můžeme psát součin dvou po sobě následujících rezidují(︁r k+1 , r k)︁ (︁= r k + α k Av k , r k)︁ =(︁r k , r k)︁ (︁+ α k Av k , r k)︁ = 0, (16.28)Zavřít dokumentCelá obrazovka ⧸︀ Okno


231který je roven nule a nově <strong>pro</strong> α k platí(︀r k , r k)︀α k = −(Av k , v k ) . (16.29)Koeficient βVyužijme ortogonality reziduí <strong>pro</strong> úpravu koeficientu β ze součinu(︁v k , r k−1)︁ (︁= r k + β k−1 v k−1 , r k−1)︁ =(︁r k , r k−1)︁ (︁+ β k−1 v k−1 , r k−1)︁ . (16.30)Součin (︀ v k , r k−1)︀ je roven (︀ v k , r j)︀ , kde j = {1, 2, ..., k}. Využitím další rovnosti (16.19) sevztah přepíše (︁r k , r k)︁ = β k−1(︁r k−1 , r k−1)︁a konečný výraz <strong>pro</strong> koeficient se zjednoduší na(︀r k , r k)︀β k−1 =(r k−1 , r k−1 ) . (16.31)Obsah231. strana ze 309◭ ◭ ◮ ◮◭◮V algoritmu je zavedena pomocná <strong>pro</strong>měnná w i = Av i a za každou iteraci se v optimalizovanéverzi kódu <strong>pro</strong>vede pouze jedno násobení maticí A. Jako ukončovací kritériumvězměme normu rezidua.Zavřít dokumentCelá obrazovka ⧸︀ Okno


232Algoritmus 16.2 Optimalizovaný algoritmus sdružených gradientů.ε > 0, x 1 , k = 1r 1 = Ax 1 − b, v 1 = r 1 , w 1 = Av 1 , α 1 = − ‖r1 ‖ 2while ||r k || ≧ εk = k + 1r k = r k−1 + α k−1 w k−1β k−1 = ⃦ ⃦r k⃦ ⃦ 2 / ⃦ ⃦r k−1⃦ ⃦ 2v k = r k + β k−1 v k−1w k = Av kα k = − ⃦ ⃦ rk ⃦ ⃦ 2 / (︀ w k , v k)︀x k+1 = x k + α k v kend while(w 1 ,v 1 ) , x2 = x 1 + α 1 v 1Obsah232. strana ze 309◭ ◭ ◮ ◮◭◮function x=cg(A,b,x)% metoda sdruzenych gradientu% A ... matice soustavy% b ... vektor prave strany% x ... pocatecni odhadn= length (b);Algoritmus 16.1Metoda sdružených gradientůZavřít dokumentCelá obrazovka ⧸︀ Okno


233if nargin eps0 k


234Kapitola 17Testové otázkyObsah234. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


23517.1. Test - řídké maticeTest (Řídké matice)1. (1b.) Co je to řídká matice?(a) matice, u které převládá počet nenulových prvků nad nulovými(b) matice, u které převládá počet nulových prvků nad nenulovými(c) matice obsahující pouze nenulová hodnoty(d) matice obsahující pouze nulové hodnoty2. (1b.) Řídké matice jsou významné <strong>pro</strong>to, že díky speciálnímu formátu zápisu mají menšínároky na pamět počítače.(a) ANO(b) NEObsah235. strana ze 309◭ ◭ ◮ ◮◭◮3. (1b.) Jakou kompresi označuje zkratka CSR?(a) Řádková komprese.(b) Sloupcová komprese.(c) Kombinace řádkové a sloupcové komprese.(d) Blokově diagonální komprese.Zavřít dokumentCelá obrazovka ⧸︀ Okno


2364. (1b.) Jakou kompresi označuje zkratka CSC?(a) řádková komprese(b) sloupcová komprese(c) kombinace řádkové a sloupcové komprese(d) blokově diagonální komprese5. (1b.) Jaký typ komprese řídkých matic používá Matlab při zapisu v konzole?(a) řádkovou kompresi(b) sloupcovou kompresi(c) souřadnicovou kompresi6. (1b.) Jaký typ komprese řídkých matic používá Matlab vnitřně?(a) řádkovou kompresiObsah236. strana ze 309◭ ◭ ◮ ◮◭◮(b) sloupcovou kompresi(c) souřadnicovou kompresi7. (1b.) Jaký příkaz použijeme <strong>pro</strong> převedení řídké matice na plnou?(a) size(b) fullZavřít dokumentCelá obrazovka ⧸︀ Okno


237(c) sparse(d) spdiag8. (1b.) Jaký příkaz použijeme <strong>pro</strong> převedení plné matice na řídkou?(a) size(b) full(c) sparse(d) spdiag9. (1b.) Jaký příkaz lze použít <strong>pro</strong> zjištění polí (i,j,v) existující řídké matice?(a) sparse(b) full(c) findObsah237. strana ze 309◭ ◭ ◮ ◮◭◮(d) rand10. (1b.) Jaký příkaz lze použít <strong>pro</strong> zobrazení struktury řídké matice?(a) sparse(b) fullZavřít dokumentCelá obrazovka ⧸︀ Okno


238(c) spy(d) rand11. (1b.) Jaký příkaz vrátí počet nenulových prvků v matici?(a) nonzeros(b) sparse(c) size(d) nnz12. (1b.) Mějme plnou matici A se všemi prvky různými od nuly a sestavme matici B=sparse(A).Matice B zabírá v porovnání s původní maticí A v paměti počítače(a) shodnou velikost(b) menší velikostObsah238. strana ze 309◭ ◭ ◮ ◮◭◮(c) větší velikost13. (1b.) Je-li matice A uložena v řídkém formátu, logickou návratovou hodnotu true obdržímepotvrzením příkazu(a) full(A)(b) ~isfull(A)Zavřít dokumentCelá obrazovka ⧸︀ Okno


239(c) issparse(A)(d) sparse(A)Správně zodpovězené otázky:Získané body:Procento úspěšnosti:Obsah239. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


24017.2. Test - algoritmyTest (Algoritmy)1. (1b.) Gaussovu eliminaci můžeme zapsat pomocí:(a) QR rozkladu(b) LU rozkladu(c) Choleského rozkladu(d) SVD rozkladu2. (1b.) Pomocí Gaussovy eliminace se soustava lineárních rovnic převede na:(a) ekvivalentní soustavu s dolní trojúhelníkovou maticí(b) ekvivalentní soustavu s horní trojúhelníkovou maticí3. (1b.) Gaussovu eliminaci řadíme mezi tzv. řešiče:Obsah240. strana ze 309◭ ◭ ◮ ◮◭◮(a) iterační(b) přímé4. (1b.) Co je to pivot při Gaussově eliminaci?(a) první prvek na řádkuZavřít dokumentCelá obrazovka ⧸︀ Okno


241(b) prvek na pozici A i,i , při eliminaci i-tého sloupce(c) první nenulový prvek na řádku5. (1b.) Může být pivot nulový?(a) ANO(b) NE6. (1b.) Proč je důležité začlenit pivotizaci do Gaussovy eliminace?(a) <strong>pro</strong> urychlení výpočtu(b) <strong>pro</strong> stabilizaci výpočtu, řeší situaci nulových pivotů(c) <strong>pro</strong> snazší implementaci7. (1b.) Co je to pivotizace?(a) vyhledávání nulových prvků v maticiObsah241. strana ze 309◭ ◭ ◮ ◮◭◮(b) <strong>pro</strong>hazování řádků matice <strong>pro</strong> urychlení výpočtu při Gaussově eliminaci(c) vhodné <strong>pro</strong>hazování řádků či sloupců matice při Gaussově eliminaci - řeší <strong>pro</strong>blémnulových pivotů8. (1b.) Co jsou přeuspořádávací algoritmy?Zavřít dokumentCelá obrazovka ⧸︀ Okno


242(a) algoritmy, které vhodným přeuspořádáním matice mohou ovlivnit např. řídkostvýsledných faktorů(b) algoritmy, které vhodným <strong>pro</strong>hazováním řádků nebo sloupců matice řeší <strong>pro</strong>blémnulových pivotů9. (1b.) Přeuspořádání matice (u pivotizace nebo přeuspořádávacích algoritmů) se “eviduje”pomocí(a) ortogonálních matic(b) <strong>pro</strong>jetorů(c) permutačních matic nebo vektorů(d) rotačních matic10. (1b.) Choleského rozklad je definován <strong>pro</strong> matice:(a) symetrické positivně (semi)definitníObsah242. strana ze 309◭ ◭ ◮ ◮◭◮(b) positivně (semi)definitní(c) antisymetrické11. (1b.) LDL rozklad je definován <strong>pro</strong> matice:(a) symetrické positivně (semi)definitní(b) positivně (semi)definitníZavřít dokumentCelá obrazovka ⧸︀ Okno


243(c) antisymetrické12. (1b.) Platí, že LU rozklad nelze použít <strong>pro</strong> nesymetrické matice?(a) ANO(b) NE13. (1b.) Ortogonální matice mají ortogonální:(a) řádky(b) sloupce14. (1b.) Které tvrzení není pravdivé? Pro ortogonální matici Q platí:(a) Q T Q = I(b) Q T = Q −1(c) QQ T = IObsah243. strana ze 309◭ ◭ ◮ ◮◭◮15. (1b.) Orthogonalizace matice je popsána:(a) QR rozkladem(b) LU rozkladem(c) Choleského rozklademZavřít dokumentCelá obrazovka ⧸︀ Okno


244(d) SVD rozkladem16. (1b.) Orthogonalizaci můžeme spočítat několika způsoby. Který mezi ně nepatří?(a) Givensova transformace(b) Fourierova transformace(c) Householderova transformace(d) Gramův-Schmidtův <strong>pro</strong>ces17. (1b.) Givensova QR transformace využívá(a) rotace(b) zrcadlení18. (1b.) Householderova QR transformace využívá(a) rotaceObsah244. strana ze 309◭ ◭ ◮ ◮◭◮(b) zrcadlení19. (1b.) Co je to spektrum?(a) množina všech vlastních vektorů matice(b) součet všech vlastních čísel maticeZavřít dokumentCelá obrazovka ⧸︀ Okno


245(c) množina všech vlastních čísel matice20. (1b.) Základní algoritmus <strong>pro</strong> výpočet spektrálního rozkladu využívá:(a) Choleského rozklad(b) QR rozklad<strong>21.</strong> (1b.) Pro urychlení výpočtu spektrálního rozkladu se nevyužívá:(a) redukce na třídiagonální tvar(b) rozklad matice s posunutým spektrem(c) transformace na dolní trojúhelníkovou matici22. (1b.) Pro výpočet singulárního rozkladu lze využít:(a) Choleského rozklad(b) Spektrální rozkladObsah245. strana ze 309◭ ◭ ◮ ◮◭◮(c) LU rozklad23. (1b.) Je-li soustava lineárních rovnic přeurčená, znamená to, že počet rovnic je(a) menší než počet neznámých(b) větší než počet neznámýchZavřít dokumentCelá obrazovka ⧸︀ Okno


246(c) shodný s počtem neznámýchSprávně zodpovězené otázky:Získané body:Procento úspěšnosti:Obsah246. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


24717.3. Test - iterační řešičeTest (Řídké matice)1. (1b.) Pomocí Lanczosovy metody převedeme původní matici na(a) třidiagonální tvar(b) diagonální tvar(c) horní trojúhelníkovou matici(d) dolní trojúhelníkovou matici2. (1b.) Musí být matice, <strong>pro</strong> kterou je použita Lanczosova metoda, symetrická?(a) ANO(b) NE3. (1b.) V inženýrské praxi se s výhodou <strong>pro</strong> matice velkých řádů využívají vlastnostiLanczosovy metody k výpočtu:Obsah247. strana ze 309◭ ◭ ◮ ◮◭◮(a) determinantu(b) vlastních čísel(c) hodnosti(d) spektrálního poloměruZavřít dokumentCelá obrazovka ⧸︀ Okno


2484. (1b.) Který z následujích bodů (úkonů) se nevyskytuje v algoritmu metody sdruženýchgradientů?(a) násobení matice - vektor(b) výpočet inverzní matice(c) výpočet reziduí5. (1b.) Postupně napočítávané vektory reziduí v metodě sdružených gradientů jsou:(a) A-ortogonální(b) ortogonální(c) nulové(d) lineárně závislé6. (1b.) Řešením soustavy Ax = b je takový vektor x, <strong>pro</strong> který funkcionál F (x) == 1 2 xT Ax − x T b:Obsah248. strana ze 309◭ ◭ ◮ ◮◭◮(a) nabývá svého maxima(b) nabývá svého minima(c) je roven nule(d) je zápornýZavřít dokumentCelá obrazovka ⧸︀ Okno


2497. (1b.) V metodě sdružených gradientů jsou vektory báze (tzv. sdružené vektory):(a) A-ortogonální(b) ortogonální(c) nulové(d) lineárně závislé8. (1b.) Metoda sdružených gradientů má obykle v porovnání s Gaussovou eliminací praconostvýpočtu(a) shodnou(b) menší(c) většíObsah249. strana ze 309◭ ◭ ◮ ◮◭◮Správně zodpovězené otázky:Získané body:Procento úspěšnosti:Zavřít dokumentCelá obrazovka ⧸︀ Okno


250Část IIINumerické řešení diferenciálníchrovnicObsah250. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


251Kapitola 18Diferenciální rovnice - motivačnípříkladyObsah251. strana ze 30918.1. Struna◭ ◭ ◮ ◮◭◮Struna je vlákno napnuté mezi dvěma body sloužící jako zdroj zvuku u strunných nástrojůjako je kytara, housle (viz obr. 18.1), loutna, buzuki, basa, ale také například klavír.Zavřít dokumentCelá obrazovka ⧸︀ Okno


252Obr. 18.1Strunné nástroje.Předpokládejme, že struna je objekt, u kterého lze vyjádřit charakteristiky (průřezové,materiálové, geometrické apod.) podélně pomocí jedné nezávisle <strong>pro</strong>měnné. Na obr. 18.2vlevo je struna na levém konci uchycena, na pravém tažena tzv. předepínací silou T (=konst.) a po celé své délce je vertikálně zatížena hustotou sil f. Ačkoliv je ohybová tuhoststruny téměř nulová, <strong>pro</strong>ti příčným výchylkám u působí předepínací sílaT = EA ΔLL ,kde E tzv. je Youngův modul pružnosti (E ocel = 2.1 · 10 5 MPa) charakterizující materiálovévlastnosti, A je plocha průřezu, L je původní délky struny a ΔL je změna délky v důsledkusíly T . Funkce u tedy popisuje průhyb struny. Jsou-li dodrženy předpoklady malých deformací,lze považovat změny velikosti předepínací síly T za zanedbatelné. Například <strong>pro</strong>Obsah252. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


253Obr. 18.2Strunakytarovou strunu E 1 délky 628 mm je při příčném vychýlení bodu o 5 mm v polovině délkyzměna původní předepínací síly menší než 0.7 %.Diferenciální rovnici odvodíme z rovnice rovnováhy na části struny, kterou dostanemedvěma řezy ve vzdálenosti x a x + h (obr. 18.2 vpravo), účinky odejmutých částí jsounahrazeny silami T . Předpokládá se, že předepínací síla je neměnná po celé délce struny.V y-ovém směru pak platí rovnice rovnováhy∑︁∫︁ x+hFiy = 0 = −T sin (α(x)) + T sin (α(x + h)) + f(ξ)dξ. (18.1)Pro spojitou primitivní funkci f(ξ) na intervalu ξ ∈ (x, x + h) z věty o střední hodnotěintegrálního počtu platí rovnost1limh→0h∫︁ x+hxf(ξ)dξ = f(x).xObsah253. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


254Dále využijeme přibližné vztahy <strong>pro</strong> malé úhly. Je-li α dostatečně malé, pak sin (α) ≈ αa také tg (α) ≈ α, resp. sin (α) ≈ tg (α). Jelikož u ′ (x) = du(x)dx= tg (α(x)), kde tg (α(x)) jesměrnice tečny funkce v bodě x, rovnice (18.1) přejde po úpravě do tvaru− (︀ T u ′ (x + h) − T u ′ (x) )︀ =∫︁ x+hxf(ξ)dξ.Rovnici rovnováhy v bodě x získáme limitním přechodem <strong>pro</strong> h → 0který vede nalim − T u′ (x + h) − u ′ (x)h→0 h1= limh→0 h∫︁ x+hxf(ξ)dξ,− T u ′′ = f. (18.2)Odvození diferenciální rovnice druhého řádu popisuje vztah hustoty sil f a předepínacísily T k průhybu struny u(x). Chování v krajních bodech struny popisují tzv. okrajovépodmínky. Je-li na obou koncích struna uchycena (u(0) = u 0 , u(L) = u n ), jedná se o tzv.Dirichletovu podmínku. Je-li na některém konci zadaná síla, jedná se o tzv. Neumannovupodmínku (např. −T u ′ (L) = g).Obsah254. strana ze 309◭ ◭ ◮ ◮◭◮18.2. MembránaPopišme úlohu průhybu membrány, u které rovnice rovnováhy v libovolném bodě tělesa vedena tzv. Poissonovu rovnici. Přes korpus bubnu je natažena membrána (umělá nebo koženáblána), která je výrazně předepnuta. Zaveďme souřadnicový systém, jehož osy x a y ležív rovině membrány. V obecném místě je vyjmut obdélníkový element o stranách h x a h y(obr. 18.3), na jehož hranách je účinek odejmutých částí nahrazen silami (ΔT ).Zavřít dokumentCelá obrazovka ⧸︀ Okno


255ObsahObr. 18.3Membrána.Rovnice rovnováhy <strong>pro</strong> z-ový směr je∑︀Fiz = 0ΔT yzsin * (α yz (x, y + h)) − ΔT yz sin (α yz (x, y)) ++ΔT xzsin * (α xz (x + h, y)) − ΔT xz sin (α xz (x, y)) +Z věty o střední hodnotě dostáváme+ ∫︀ x+h xx∫︀ y+hyyf(ξ, ζ)dξdζ.(18.3)255. strana ze 309◭ ◭ ◮ ◮◭◮limh x→0limh y→0∫︁1 x+hx ∫︁ y+hyf(ξ, ζ)dξdζ = f(ξ, ζ) (18.4)h x h y x yZavřít dokumentCelá obrazovka ⧸︀ Okno


256Bez vnějšího zatížení je v membráně přítomno napětíσ(x, y) = (σ x (x, y), σ y (x, y)) T = (γ, γ) T ,které souvisí s počátečním předpětím a předpokládá se, že je konstantní. Hustotou sil fje membrána deformována ve vertikálním směru, přičemž vzniklé posuvy ve směru osy zneovlivní pole napětí v rovině xy (teorie malých deformací). Síla ΔT xz a ΔT xz * je rovnaintegráluy+h∫︁ yΔT xz = ΔT xz * = γ dζ = h y γ. (18.5)Obdobně <strong>pro</strong> směr kolmýΔT yz = ΔT * yz = γy∫︁x+h xxdξ = h x γ. (18.6)Pro malé úhly je sin (α xz (x, y)) ≈ tg (α xz (x, y)) = ∂∂u(x,y)∂∂x. S úpravou a substitucemi píšemerovnici rovnováhy ve tvaru−γ [︂ (︂ )︂ (︂ )︂]︂∂∂u(x + hx , y) ∂∂u(x, y) ∂∂u(x, y + hy ) ∂∂u(x, y)h y − + h x −h x h y ∂∂x ∂∂x∂∂y ∂∂y= 1 ∫︁∫︁f(ξ, ζ)dξdζ (18.7)h x h ya limitním přechodemObsah256. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


257(︂− γ limhx→0= limhx→0(︂1 ∂∂u(x + hx , y)h x ∂∂xlimhy→0∫︁∫︁1h x h y−)︂∂∂u(x, y)+ lim∂∂xhy→0(︂1 ∂∂u(x, y + hy )−h y ∂∂y)︂)︂∂∂u(x, y)∂∂yf(ξ, ζ)dξdζ (18.8)dostáváme rovnici rovnováhy v bodě [x, y] ve známém tvaru Poissonovy rovnice ve 2D− ∂∂2 u(x, y)∂∂x 2− ∂∂2 u(x, y)∂∂y 2 = 1 f(x, y). (18.9)γChování na okraji membrány stejně jako <strong>pro</strong> strunu popisují tzv. okrajové podmínky. Je-limembrána na okrajích uchycena (u = u 0 , <strong>pro</strong> x, y ∈ Γ), jedná se o tzv. Dirichletovupodmínku . Je-li na části hranice zadaná síla, jedná se o tzv. Neumannovu podmínku (např.−T u ′ (L) = g).Obsah257. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


258Kapitola 19Metoda sítíObsahMetoda sítí (také metoda konečných diferencí) je numerický způsob řešení diferenciálníchrovnic. Oblast pokryjeme pravidelnou (ve 2D obdélníkovou) sítí a objekty v diferenciálnírovnici nahradíme jejich hodnotami v uzlech sítě. Původní <strong>pro</strong>blém tak převedeme na soustavulineárních rovnic, jejíž řešení odpovídá hodnotám neznáme veličiny v uzlech sítě.258. strana ze 309◭ ◭ ◮ ◮◭◮19.1. Metoda sítí v 1DV mechanice se metoda sítí v 1D používá například k řešení nosníků či rovnice <strong>pro</strong> dříveodvozenou strunu. Formálně shodnou rovnicí je popsáno stacionární vedení tepla nebo šířeníkoncentrace.Zavřít dokumentCelá obrazovka ⧸︀ Okno


259Analýza <strong>pro</strong>blémuUvažujme rovnici rovnováhy struny délky L v diferenciálním tvaru odvozenou v sekci 18s jednotkovou předepínací silou− u ′′ = f (19.1)a upevněnou na obou koncích u(0) = u(L) = 0. Přibližný vztah <strong>pro</strong> a<strong>pro</strong>ximaci druhéderivace řešení lze odvodit z Taylorova rozvoje funkce u v okolí bodu x. Hodnota funkce u<strong>pro</strong> bod x + h je potéu(x + h) = u(x) + u ′ (x) h 1! + u′′ (x) h22! + C 1(h 3 ), (19.2)kde C 1 (h 3 ) je člen, který <strong>pro</strong> dostatečně malé h lze zanedbat. Obdobně <strong>pro</strong> x − h jeu(x − h) = u(x) − u ′ (x) h 1! + u′′ (x) h22! + C 2(h 3 ). (19.3)Odečtením obou výrazů a zanedbáním členů vyšších řádů získáme a<strong>pro</strong>ximaci první derivacefunkce u ve tvaruu ′ u(x + h) − u(x − h)(x) ≈ (19.4)2ha sečtením a<strong>pro</strong>ximací druhé derivaceu ′′ (x) ≈u(x − h) − 2u(x) + u(x + h)h 2 . (19.5)Nyní strunu délky L rozděleme pravidelně na n dílků (viz obr. 19.1). s krokem diskretizaceh. Hodnoty řešení v uzlech x i označme u i a nechť f i = f (x i ). Užitím tohoto značeníObsah259. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


260Obr. 19.1Rozložení uzlů sítě.a dosazením (19.5) do (19.1) <strong>pro</strong> uzly i = 1, 2, ..., n−1 dostáváme soustavu lineárních rovnic− (u 0 − 2u 1 + u 2 ) = h 2 f 1− (u 1 − 2u 2 + u 3 ) = h 2 f 2.− (u i−1 − 2u i + u i+1 ) = h 2 (19.6)f i.− (u n−2 − 2u n−1 + u n ) = h 2 f n−1Obsah260. strana ze 309◭ ◭ ◮ ◮◭◮s neznámými u i , i = 1, ..., n = 1 a zadanými průhyby v krajních bodech u(0) = u(L) = 0.Zavřít dokumentCelá obrazovka ⧸︀ Okno


261Převedením posunutí na pravou stranu dostáváme soustavu lineárních rovnic⎛⎞2 −1 0 · · · 0 ⎛ ⎞ ⎛u 1h 2 ⎞f 1 + u 0−1 2 −1 0 .. 0 −1 2 −1 ..u 2h 2 f 2u 3h 2 f 3. 0 −1 .. . .. =.0⎜ .⎟ ⎜ .⎟⎜ .⎝ . .. . .. ⎟ ⎝ u n−2⎠ ⎝ h 2 f n−2⎠2 −1 ⎠u n−1 h 2 f n−1 + u n0 · · · 0 −1 2Tuto soustavu označíme Au = f. K výpočtu lze použít z přímých řešičů např. Gaussovu eliminaci(viz kapitola 8), nebo některou z iteračních metod jako metoda sdružených gradientů(viz kapitola 16) nebo metoda největšího spádu apod.AnimaceV aplikaci Lineární algebra - interaktivní animace v záložce Metoda sítí 1D je příkladstruny uchycené na volných koncích řešený pomocí metody sítí. Pro použití apletu jenutné nainstalovat CDF player.Příklad 19.1. Určete <strong>pro</strong>hnutí struny délky L = 1 [m] uchycené na obou koncích a zatíženésilou o hustotě f(x) = sin(x) [N/m].Příslušná {︃ okrajová úloha:−u ′′ = sin(x), x ∈ (0, L).u (0) = u (1) = 0Obsah261. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


262Algoritmus 19.1Metoda sítífunction struna1D_sit (L,N)%% popis ulohy% L % delka struny% N % pocet prvku siten = N +1; % pocet uzluh = L/N; % krok sitex = (0: h:L) ’; % souradnice uzlu% -u ’ ’= f, u (0) =0 , u(L) =0; % rovnice struny% x z % interval% f = sin (x) % zatizeni%% Sestaveni ridke matice Ae = ones (n -2 ,1) ;A = spdiags ([ -e 2*e -e], [ -1 0 1] , n -2 , n -2) ;%% vektor prave stranyb = eval (’h ^2* sin (x (2: end -1) )’);%% numericke reseniu=A \b;u =[0; u ;0];%% analyticke reseniu_analytic =@(x) ( sin (x)-sin (L)*x/L);%% vykreslenifigure (1) ,plot (x,u,’r.’),hold on , ezplot ( u_analytic ,[0 ,L]); hold offfigure (2) ,plot (x,abs (u- u_analytic (x)),’.-’),xlabel (’x’)fprintf (’Chyba reseni %3.2 e\n’,norm (u- u_analytic (x)));Obsah262. strana ze 309◭ ◭ ◮ ◮◭◮Analytické a numerické řešení příkladu <strong>pro</strong> N = 10 je na obr. 19.2, chyba v normě 2 jena obr. 19.3.Zavřít dokumentCelá obrazovka ⧸︀ Okno


263(sin(x)−sin(L) x/L)0.060.050.040.030.020.010analytické řešenímetoda sítí0 0.5 1xObr. 19.2Numerické a analytické řešení432100 0.5 15 x 10−5 xObr. 19.3Chyba řešeníObsah263. strana ze 309◭ ◭ ◮ ◮◭◮19.2. Metoda sítí ve 2DMetoda sítí ve 2D je vhodná např. <strong>pro</strong> řešení Poissonovy rovnice, která v mechanice popisujerovnováhu sil v libovolném bodě membrány, nebo také vedení tepla v rovině atd. Ačkolivposkytuje pouze přibližné numerické řešení, v mnoha případech jde <strong>pro</strong> složitost úlohyo jediné možné, které lze získat. Metoda sítí je silně omezena tvarem oblasti, na které seúloha řeší.Zavřít dokumentCelá obrazovka ⧸︀ Okno


264Analýza <strong>pro</strong>blémuUvažujme úlohu napínání membrány na čtverci o straně délky L (viz obr. 19.4){︃−△u = f <strong>pro</strong> ∀(x, y) ∈ Ω = (0, L) × (0, L)u(x, y) = 0 <strong>pro</strong> ∀(x, y) ∈ ∂∂Ω,(19.7)ve které podmínka u(x, y) = 0 <strong>pro</strong> ∀(x, y) ∈ ∂∂Ω zohledňuje uchycení na korpusu bubnu(hranici oblasti). Parciální derivaci u podle x a y odvodíme pomocí Taylorova rozvoje.Hodnota funkce u <strong>pro</strong> bod (x + h, y) jeu(x + h, y) = u(x, y) + ∂∂∂∂x u(x, y) h 1! + ∂∂2u(x, y)h2∂∂x2 2! + C 1(h 3 ),a <strong>pro</strong> (x − h, y)u(x − h, y) = u(x, y) − ∂∂∂∂x u(x, y) h 1! + ∂∂2u(x, y)h2∂∂x2 2! + C 2(h 3 ).Sečtením výrazů a zanedbáním členů vyšších řádů (︀ C 1 (h 3 ), C 2 (h 3 ) )︀ obdržíme přibližnývztah druhé derivace u podle x ve tvaruObsah264. strana ze 309◭ ◭ ◮ ◮◭◮∂∂ 2 u(x − h, y) − 2u(x, y) + u(x + h, y)u(x, y) ≈∂∂x2 h 2 .Druhá derivace u podle y pak bude obdobně∂∂ 2 u(x, y − h) − 2u(x, y) + u(x, y + h)u(x, y) ≈∂∂y2 h 2 .Zavřít dokumentCelá obrazovka ⧸︀ Okno


265Obsah265. strana ze 309◭ ◭ ◮ ◮◭◮Obr. 19.4Síť ve 2D.Zavřít dokumentCelá obrazovka ⧸︀ Okno


266Nyní rozdělme čtverec o straně délky L na menší čtverce s krokem diskretizace h. Hodnotyřešení v uzlech (x i , y j ) = (x 0 + ih, y 0 + jh) označme u i,j a nechť f i,j = f (x i , y j ). Přibližnévztahy <strong>pro</strong> druhé derivace u v okolí bodu (x i , y j ) se přepíší do tvaru∂∂ 2∂∂x 2 u (x i, y j ) ≈ u i−1,j − 2u i,j + u i+1,jh 2∂∂ 2∂∂y 2 u (x i, y j ) ≈ u i,j−1 − 2u i,j + u i,j+1h 2 . (19.8)Membrána je na krajích pevně uchycena a tedy u k,0 = u 0,k = u k,n = u n,k = 0 <strong>pro</strong> k == 0, 1, ..., n. Dříve odvozenou rovnici rovnováhy v libovolném uzlu sítě můžeme psát vetvaru− u i−1,j − u i,j−1 + 4u i,j − u i+1,j − u i,j+1 = h 2 f i,j . (19.9)Obsah266. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


267Podle obr. 19.4 zavádíme indexové množiny ˜I = {2, ..., n − 2} a dostáváme tyto rovnice:a) 4u 1,1 − u 2,1 − u 1,2 = h 2 f 1,1 + u 0,1 + u 1,0b) −u 1,j−1 + 4u 1,j − u 1,j+1 − u 2,j = h 2 f 1,j + u 0,j j ∈ ˜Ic) −u 1,n−2 + 4u 1,n−1 − u 2,n−1 = h 2 f 1,n−1 + u 0,n−1 + u 1,nd) −u i−1,1 + 4u i,1 − u i+1,1 − u i,2 = h 2 f i,1 + u i,0 i ∈ ˜Ie) −u n−2,1 − u n−1,2 + 4u n−1,1 = h 2 f n−1,1 + u n−1,0 + u n,1f) −u n−2,j − u n−1,j−1 + 4u n−1,j − u n−1,j+1 = h 2 f n−1,j + u n,j j ∈ ˜Ig) −u i−1,n−1 − u i,n−2 + 4u i,n−1 − u i+1,n−1 = h 2 f i,n−1 + u i,n i ∈ ˜Ih) −u n−1,n−2 − u n−2,n−1 + 4u n−1,n−1 = h 2 f n−1,n−1 + u n−1,n + u n,n−1i) −u i−1,j − u i,j−1 + 4u i,j − u i+1,j − u i,j+1 = h 2 f i,j i, j ∈ ˜IJednotlivé rovnice v uzlech zapíšeme maticově a to tak, že uzly sítě jsou <strong>pro</strong>cházeny postupněpo sloupcích tvořených uzly {(x m , y 1 ) , (x m , y 2 ) , ..., (x m , y n−1 )}. Hodnoty průhybů v uzlechjsou pak řazeny stejným způsobemObsah267. strana ze 309◭ ◭ ◮ ◮◭◮u = ((u 1,1 , u 2,1 , ..., u n−1,1 ) , (u 1,2 , u 2,2 , ..., u n−1,2 ) , ..., (u 1,n−1 , u 2,n−1 , ..., u n−1,n−1 )) T ,Zavřít dokumentCelá obrazovka ⧸︀ Okno


268čemuž také odpovídá řazení prvků v matici A z předešlé soustavy rovnic a můžeme ji psátve tvaru⎛u 1,1:n−1u 2,1:n−1u n−1,1:n−1⎞⏞ ⏟ ⏞ ⏟⏞ ⏟4 −1 · · · 0 −1 0 0 00 0 · · · 0. −1 4 .. . 0 −1 .0 0 .. . .. . .. .· · ·−1 . .. . 00 .. 00 · · · −1 4 0 · · · 0 −1 0 · · · 0 0−1 0 0 0 4 −1 · · · 00 0 · · · 0. 0 −1 . −1 4 .. .0 0 .A =. . .. . 0 . .. .· · ·.. . .−1 0 .. 00 · · · 0 −1 0 · · · −1 40 · · · 0 0. .... .0 0 · · · 0 0 0 · · · 04 −1 · · · 0. 0 0 . 0 0 . −1 4 .. .⎜⎝.0 .. .· · ·0 0 .. . 0. .. . ..⎟−1 ⎠0 · · · 0 0 0 · · · 0 00 · · · −1 4Obsah268. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


269Konečně vektor pravé strany téže soustavy vypadá následovně⎛ ⎛h 2 ⎞f 1,1 + u 0,1 + u 1,0h 2 f 1,2 + u 0,2⎜⎟⎝.⎠h 2 f 1,n−1 + u 0,n−1 + u 1,n ⎛h 2 ⎞f 2,1 + u 2,0h 2 f 2,2f =⎜⎟⎝ . ⎠h 2 f 2,n−1 + u 2,n ⎛.h 2 ⎞f n−1,1 + u n−1,0 + u n,1⎜h 2 f n−1,2 + u n,2⎜⎟⎝ ⎝.⎠h 2 f n−1,n−1 + u n,n−1 + u n−1,n⎞,⎟⎠Obsah269. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


270nebo po dosazení⎛f =h 2 ⎜⎝⎛⎜⎝⎛⎜⎝⎛⎜⎝⎞f 1,1f 1,2⎟. ⎠f 1,n−1⎞f 2,1f 2,2⎟. ⎠f 2,n−1.⎞f n−1,1f n−1,2⎟. ⎠f n−1,n−1⎞.⎟⎠Obsah270. strana ze 309◭ ◭ ◮ ◮◭◮AnimaceV aplikaci Lineární algebra - interaktivní animace v záložce Metoda sítí 2D je příkladmembrány uchycené na volných koncích řešený pomocí metody sítí. Pro použití apletuje nutné nainstalovat CDF player.Příklad 19.2. Určete průhyb mebrány uchycené na čtvercovém rámečku o straně délkyL = 1 [m] a zatížené silou o hustotě f(x) = −1 [N/m 2 ].Příslušná okrajová úloha:Zavřít dokumentCelá obrazovka ⧸︀ Okno


271{︃−Δu(x, y) = −1 ∀(x, y) ∈ Ω = (0, 1) × (0, 1).u(x, y) = 0 <strong>pro</strong> ∀(x, y) ∈ ∂∂ΩObsah271. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


272Algoritmus 19.2Algoritmus metody sítí - membránafunction membrana2D_sit (N)% N ... pocet elementu na hranu oblasti jednotkoveho ctverce%% Rovnice% -(d ^2/ dx ^2+ d ^2/ dy ^2) u=f, f = -1; Lx=Ly =1; u=0 na hranici%% Pomocne konstantyn=N -1; % pocet vnitrnich uzlu na hranu ( bez u_gamma )np=n ^2; % pocet vsech vnitrnich uzluh =1/ N; % krok site%% Efektivni sestaveni ridke matice Ae0 = 4* ones (np ,1) ;e2 = -ones (np ,1) ;e1h = -ones (np ,1) ; e1h ((n+1) :n: end ) =0;e1d = -ones (np ,1) ; e1d (n:n: end ) =0;A = spdiags ([e2 ,e1d ,e0 ,e1h ,e2 ],[-n , -1 ,0 ,1 ,n],np ,np);%% Vektor prave stranyf = -ones (np ,1) *h ^2;%% Vypocet u ( vnitrni uzly )u=A\f;%% vizualizacex =0: h :1; y =0: h :1; % souradnice[X,Y]= meshgrid (x,y);U=[ zeros (1 ,N +1) ;...zeros (n ,1) ,...reshape (u,n ,[]) ,...zeros (n ,1) ; zeros (1 ,N +1) ];surf (X,Y,U,’FaceColor ’,’interp ’)Výsledky příkladu <strong>pro</strong> N = 25 vidíme na obr. 19.5.Obsah272. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


2730−0.02u−0.04Obsah−0.06273. strana ze 309−0.0810.50.51◭ ◭ ◮ ◮◭◮y00xObr. 19.5Řešení.Zavřít dokumentCelá obrazovka ⧸︀ Okno


274Kapitola 20Metoda konečných prvkůObsahMetoda konečných prvků (MKP) je nejrozšířenější numerickou metodou určenou k přibližnémuřešení diferenciálních rovnic. Obdobně jako metoda sítí i MKP převádí původní eliptickouokrajovou úlohu na soustavu lineárních rovnic, jejímž řešením získáme přibližné řešenízadané úlohy. Existuje pouze málá skupina inženýrských <strong>pro</strong>blémů popsaných parciálnímidiferenciálními rovnicemi, u kterých je známo analytické řešení. Společným jmenovatelemv těchto případech je vhodný tvar oblasti, na které se řešení hledá (platí <strong>pro</strong> základní geometrickétvary jako čtverec, kruh, krychle, koule, válec apod.), ale také vhodná pravá stranaa okrajové podmínky. Ve všech ostatních případech je nutné užít numerické řešení. Hlavnímyšlenka MKP je rozdělit původní oblast na menší tzv. konečné prvky, kterými je možnépokrýt v podstatě libovolný tvar, což upřednostňuje tento přístup nad metodu sítí.274. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


27520.1. Metoda konečných prvků v 1DNa rozdíl od metody sítí se v MKP nediskretizuje přímo původní okrajová úloha danárovnicí rovnováhy, ale její tzv. slabá formulace.Odvození slabé formulaceŘešme rovnici struny uchycené na obou koncích, tj. úlohu{︃−u ′′ (x) = f(x) <strong>pro</strong> ∀x ∈ (0, 1)u(0) = u(1) = 0,kde <strong>pro</strong> jednoduchost uvažujeme u ∈ C 2 ((0, 1)) a f ∈ C ((0, 1)) s jednotkovou předepínacísilou T = 1. Zaveďme <strong>pro</strong>stor <strong>test</strong>ovacích funkcíV = {︀ v ∈ C 1 ((0, 1)) |v(0) = v(1) = 0 }︀ .Vynásobením direrenciální rovnice s <strong>test</strong>ovací funkcí obdržíme rovnostObsah275. strana ze 309◭ ◭ ◮ ◮◭◮−u ′′ (x)v(x) = f(x)v(x) <strong>pro</strong> ∀x ∈ (0, 1), ∀v ∈ V.Výraz na levé i pravé straně dále integrujeme přes zadanou oblast a k integraci použijememetodu per partes− ∫︀ 10 u′′ (x)v(x)dx = ∫︀ 1f(x)v(x)dx, ∀v ∈ Va aplikujeme metodu per partes− [u ′ (x)v(x)] 1 0 + ∫︀ 10 u′ (x)v ′ (x)dx = ∫︀ 10f(x)v(x)dx, ∀v ∈ V.0Zavřít dokumentCelá obrazovka ⧸︀ Okno


276Z vlastností funkce v je člen [u ′ (x)v(x)] 1 0<strong>pro</strong> obě meze nulový. Výsledná formulace vypadánásledovně:{︃najdi u ∈ V takové, že(20.1)a(u, v) = b(v) ∀v ∈ V,kdea(u, v) = ∫︀ 10 u′ (x)v ′ (x)dx a b(v) = ∫︀ 10 f(x)v(x)dx,jsou symetrická pozitivně definitní bilineární forma a lineární funkcionál.DiskretizaceOznačme posunutí v krajních bodech strunyObsaha množinu uzlů sítěu (x 0 ) = u 0 , u (x n ) = u nS h = {x 0 , . . . , x n } , x i = x 0 + ih, i = 0, . . . , n. (20.2)276. strana ze 309◭ ◭ ◮ ◮◭◮Výpočetní oblast (v 1D interval) je pokryta n T = n konečnými prvky tvořícíT h = n T⋃︀−1τ i , τ i = ⟨x i , x i+1 ⟩ . (20.3)i=0Při ekvidistantním kroku jsou délky všech konečných prvků rovny h. A<strong>pro</strong>ximace průhybuu(x) je realizována spojitou po částech lineární funkcíu i (x) = a i x + b i , ∀x ∈ τ i , u i (x) = 0 ∀x /∈ τ i i = 0, 1, ..., n T − 1. (20.4)Zavřít dokumentCelá obrazovka ⧸︀ Okno


277Obr. 20.1Diskretizace.Obsah277. strana ze 309◭ ◭ ◮ ◮◭◮Obr. 20.2Konečný prvek.Zavřít dokumentCelá obrazovka ⧸︀ Okno


278Pro i-tý prvek obdržíme posuvy v uzlech dosazením příslušných souřadnic (viz obr. 20.2)u i = u i (x i ) = a i x i + b iu i+1 = u i (x i+1 ) = a i x i+1 + b ia ze dvou rovnic o dvou neznámých spočteme konstantyZpětným dosazením dostávámea i = 1 h (u i+1 − u i ) , b i = − 1 h (x iu i+1 − x i+1 u i ) .u i (x) = 1 h (u i+1 − u i ) x i − 1 h (x iu i+1 − x i+1 u i ) .Lokální matice tuhostiPro další popis využijeme ekvivalence slabé formulace s tzv. energetickou formulací (důkaznaleznete např. v [5]). Úkol zní následovně:najdi u ∈ V : a(u, v) = b(v), ∀v ∈ V ⇐⇒ minu∈VDiskretizací bilineární formy dostávámea(u, u) =n−1∑︁i=0∫︁ 10(︀u ′ (x) )︀ n−1∑︁2 dx =i=0∫︁x i+1x i1a(u, u) − b(u). (20.5)2(︀u ′ (x) )︀ 2 dx ≈x∫︁i+1(︀u′i (x) )︀ ∫︁12 (︀dx = u′h (x) )︀ 2 dx = a(uh , u h ),x i0Obsah278. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


279kde u h (x) ∀x ∈ τ i je po částech lineární funkce a<strong>pro</strong>ximace řešení u. Derivace funkce posuvůu h <strong>pro</strong> i-tý prvek jeu ′ i(x) = (a i x + b i ) ′ = a i = 1 h (−u i + u i+1 ) = 1 (︂ )︂h (−1, 1) uiu i+1a <strong>pro</strong> krajní elementyNyní si vyjádříme člen (u ′ i (x))2 ve tvarua integrujeme nad i-tým prvkemx∫︁i+1u ′ 0(x) = a 0 = u 1h , u′ n−1(x) = a n−1 = −u n−1.h(︀u′i (x) )︀ T (︀u′i (x) )︀ = 1 h 2 (u i, u i+1 )(︂ 1 −1−1 1(︀u′i (x) )︀ T (︀u′i (x) )︀ dx = 1 h 2 (u i, u i+1 ) ⎜⎝x iPrvky matice jsou rovny integrálužex∫︀i+1x i⎛x∫︀i+1)︂ (︂dx −x ix∫︀i+1 ∫︀− dxx ix∫︀i+1x ix i+1x i)︂uiu i+1dxdx⎞(︂⎟⎠)︂ui.u i+1dx, mimodiagonální členy jsou záporné. Jelikož platí,x∫︁i+1x idx = h,Obsah279. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


280po úpravě obdržímex∫︁i+1x i(︀u′i (x) )︀ 2 dx = (ui , u i+1 ) A i(︂uiu i+1)︂,kdeA i = 1 h(︂ 1 −1−1 1)︂(20.6)je tzv. lokální matice tuhosti.Globální matice tuhostiGlobální matice tuhosti se sestavuje postupně z příspěvků všech prvků sítě, tj.⎛⎞0 · · · 0 · · · 0 · · · 0. . .. . . .∑︁n T ∑︁n T10 · · · 1 · · · −1 · · · 0A = à i =.h. . .. . ., (20.7)i=1 i=10 · · · −1 · · · 1 · · · 0⎜⎝.. . . ..⎟. ⎠0 · · · 0 · · · 0 · · · 0kde à je rozšíření A i nulami na velikost (n + 1) × (n + 1) globální matice. Pro strunus krokem sítě h má globální matice tvarObsah280. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


281⎛A = 1 h⎜⎝1 −1 0−1 2 −10 −1 22 −1−1 1⎞. (20.8)⎟⎠Tato matice je pozitivně semidefinitní a lze ji regularizovat zohledněním okrajových podmínek.Lokální vektor zatíženíVektor zatížení obdržíme rozepsáním členu lineárního funkcionálub(u) =∫︁ 10u(x)f(x)dx =n−1∑︁i=0∫︁x i+1x iu(x)f(x)dx ≈n−1∑︁i=0x∫︁i+1x iu i (x)f(x)dx = b(u h ).Obsah281. strana ze 309◭ ◭ ◮ ◮◭◮Funkci u i (x) zapíšeme ve tvaru(︂u i (x) = 1 h (x i+1 − x, x − x i ))︂uiu i+1Zavřít dokumentCelá obrazovka ⧸︀ Okno


282a <strong>pro</strong>násobíme s f(x). Intgrací přes τ i dostaneme⎛x∫︁i+1u i (x) T f(x)dx = 1 h (u i, u i+1 ) ⎜⎝x ix∫︀i+1x ix i+1∫︀x if(x) (x i+1 − x) dxf(x) (x − x i ) dx⎞⎟⎠ ,kde⎛f i = 1 ⎜h ⎝x∫︀i+1x ix i+1∫︀x if(x) (x i+1 − x) dxf(x) (x − x i ) dx⎞⎟⎠(20.9)je tzv. lokální vektor zatížení i-tého prvku.V řadě případů si vystačíme s přibližným výpočtem integrálu některou z numerickýchmetod. Např. <strong>pro</strong> tzv. obdélníkové pravidlo je první člen lokálního vektoru zatížení∫︁x i+1x if(x) (x i+1 − x) dx ≈ h · f(x s ) (x i+1 − x s ) = h22 f(x s),Obsah282. strana ze 309◭ ◭ ◮ ◮◭◮kde x s = (x i + x i+1 )/2 je souřadnice těžiště prvku.Zavřít dokumentCelá obrazovka ⧸︀ Okno


283Globální vektor zatíženíGlobální vektor zatížení f se sestavuje obdobně jako globální matice tuhosti . Za i-tý prvekse na pozice i a i + 1 přičte lokální příspěvek f i = (︀ f i 1 , f i 2)︀ T , tj.⎛x 1⎞∫︀f(x) (x 1 − x) dxx 0 .n−1∑︁f = f i = 1 ∫︀x ix∫︀i+1f(x) (x − x i−1 ) dx + f(x) (x i+1 − x) dx.hxi=0i−1 x i.⎜x⎝∫︀ n⎟⎠f(x) (x − x n−1 ) dxx n−1Poznámka 20.1. Zadané Dirichletovy podmínky u(0) = u(1) = 0 předepisují průhybv koncových uzlech.Obsah283. strana ze 309◭ ◭ ◮ ◮◭◮AnimaceV aplikaci Lineární algebra - interaktivní animace v záložce MKP 1D je příkladstruny uchycené na volných koncích řešený pomocí metody konečných prvků. Pro použitíapletu je nutné nainstalovat CDF player.Příklad 20.2. Řešme příklad 19.1 <strong>pro</strong> N = 10 pomocí MKP.Zavřít dokumentCelá obrazovka ⧸︀ Okno


284Algoritmus 20.1MKP - strunafunction struna1D_MKP (L,N)%% popis ulohy% N % pocet prvku site% L % delka strunyn = N +1; % pocet uzluh = L/N; % krok sitex = (0: h:L) ’; % souradnice uzlu% -u ’ ’= f, u (0) =0 , u(L) =0; % rovnice struny% x z % intervalf = @(x) sin (x); % hustota sil%% Sestaveni plne matice AA = zeros (n);b= zeros (n ,1) ;A_local =[1 -1; -1 1]/ h; % lokalni matice tuhosti% integral v b_local pocitan lichobeznikovym pravidlemfor i = 1 : N % cyklus pres prvky siteA([i,i +1] ,[i,i +1]) =A([i,i +1] ,[i,i +1]) + A_local ;x_s =0.5*( x(i)+x(i +1) ); % souradnice tezisteb_local = 0.5* h*f( x_s ) *[1;1];b([i,i +1]) =b([i,i +1]) + b_local ;end%% zohledneni okrajovych podminek v matici A a vektoru bA([1 ,n] ,:) =0; A(: ,[1 ,n]) =0; A (1 ,1) =1; A(n,n) =1;b (1) =0; b(n) =0;%% numericke reseniu=A\b;%% analyticke reseniu_analytic =@(x) sin (x)-sin (L)*x/L;%% vykreslenifigure (1) ,plot (x,u,’r.’),hold on , ezplot ( u_analytic ,[0 ,L]); hold offfigure (2) ,plot (x,abs (u- u_analytic (x)),’.-’),xlabel (’x’)Obsah284. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


285fprintf (’Chyba reseni %3.2 e\n’,norm (u- u_analytic (x)));Numerické a analytické řešení je na obr. 20.3 a chyba MKP od přesného řešení v uzlech sítěv normě 2 je na obr. 20.4.(sin(x)−sin(L) x/L)0.060.050.040.030.020.010analytické řešenímkp0 0.5 1xx 2 41.510.500 0.5 12.5 10−5 xObsah285. strana ze 309◭ ◭ ◮ ◮◭◮Obr. 20.3Numerické a analytické řešeníObr. 20.4Chyba řešení20.2. Metoda konečných prvků ve 2DStejně jako v 1D se diskretizuje slabá formulace úlohy.Zavřít dokumentCelá obrazovka ⧸︀ Okno


286Odvození slabé formulaceŘešme následující <strong>pro</strong>blém:kde−△u = f <strong>pro</strong> ∀(x, y) ∈ Ωu(x, y) = 0 <strong>pro</strong> ∀(x, y) ∈ ∂∂Ω,(20.10)Zaveďme <strong>pro</strong>stor <strong>test</strong>ovacích funkcíf ∈ C(Ω), u ∈ C 2 (Ω).V = {︀ v ∈ C 1 (Ω) |v = 0 na ∂∂Ω }︀a vynásobme rovnici rovnováhy sil membrány s funkcí v− ∂∂2 u∂∂x 2 v − ∂∂2 uv = fv na Ω, ∀v ∈ V.∂∂y2 Pravou a levou stranu integrujeme na oblasti Ω∫︁ (︂ ∂∂ 2 )︂ ∫︁u−∂∂x 2 v + ∂∂2 u∂∂y 2 v dΩ =ΩΩfv dΩ, ∀v ∈ V.Pomocí Greenovy formule upravíme rovnici∫︁ (︂ ∂∂u ∂∂v∂∂x ∂∂x + ∂∂u )︂ ∫︁ (︂∂∂v∂∂udΩ −∂∂y ∂∂y∂∂x n xv + ∂∂u )︂ ∫︁∂∂y n yv ds =Ω∫︁a(u, v) =Ω∂∂ΩΩfv dΩ, ∀v ∈ V.(︂ ∂∂u ∂∂v∂∂x ∂∂x + ∂∂u )︂∫︁ ∫︁ (︂∂∂v∂∂udΩ, b(v) = fv dΩ +∂∂y ∂∂yΩ∂∂Ω ∂∂x n xv + ∂∂u )︂∂∂y n yv ds.Obsah286. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


287Obr. 20.5Konečný prvek.ObsahTrianglulace oblastiUvažujme čtvercovou oblast (viz obr. 20.6) rozloženou na trojúhelníky. Označme uzly sítěS h = {P 1 , ..., P n }. (20.11)287. strana ze 309◭ ◭ ◮ ◮◭◮Triangulizací rozumíme rozdělení oblasti T h na konečné prvky t k o třech vrcholech. Jsou-liobě strany čtvercové oblasti rozděleny na n uzlů, <strong>pro</strong> konečné prvky platíT h =n T ⋃︁k=1t k , t k = Δ Pk1 ,P k2 ,P k3, n T = 2(n − 1) 2 , (20.12)kde t k je k-tý prvek s vrcholy P k1 , P k2 , P k3 a n T je počet všech prvků. Součet plošek všechprvků přibližně odpovídá obsahu původní plochyZavřít dokumentCelá obrazovka ⧸︀ Okno


288Obsah288. strana ze 309◭ ◭ ◮ ◮◭◮Obr. 20.6Triangularizace.Zavřít dokumentCelá obrazovka ⧸︀ Okno


289T h ≈ ¯Ω. (20.13)Konkrétně <strong>pro</strong> zvolenou čtvercovou oblast platí v předešlé relaci rovnost. Průhyb k-téhouzlu je značenu k ≈ u(P k ) = u(x k , y k ) <strong>pro</strong> k = 1, ..., n. (20.14)Interpolace řešeníZavedmě a<strong>pro</strong>ximaci funkce posuvů na k-tém prvku (obr. 20.5) pomocí lineární funkceRovnici můžeme přepsat do tvaruu k (x, y) = a k x + b k y + c k , ∀(x, y) ∈ t ku k (x, y) = 0, ∀(x, y) /∈ t k .(20.15)Obsah289. strana ze 309u k (x, y) = φ(x, y)a k = [x, y, 1][a k , b k , c k ] T , (20.16)kde φ je matice a<strong>pro</strong>ximačního polynomu a a k je vektor konstant. Postupným dosazovánímsouřadnic <strong>pro</strong> vrcholy prvku pišme◭ ◭ ◮ ◮◭◮a k x 1 + b k y 1 + c k = u k1a k x 2 + b k y 2 + c k = u k2a k x 3 + b k y 3 + c k = u k3(20.17)a s označením u k = (︀ u k1 u k2 u k3)︀ T relaci mezi vektorem konstant a vektorem zobecnělýchposuvůD k a k = u k . (20.18)Zavřít dokumentCelá obrazovka ⧸︀ Okno


290Vyjádření konstant přes zobecnělé posuvy u k má zásadní význam <strong>pro</strong> algoritmizaci. Zdematice⎛⎞x k1 y k1 1D k = ⎝ x k2 y k2 1 ⎠ (20.19)x k3 y k3 1je regulární, a <strong>pro</strong>to platíNyní stačí v rovnici (20.16) za a k dosadit (20.20)a k = D −1k u k. (20.20)u k (x, y) = φ(x, y)D −1k u = N ku. (20.21)Zde N k = φ(x, y)D −1kje tzv. matice bázových funkcí (k-tého prvku).ObsahLokální matice tuhostiPro sestavení lokální matice tuhosti použijeme vztah∫︁a(u k , u k ) = ∇u k (∇u k ) T dΩ. (20.22)Gradient pole posuvů je zapsán ve tvaru(︂ )︂(∇u k ) T ∂∂uk /∂∂x=∂∂u k /∂∂yΩ= ∇φ(x, y)D −1k u k = G k u k , (20.23)přičemž parcilální derivace podle x a y se <strong>pro</strong>jeví pouze na matici a<strong>pro</strong>ximačního polynomu.Zde G k = ∇ (φ(x, y)) D −1kje transformační matice (tzv. derivace bázových funkcí).290. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


291Dosazením (20.23) do (20.22) dostáváme∫︁∇u k (∇u k ) T dΩ = ukTΩ∫︁t kG T k G kdΩ u k = u T k A ku k . (20.24)Jelikož je volený a<strong>pro</strong>ximační polynom φ prvního stupně, gradient pole posunutí je na konečnémprvku konstantní a mezi jednotlivými prkvy obecně nespojitý. Ve výrazu ∫︀ t kG T k G kdΩse integruje pouze přes konstanty, stačí <strong>pro</strong>vést součiny matic a výsledek přenásobit plochoukonečného prvku. Platí, že plocha trojúhelníku S △ = 1 2 |det (D k)|, potomje lokální maticí tuhosti .A k = G T k G 1k2 |det (D k)| . (20.25)ObsahGlobální matice tuhostiFunkcionál energie systému je popsán rovnicíU = 1 2 a(u h, u h ) − b(u h ) =n T ∑︁k=1(︂ 12 uT k A ku k − u T k f k)︂(20.26)291. strana ze 309◭ ◭ ◮ ◮◭◮a je výsledkem rozdílu potenciální energie vnitřních a vnějších sil (U I − U E ) všech prvkůúlohy. Potenciální energie vnitřních sil jeU I = 1 2 a(u h, u h ) =n T ∑︁k=112 uT k A ku k . (20.27)Zavřít dokumentCelá obrazovka ⧸︀ Okno


292Globální matici A lze sestavit s využitím předešlého vzorceA =n T ∑︁k=1⎛A k , kde A k = ⎝a k 1,1 a k 1,2 a k 1,3a k 2,1 a k 2,2 a k 2,3a k 3,1 a k 3,2 a k 3,3⎞⎠ . (20.28)Označme globální čísla uzlů k-tého prvku k 1 , k 2 , k 3 a příspěvek lokální matice A k v maticiA je a ki ,k j= a ki ,k j+ a k i,j <strong>pro</strong> i, j = 1, 2, 3. Obecně lze globální matici zapsat ve tvaru⎛⎞0 · · · 0 · · · 0 · · · 0 · · · 0. . .. . . . .0 · · · a k 1,1 · · · a k 1,2 · · · a k 1,3 · · · 0∑︁n T . . . .. . . .A =0 · · · a k 2,1 · · · a k 2,2 · · · a k 2,3 · · · 0.k=1. . . . .. . .0 · · · a k 3,1 · · · a k 3,2 · · · a k 3,3 · · · 0⎜⎝.. . . . ..⎟. ⎠0 · · · 0 · · · 0 · · · 0 · · · 0Obsah292. strana ze 309◭ ◭ ◮ ◮◭◮Lokální vektor zatíženíVektor uzlových sil je rozdělen na příspěvek od hustoty sil∫︁∫︁u T f dΩ = ukT N T k f dΩ = uT k f kt k t kZavřít dokumentCelá obrazovka ⧸︀ Okno


293a příspěvek liniového zatížení∮︁Γ k T∮︁u T T dS = ukT ⃒Γ kT Γ k TGlobální vektor zatíženíN T ⃒k⃒Γ k T dS = u T ⃒kT Γ k T k , Γ k T := P kI P kII , I, II ∈ {1, 2, 3}.TDo globálního vektorů pravé strany se postupně nasčítávají příspěvky všech prvků∫︁Ω∮︁u T f dΩ + u T T dS =Γ Tf V,k = (f k i ) i=1,...,3 , f V,k =n T ∑︁k=1n T ∑︁k=1∫︁n∑︁ ΓT ∮︁u T f dΩ +t kf k =n ΓTn T ∑︁k=1k=1Γ k Tu T T dS =n T ∑︁k=1n ΓTuk T f ∑︁k + ukT ⃒Γ k T k Tk=1(︀0 · · · fk1 · · · f k 2 · · · f k 3 · · · 0 )︀ T∑︁ ∑︁T k = (t k (︀i ) i=1,..,2 , f T = T k = 0 · · · tk1 · · · t k 2 · · · 0 )︀ T .k=1n ΓTk=1Obsah293. strana ze 309◭ ◭ ◮ ◮◭◮Předepsání okrajových podmínekPředpokládejme, že na hranici je předepsáno posunutí g(x, y)u(x, y) = g(x, y) ∀(x, y) ∈ ∂∂Ω∂∂Ω ≈ B h = {P i = (x i , y i ) ∈ S h⃒ ⃒ P i ∈ ∂∂Ω}I B = {i ∈ N ⃒ ⃒P i ∈ B h }Zavřít dokumentCelá obrazovka ⧸︀ Okno


294Animacei − tá rovnice, i ∈ I B : u i = g i = g(P i )n∑︁n∑︁n∑︁i − tá rovnice, i /∈ I B : a i,j u j = f i =⇒ a i,j u j = f i − a i,j g jj=1j=1j∈I Bj /∈I B⎛⎛⎞ f 1 − ∑︀ a 1,j g ja 1,1 · · · 0 · · · a 1,nj∈I B . . .. . ..A =0 · · · 1 · · · 0, f =g ii, ∀i ∈ I B⎜⎝.. . ..⎟. ⎠ ⎜⎝.a n,1 · · · 0 · · · a n,n f n − ∑︀ ⎟⎠j∈I Ba n,j g j⎞V aplikaci Lineární algebra - interaktivní animace v záložce MKP 2D je příkladmembrány uchycené na volných koncích řešený pomocí metody konečných prvků. Pro použitíapletu je nutné nainstalovat CDF player.Algoritmus 20.2MKP - membránafunction membrana2D_MKP (N)% N ... pocet elementu na hranu x a y%% Rovnice% -(d ^2/ dx ^2+ d ^2/ dy ^2) *u=f, f = 1;%% Volitelne hodnoty ( velikost , pocet prvku )Lx = 1; % delka hrany ve smeru osy xObsah294. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


295Ly = 1; % delka hrany ve smeru osy yconst = -1; % fakor sily%% sit[ elements , coordinates ]= mesh_rectangle (N,N,Lx ,Ly);%% pomocne konstantyNx=N;Ny=N;nx=Nx +1; ny=Ny +1; n=nx*ny;%% matice tuhosti a vektor prave stranyA = zeros (n,n);f= zeros (n ,1) ;Psi = [1 0 0;0 1 0];for i =1:2* Nx*Nyx= coordinates ( elements (i ,:) ,1);y= coordinates ( elements (i ,:) ,2);D=[x y ones (3 ,1) ]; detD = abs ( det (D)); G= Psi /D;A_local = G ’*G* detD *0.5;f_local = const *0.5* detD *[1;1;1]/3;A( elements (i ,:) , elements (i ,:) ) =...A( elements (i ,:) , elements (i ,:) )+ A_local ;f( elements (i ,:) )=f( elements (i ,:) )+ f_local ;end%% indexy uzlu na hranici (u_ {\ Gamma }=0)i_u0 =[1: nx , (nx +1) :nx :( nx*ny -2* nx +1) ,...2* nx:nx :( nx *(ny -1) ), nx*ny -nx +1: nx*ny ];%% regularizace matice tuhosti a uprava vektoru prave stranyA(i_u0 ,:) =0; A(: , i_u0 ) =0;A(i_u0 , i_u0 )=A(i_u0 , i_u0 )+ eye ( length ( i_u0 ));f( i_u0 ) =0;%% Reseniu=A\f;trisurf ( elements , coordinates (: ,1) , coordinates (: ,2) ,u ,...’ Facecolor ’,’ interp ’);Obsah295. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


296Kapitola 21Testové otázkyObsah296. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


297<strong>21.</strong>1. Test - aplikaceTest (Iterační metody, metoda sítí, MKP)1. (1b.) Rovnice rovnováhy struny v bodě je diferenciální rovnicí(a) I. řádu(b) II. řádu(c) III. řádu(d) IV. řádu2. (1b.) Při odvozování rovnice rovnováhy struny (resp. membrány) se využívá tzv. větao střední hodnotě integrálního počtu.(a) NE(b) ANOObsah297. strana ze 309◭ ◭ ◮ ◮◭◮3. (1b.) Metoda sítí je:(a) analytický způsob řešení diferenciálních rovnic(b) numerický způsob řešení diferenciálních rovnic4. (1b.) Metoda konečných prvků je:(a) analytický způsob řešení diferenciálních rovnicZavřít dokumentCelá obrazovka ⧸︀ Okno


298(b) numerický způsob řešení diferenciálních rovnic5. (1b.) V metodě konečných prvků se diskretizuje:(a) původní okrajová úloha(b) slabá formulace okrajové úlohy(c) silná formulace okrajové úlohy6. (1b.) Tzv. lokální matice tuhosti (i -tá) souvisí:(a) s celou oblasti, na které se počítá okrajová úloha(b) s i-tým konečným prvkem7. (1b.) Globální matice tuhosti stuny (resp. membrány) bez okrajových podmínek:(a) je pozitivně semidefinitní(b) je pozitivně definitníObsah298. strana ze 309◭ ◭ ◮ ◮◭◮(c) je nulová(d) neexistuje8. (1b.) Musí být oblast, na které je okrajová úloha řešena metodou konečných prvků,čtvercová?(a) ANOZavřít dokumentCelá obrazovka ⧸︀ Okno


299(b) NE9. (1b.) Metoda konečných prvků a metoda sítí převádí původní eliptickou okrajovou úlohuna:(a) systém diferenciálních rovnic(b) systém lineárních rovnic10. (1b.) U metody sítí se direnciální vztahy v diferenciální rovnici:(a) nahrazují konečnými diferencemi(b) nahrazují konečnými derivacemi(c) ponechávají beze změny11. (1b.) Globální matice tuhosti struny se vzestupně očíslovanými uzly bude:(a) plnáObsah299. strana ze 309◭ ◭ ◮ ◮◭◮(b) diagonální(c) tridiagonální12. (1b.) Globální matice tuhosti membrány bude:(a) plná(b) diagonálníZavřít dokumentCelá obrazovka ⧸︀ Okno


300(c) řídkáSprávně zodpovězené otázky:Získané body:Procento úspěšnosti:Obsah300. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


301RejstříkAadresářodstranění, 19vytvoření, 19AMD, 171apostrof, 27, 40Bbase2dec, 43bázeA-ortogonální, 223, 229A-ortonormální, 225bázové funkce, 290bin2dec, 43blokpodmínkový, 57výhybkový, 60break, 63buňkyobsah, 46prázdná, 45Ccase, 60cell, 45celldisp, 49char, 43colamd, 172Command History, 18Command Window, 16continue, 63Current Folder, 19cyklus, 61, 62přerušení, 63s podmínkou, 61se známým počtem iterací, 62Obsah301. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


302Ddec2base, 43dec2bin, 43dec2hex, 43diag, 37diferenciální rovnice, 253, 258druhého řádu, 254parciální, 274doc, 33double, 43Ečíselná soustava, 43číslosingulární, 203vlastní, 195elfun, 39else, 57elseif, 57end, 36, 58, 60, 61, 63, 66eye, 31Ffindstr, 42for, 62Freemat, 20funkce, 54, 64dokumentace, 33isvarname, 18matematické elementární, 39seznam, 39nápověda, 33<strong>pro</strong> generování matic, 31signatura, 65struktura, 64volání, 66základní operace, 27Ggetfield, 51HH1 řádek, 65help, 33, 65hex2dec, 43hodnotaprázdná, 26Iif, 57int2str, 43inverze, 119, 123Obsah302. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


303Mooreova-Penroseova, 116, 119, 120,124, 208, 209zobecněná, 208Kkomentáře, 25, 65See also, 65konečné prvky, 274, 276, 287, 291konstanty, 39konverzní specifikace, 41Llength, 35lookfor, 65lower, 43Mmagic, 32mat2str, 43matice, 19, 24diagonála, 37čtvercová, 117, 122Householderova, 189inverzní, 31jednotková, 31konjugovaná, 28konkatanace, 38magický čtverec, 32náhodná, 31nulová, 31řádkymázání, 38obdélníková, 117, 122ortogonální, 174ortonormální, 213pod-, 36prázdná, 26prvky, 35end, 36mázání, 38výběr, 35rotace, 178rovinné rotace, 180samých jedniček, 31sloupcemázání, 38soustavyrozšířená, 142spojování, 38sub-, 36symetrická, 164, 165transponovaná, 27Obsah303. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


304tuhosti, 280, 283, 290, 291velikost, 34zadávání, 24zrcadlení, 189Matlabfunkce, 19jazyk, 19, 23knihovna funkcí, 19nápověda, 16, 20<strong>pro</strong>gram, 16<strong>pro</strong>středí, 22spuštění, 16toolbox, 15, 20volně dostupné alternativy, 20vymezení, 15metodaGaussova eliminační, 140Givensova QR, 183Householderova QR, 190konečných prvků, 221, 274Lanczosova, 212modifikovaná QR, 199nejmenších čtverců, 116sdružených gradientů, 221, 224sítí, 221, 258, 263, 274M-soubory, 55multiplikátory, 146Nnum2str, 43OOctave, 20oddělovačdesetinný, 24řešenísoustav lineárních rovnic, 30ve smyslu nejmenších čtverců, 31řetězce, 40délka, 40formátované, 41konkatanace, 40konverze, 43porovnávání, 41<strong>pro</strong>hledávání, 42spojení, 40oknoaktuálního adresáře, 19Editor, 54příkazů, 16pracovního <strong>pro</strong>storu, 18Obsah304. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


305okrajové podmínky, 257, 274, 293Dirichletovy, 254, 257, 281, 283Neumannovy, 254, 257ones, 31operacedělení, 27dvojtečka, 33, 36elementární řádkové, 142inverze, 31logická, 28disjunkce, 28konjunkce, 28negace, 28lomítko, 30mocnina, 27násobení, 27odčítání, 27po prvcích, 27porovnání, 28s tečkou, 27sčítání, 27transpozice, 27hermitovská, 28základní, 27zpětné lomítko, 30algoritmus, 31otherwise, 60Ppivot, 156, 157, 163pivotizacečástečná, 157úplná, 162podmínka, 57přeuspořádání, 170podle počtu nenulových prvků, 170pomocí a<strong>pro</strong>ximace minimálního stupně(AMD), 171s redukcí šířky pásu (RCM), 171příkazy, 16bez středníku, 17historie, 18opakování, 19se středníkem, 17zadávání, 16Poissonova rovnice, 257, 263pole buněk, 44konstrukce, 45prázdné, 45prvky, 47vnořená, 48Obsah305. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


306výpis obsahů všech buněk, 49porovnání dvou souborů, 19pracovní <strong>pro</strong>stor, 18, 56<strong>pro</strong>cesGramův-Schmidtův, 175<strong>pro</strong>gramyřízení toku, 57větvení, 57<strong>pro</strong>měnnéans, 17editace, 18kontrola názvu, 18název, 18řetězcové, 40textové, 40vytvoření, 17pseudoinverze, 209Python, 21Rrand, 31RCM, 171redukcedopředná, 141reziduum, 116, 118, 225rot90, 38rovnicenormální, 31rozkladCholeského, 166LDL T , 165LDM T , 164LU, 145QR, 173, 174singulární, 203spektrální, 196SScilab, 20setfield, 51size, 34, 40skalár, 24zadání, 25skalární součin, 224, 225, 228skripty, 54vytvoření, 54soustava lineárních rovnic, 258, 260, 261,268, 274spektrem, 196sprintf, 41Spustíme, 55str2double, 43Obsah306. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


307str2num, 43strcmp, 41strcmpi, 41strncmp, 41strncmpi, 41strrep, 42strtok, 42struktury, 50konstrukce, 50položkyexistence, 53přidání, 50, 51přístup, 51vložení, 51vnořené, 52substitucezpětná, 141sum, 37switch, 60symamd, 172Ttextový výstup, 56transformaceGivensova, 178Householderova, 186tvarschodový, 142Uupper, 43úpravyekvivalentní, 141VVariable Editor, 18vektor, 24délka, 35vlastní, 195vektoryzadání, 26vlastní čísla, 212, 216Wwhile, 61Workspace, 18Zzeros, 31znak, 40znakybílé, 25nového řádku, 41Obsah307. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


308tabulátoru, 41Obsah308. strana ze 309◭ ◭ ◮ ◮◭◮Zavřít dokumentCelá obrazovka ⧸︀ Okno


309Literatura[1] Z. Dostál, Optimal quadratic <strong>pro</strong>gramming algorithms, Springer 2009, XVIII,284 pages. 55 illus ISBN: 0387848053, 9780387848051[2] Stewart, G. W., Matrix algorithms, SIAM, 2001, ISBN:0-89871-503-2[3] MATLAB Documentation, MathWorks, R2011a,http://www.mathworks.com/[4] V. Vondrák a L. Pospíšil, Numerické metody I., <strong>Matematika</strong> <strong>pro</strong> inženýry <strong>21.</strong>století.Obsah309. strana ze 309◭ ◭ ◮ ◮◭◮[5] R. Blaheta, Numerické modelování a metoda konečných prvků., <strong>Matematika</strong><strong>pro</strong> inženýry <strong>21.</strong> století.Zavřít dokumentCelá obrazovka ⧸︀ Okno

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!