UNIVERZITA JANA EVANGELISTY PURKYNĚ V ÚSTÍ NAD LABEM PŘÍRODOVĚDECKÁ FAKULTA - KATEDRA CHEMIE Opora pro kombinované navazující magisterské studium Učitelství chemie pro ZŠ Programování v chemii (MATLAB) Ing. Jaromír Havlica, Ph.D. Ústí nad Labem 2014
Obsah Program maticové laboratoře 3 Zápis do Command window........................ 3 Zápis do M-file............................... 4 Předtím, než začnete............................ 5 Vektory a matice 7 Vektory................................... 7 Matice.................................... 7 Cvičení.................................... 10 Generování matic.............................. 10 Magický čtverec............................... 10 Lineární algebra 11 Řešení lineárních rovnic.......................... 11 Aproximace dat polynomem........................ 12 Podmínka a cyklus 14 if...................................... 14 while, for................................ 15 Chyby a chybové hlášky 17 Nápověda 19 Vizualizace a grafika 21 2
Program maticové laboratoře Samotný návod k systému Matlab uvádí, tento program je vhodný pro matematické výpočty, vytváření algoritmů, kódování jednoduchých programů, vědeckou grafiku nebo třeba analýzu dat. Původně vznikl pro usnadnění práce s maticemi. Skládá se ze dvou uživatelských prostředí, jimiž jsou okno Command window a soubor M-file. Zápis do Command window Obrázek 1: Command window Na obrázku 1 vidíme okno Command Window a jeho nejdůležitější oblasti: 1. Vytvoření nového souboru M-file 2. Kurzor, kam zapisujeme 3. Nápověda 4. Proměnné, které má MATLAB zapsané v paměti 5. Historie předchozích příkazů Toto přostředí funguje jako velmi sofistikovaná kalkulačka. Je možné začít zcela jednoduchým příkazem v uživatelském okně: 3
2 + 2 <enter> >> 4 Zápis do M-file Obrázek 2: M-file Jak je na obrázku vidět, soubor M-file je textový editor, kam píšeme delší kód, který lze uložit pro pozdější použití. Jen je třeba myslet na to, že před spuštěním je třeba ho nejprve uložit (názvy je nutné volit bez háčků a čárek a bez mezer). Na obrázku 2 jsou ukázáné hlavní funkce editoru: 1. Vytváří nový soubor M-file 2. Ukládá současnou podobu M-file 3. Spustí tento soubor a začne jej počítat Syntax programovacího jazyka je jednoduchá, některé příkazy připomínají kódování v programu C. M-file se používá v případě složitějšího programu, který si lze připravit k obrazu svému a využít jej ke složitějším úlohám. Při zápisu do M-file je třeba myslet na základní typografii, například při zaznamenání neznámé platí: čili lze zapsat takovýto kód do souboru M-file, se kterým lze později pracovat: 4
a= 14.7 definuje skalár r = [1 2 3 4] definuje řádkový vektor r = [1; 2; 3; 4] definuje sloupcový vektor c = [1.2 3.2 7.5 5.6] definuje také sloupcový vektor (apostrof označuje transponová b = [1 2 3; 4 5 6;7 8 9] definuje 3 x 3 matici, řádky jsou odděleny středníkem a = 5 b = 7 c = a + b d = c + sin(b) e = 5 * d f = exp(-d) po spuštění tohoto M-file posléze v Command window získáme výstup: c = 12 d = 12.6570 e = 63.2849 f = 3.1852e-06 Pokud chcete v kódu psát poznámky, či komentáře, stačí na začátek řádku napsat symbol %, tento řádek zezelená, v kódu zůstane vídět, ale program jej bude ignorovat. % Tento řádek mi značí celkový počet Středník se píše za každý řádek, který není třeba vypisovat do okna příkazů. Je vhodné ho používat za každým řádkem,se kterým nechceme vizuálně pracovat. Kdyby se vypisovalo mnoho řádků, program by se velmi zpomalil a výsledky by byly nepřehledné. >> cd změní stávající pracovní adresář >> delete smaže soubor >> diary uloží sekci jako textový dokument >> dir Seznam adresáře >>! Spustí příkaz OS >> quit Zavře MATLAB >> clc smaže veškeré předchozí příkazy na ploše Předtím, než začnete Je důležité si uvědomit, že program Matlab Vám může velmi pomoci, ale může Vás také velmi potrápit, pokud nebudete rozumět jeho syntaxi, nebo jeho matematických 5
postupům. Vždy je důležité si uvědomit, co od programu chcete, jak se toho chystáte docílit a hlavně čím ověříte dosažené výsledky. Pokud budete znát odpovědi, na tyto otázky, práce s Matlabem bude snadnější a ušetří Vám spoustu práce. 6
Vektory a matice Vektory Vektory v řádku lze napsat takto: >> r = [7 8 9 10 11] Při zápisu vektoru ve sloupci je třeba psát mezi členy středník: >> r = [7; 8; 9; 10; 11] Pro vypsání jednoho prvku z vektoru lze použít: >>r(3) 9 Pro vypsání delší části vektoru se dá napsat: Matice >>r = [1 2 3 4 5 6 7 8 9]; >>sr = r(3:7) sr = 3 4 5 6 7 Matlab požívá k zápisu matic soubor čísel oddělené mezerou, teprve prvky oddělené středníkem se zapisují do dalšího řádku. >> B = [1 1 1; 2 2 2; 3 3 3] Její vypsání v okně Command window pomocí: >>B <enter> = 1 1 1 2 2 2 3 3 3 7
K psaní matic lze také využít zápis vektorů: c = [1,2,1] b = [3,1,3] A=[a;b] A= 1 2 1 3 1 3 Práce s maticí v okně Command window může vypadat následovně; například sčítání přes řádky: >>sum(b)<enter> 6 6 6 Nebo sčítání přes sloupce: >>sum(b )<enter> 3 6 9 >>sum(b ) <enter> 3 6 9 Také lze sečíst všechny prvky v matici: >>sum(sum(b))<enter> 18 Prvek v i-té řadě a j-tém sloupci je značen B(i,j). Například B(3,2) je číslo ve třetím řádku a druhém sloupci. Pro naši matici B je to číslo 3. Také je možné spočítat součet všech prvků ve třetím řádku pomocí: >> B(1,3) + B(2,3) + B(3,3) 9 Nejefektivnějším způsobem jak spočítat to samé je použítí dvojtečky: 8
>> sum(b(:,3)) 9 Matlab toto označení čte jako sečti všechny prvky z řádku tři Tento příkaz lze zapsat i jinak: >>sum(b(1:end,3)) 9 Toto MATLAB čte sečti všechny prvky od prvního do posledního členu ze třetího řádku. Význam je sice stejný jako je uveden výše, ale pokud bychom změnili jedničku na dvojku, sečte pouze druhý a třetí člen třetího řádku. >>sum(b(2:end,3)) 6 Pro rozměr matice použijeme příkaz size, čili například: size(b) ans= 3 3 Zápis sčítání matic je analogický ke sčítání skalárů: A= [1 2; 3 4]; B = [11 12; 13 14]; >> A + B 12 14 16 18 Další možností práce s maticemi je jejich násobení. Matlab používá dva druhy násobení. Těmi jsou maticové násobení a násobení matic po prvcích. Každá tato operace se zapisuje jinak a také výstupem je jiný výsledek. A= [1 2; 3 4]; B = [11 12; 13 14]; Maticové násobení: >> A * B 37 40 85 92 9
Násobení po prvcích: >> A.* B 11 24 39 56 Zajímavý je i výpočet determinantu matice. V matlabu existuje příkaz det: Cvičení >> A= [1 1 1; 2 2 2; 3 3 3]; >> det(a) ans= 0 Nyní si vytvořte svou vlastní matici, zkuste spočítat determinant pomocí příkladu a poté ten samý determinant spočtěte matematicky. (Použijte Sarrusovo pravidlo: deta = a 1,1 a 2,2 a 3,3 + a 1,3 a 2,1 a 3,2 + a 1,2 a 2,3 a 3,1 a 1,3 a 2,2 a 3,1 a 1,1 a 2,3 a 3,2 a 1,2 a 2,1 a 3,3 ) Generování matic Mimo přepsání matice po jednotlivých členech, či vektorech lze v Matlabu generovat náhodné či definované matice jednoduchými příkazy: A=ones(3) matice 3 3 naplněná jedničkami A=zeros(4) matice 4 4 naplněná nulami A=rand(2,4) matice 2 4 naplněná náhodnými čísly v intervalu (0,1) Magický čtverec Tak, jak je Matlab schopen generovat různé matice, je schopen sestavit i magický čtverec (pozn.: čtvercová matice kde součet řádků, sloupců a diagonál je stejné číslo): X = magic(5) vygeneruje matici o pěti řádcích a šesti sloupcích, která bude magickým čvercem. X = 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 10
Lineární algebra MATLAB lze použít například k nalézání kořenů polynomů. Zatímco systémy výpočetní algebry reprezentují polynom explicitně jako x 2 3x + 2, MATLAB používá vektorové koeficienty. V tomto případě je vektor [1 3 2]. K nalezení kořenů polynomu existuje v MATLABu funkce roots: p=[1-3 2]; roots(p) 2 1 Kořeny je také možné najít vložením přímo vektoru reprezentujícího polynom do funkce pro jejich nalezení: roots([1-3 2]) 2 1 Řešení lineárních rovnic Pro řešení lineárních rovnic se používá příkaz linsolve. Pro jeho použití si představme soustavu lineárních rovnic: 3x 2y = 8 x + 5y = 14 což lze přespat do maticového zápisu: [ ] [ ] [ ] 3 2 x 8 = 1 5 y 14 V MATLABu tedy poté píšeme: 11
>> A = [3-2; 1 5] A = 3-2 1 5 >> b = [8; 14] b = 8 14 >>linsolve(a, b) ans= 4 2 >>x=ans x= 4 2 >>A\b ans= 4 2 Aproximace dat polynomem K prokládání náhodně naměřených dat pomocí křivky slouží v MATLABu funkce polyfit, která používá metodu nejmenších čtverců. p = polyfit(x,y,n), kde: x je vektor hodnot nezávisle proměnné y je vektor hodnot závisle proměnné n je stupeň polynomu Pro příklad řešení použijeme náhodná data, např.: 12
>> x=[1 1.9 2 2.7 3.5 3.8 5 7]; >> y=[7 8 8.3 8.5 10 10.6 11 12]; >> p=polyfit(x,y,2) p = -0.1002 1.6627 5.2942 Oproti tomu funkce polyval použije koeficient k vytvoření nových dat: >>ya=polyval(p,x) kde: p je vektor koeficientů aproximačního polynomu x je vektor hodnot nezávisle proměnné pro náš případ je to: >> ya=polyval(p,u) ya = 6.8567 8.0917 8.2189 9.0532 9.8864 10.1658 11.1032 12.0242 Obrázek 3: Data a jejich aproximace parabolou 13
Podmínka a cyklus Cykly jsou MATLABovskými algoritmy. Cyklům je podobná i podmínka if (podobná například Excelovské podmínce), nejběžnějšími cykly jsou for a while. if Takovýto příkaz používámě, pokud je třeba nějaký příkaz vykonat pouze za určitých podmínek. Je to zcela jednoduchý algoritmus. Jeho syntax vypadá následovně: if(podmínka) příkaz end Takže například jednoduchá podmínka je porovnání čísel. Konkrétně sestavíme krátkou podmínku; pokud je číslo menší než 10, program napíše hlášku toto číslo je menší než 10 a=2; Výsledek: if(a<10) disp( toto číslo je menší než 10 ) end toto číslo je menší než 10 Pokud by číslo bylo větší než 10 program nic nenapíše, ale i toto se dá upravit a naprogramovat pomocí doplnění podmíněného příkazu o položku else. a=12; if(a<10) disp( toto číslo je menší než 10 ) elseif(a==10) disp( toto číslo je rovno 10 ) else disp( toto číslo je větší než 10 ) end 14
Výsledek: toto číslo je větší než 10 while, for Oba tyto cykly provádí nějaký příkaz opakovaně, po několik přesných kroků, či do chvíle, dokud je splněná nějaká podmínka. Jejich syntax je podobná podmínce if: while podmínka příkazy end oproti tomu v cyklu for přesně nastavím počet kroků, nebo vybereme řadu prvků, kterých se to týká. for proměnná=výraz příkazy end Oba tyto cykyl se dají mezi sebou kombinovat, vkládat se jeden do druhého a často se vyskytují také v kombinaci s podmínkou. Pro názornost zkusíme ten samý příklad spočítat oběma způsoby. Určíme si jeden krátký vektor a postupně budeme k jeho jednotlivým prvkům přičítat číslo 5. Nejprve si vypíšeme vektor a. Poté zadáme cyklus, kde do proměnné napíšeme i=1:6, což MATLAB čte, jako udělej včechny kroky od jedničky do šestky (šest proto, že vektor obsahuje 6 prvků). a = [3 2 7 1 4 1]; for i=1:6 a(i)=a(i)+5; end Výsledek bude: >> a a = 8 7 12 6 9 6 Ten samý výsledek zkusíme pomocí cyklu while. Oproti předchozímu cyklu musíme nejprve nadefinovat i, se kterým budeme později pracovat. V tomto cyklu po příkazu while píšeme podmínku, jak dlouho má MATLAB tento cyklus opakovat. Říkáme mu, aby jej dělal tak dlouho, dokud počet kroků bude menší, než šest. 15
a = [3 2 7 1 4 1]; i=0; while (i<6) i=i+1; a(i)=a(i)+5; end po vypsání a nám MATLAB vypíše následující výsledek: >> a a = 8 7 12 6 9 6 16
Chyby a chybové hlášky Nejprve je třeba si ujasnit, jak Matlab pracuje. Abychom byli schopni napsat správný kód, je nutné přemýšlet podobně jako program. Syntax MATLABu je snadná, stejně tak jako pedantská. Při tvoření složitějších operací je potřeba psát postupně všechny neznámé a definovat je ještě před tím, než s nimi začneme operovat. Pokud třeba chceme vytvořit jednoduchou závislost y na x, napsali bychom: >> y=2*x; a stiskneme Enter, objeví se chybová hláška??? Undefined function or variable x. Je to proto, že jsme zprvu nedefinovali x, na kterém je y závislé. Proto je třeba o řádek výše definovat x: >> x=2; >> y=2*x asn= 4 Pokud program přestane pracovat a hlásí chybu, je třeba opravit část kódu, tento proces může být náročný, proto je lepší program rozběhnout po malých částech. Ale s chybami a chybovými hláškami není takový problém, není třeba z nich mít strach. Vlastně děláním chyb lze dobře nacvičit logiku Matlabu. Pro každý příkaz existuje totiž jediný možný zápis. Proto, když uděláte chybu, uvidíte na dolním řádku okna Command window například: >> plocha = pi r 2??? area = pi r 2 Error: Unexpected MATLAB expression. V tomto případě Matlab předpokládá, že po tomto případě krát které v Matlabu zančíme * pi bude následovat znaménko, v 17
>> sin pi??? Function sin is not defined for values of class char. V tomto případě došlo k vynechání závorek. MATLAB se tedy k příkazu nechová jako k výrazu, nýbrž jako k řetězci znaků. když napíšeme e odpověd, kterou nám MATLAB vrátí, je:??? Undefined function or variable e. To je proto, že Eulerovo číslo je definované jedině funkcí exp. Přesto ale můžeme sami přiřadit hodnotu Eulerova čísla proměnné e napsáním >> e=exp(1) což je ekvivalentní hodnotě e. Odpověd nám potvrdí toto: e = 2.7183 Vrátíme-li se k maticím, je třeba pamatovat na rozměr matic. Pokud máme matici B o třech sloupcích a třech řádcích a napsali bychom bychom: t = B(4,3) systém nám napíše chybu :??? Index exceeds matrix dimensions. To se stane, protože matice B má pouze tři sloupce a tři řádky, B (4,3) není definováno. Také je třeba dát si pozor na překlepy, naštěstí MATLAB sám ukáže řádek, který v sobě chybu obsahuje: >> A(1::, 2)??? A(1::, 2) Error: Unexpected MATLAB operator. 18
Nápověda Jak bylo ukázáno v první kapitole, nápovědu nalezneme v pravém rohu okna Command Window (Obr.:1). Je to účinný pomocník při řešení problémů a u leckterých příkazů navrhuje i alternativní postupy či metody. Všechny jsou velmi dobře popsány, proto je dobré se s nápovědou velmi důkladně seznámit. Další výhodou nápovědy jsou i tzv. demos, které ukazují přesný postup celého kódu při dané problematice. Takto vypadá okno nápovědy po rozkliknutí záložky Mathematics: Obrázek 4: Nápověda - Mathematics Při rozkliknutí záložky Graphics se před námi otevře několikero informací o vytváření grafů, jejich vlastností včetně popisků: Další možnost jak vyhledávat v nápovědě je Index, kde hledáme příkazy srovnané abecedně: 19
Obrázek 5: Nápověda - Graph Obrázek 6: Nápověda - Index 20
Vizualizace a Grafika Grafika a generace grafů se zadávají příkazem plot, pro začátek lze napsat vygenerovat takto jednoduchý: >> x = [0:5:100]; >> y = x; >> plot(x, y) do prvního řádku zadáme proměnnou x, ke které do hranatých závorek napíšeme počáteční hodnotu, poté dvojtečku, následuje krok počítání, další dvojtečka a nakonec maximální hodnotu. Ve druhé řádku nastavujeme parametry závislé proměnné, čili y. A třetí řádek zadává vykreslení grafu, kde je třeba dodržet, aby v závorce na prvním místě byla nezávislá a za čárkou závislá proměnná. Obrázek 7: Graf závislosti y na x x = [-100:20:100]; y = x 2 ; plot(x, y) Popisky osy x a y připíše příkaz xlabel a ylabel podél příslušných os. Příkaz title přidává název grafu. Příkaz grid on přidává mřížku do grafu. Příkaz axis equal vygeneruje obrázek, kde jsou obě osy ve stejném měřítku. Příkaz axis square vygeneruje čtvercový obrázek. 21
x = [0:0.01:10]; y = sin(x); plot(x, y) xlabel( x ) ylabel( Sin(x) ) title( Sin(x) Graph ), grid on axis equal Obrázek 8: Graf sin x x = [0 : 0.01: 10]; y = sin(x); g = cos(x); plot(x, y, x, g,.- ) legend( Sin(x), Cos(x) ) Barva čáry grafu může být: y žlutá (yellow) 22
r červená (red) g zelená (green) b modrá (blue) k černá (black) Čára, jako taková, může být: - plná -- čárkovaná : tečkovaná -.- čerchovaná Vyznačení bodů na křivce mohou být:. tečka o kroužek * hvězdička d kosočtverec (diamond) ˆ trojúhelník LineWidth určuje šířku čáry MarkerEdgeColor určuje barvu okraje bodu MarkerFaceColor určuje barvu vnitřku bodu MarkerSize určuje velikost bodu (msí být větší než 0) Příklad použití těchto příkazů naleznete v nápovědě pod Indexem v odkazu plot: Další dobrou funkcí je hold on v případě, že chceme, aby se nám vykreslilo více grafů zároveň. 23
Obrázek 9: Specifikace Grafu 24