380 likes | 534 Views
Obsah 8 . přednášky. P říkazy, řídicí struktury (K ilustraci bude používán a modif i kován příklad manipulátor (1. přednáška a další) a příklad na výpočet Taylorova rozvoje (4. přednáška) Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky.
E N D
Obsah 8. přednášky Příkazy, řídicí struktury (K ilustraci bude používán a modifikován příklad manipulátor (1. přednáška a další) a příklad na výpočet Taylorova rozvoje (4. přednáška) Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky.
Příklad - manipulátor REKAPITULACE Manipulátor V grafu si přejeme vykreslit i pozice ramen. K tomu potřebujeme znát souřadnice kloubu Aspojujícího obě ramena. Tyto souřadnice snadno určíme ze vztahů: Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky.
Příklad - manipulátor REKAPITULACE • Manipulátor - přechod k výpočtovému modelu • Zajímá nás přechod zvýchozího stavudokoncového stavu • První rameno se tedy opět otočí o 180 stupňů, druhé rameno se však tentokrát za stejnou dobu otočí o 360 stupňů, jeho úhlová rychlost je nyní dvojnásobná než je rychlost prvního ramene. • Dráhu si rozdělíme na 50 kroků, budeme vykreslovat pozici ramena pro každý z těchto kroků, v proměnné alfa_2 tedy musíme připravit 50 hodnot v rozsahu -90 až +270 stupňů, v proměnné alfa_1 připravíme 50 hodnot v rozsahu 0 až 180 stupňů. • Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. alfa_2 = linspace(-90,-90+360,50)*pi/180; alfa_1=linspace(0,180,50)*pi/180;
Příklad - modifikace REKAPITULACE Souřadnice počátku, kloubu A a koncového bodu připravíme do matic: • Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. n = 50;_% počet kroků l_1 = 1.3; l_2 =0.7; alfa_1=linspace(0,pi,n); alfa_2 =linspace(-pi/2,3*pi/2,n); x(2,:)= l_1*cos(alfa_1); y(2,:)= l_1*sin(alfa_1); x(3,:)= l_1*cos(alfa_1)+ l_2*cos(alfa_1+alfa_2); y(3,:)= l_1*sin(alfa_1)+ l_2*sin(alfa_1+alfa_2); x(1,:)=0; y(1,:)=0;
Příklad - manipulátor REKAPITULACE plot(x,y,'-b',x(3,:),y(3,:),'*k'); axis([-1.5,2,-1,2]); grid('on'); Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. • Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky.
Příklad - manipulátor • Manipulátor - změna zobrazení • Požadujeme animované zobrazení přechodu z výchozího stavu dokoncového stavu • Máme naplněny matice x a y, souřadnice pro všechny mezipolohy známe. • Existuje příkaz pause (viz 6. přednáška), prodleva mezi zobrazeními je tak snadno realizovatelná. • Potřebujeme postupné vykreslování grafů, bylo by možné postupovat např. takto: • Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. plot(x(:,1),y(:,1),'-b'); hold on; plot(x(3,1),y(3,1),'*k'); pause(0.1); plot(x(:,2),y(:,2),'-b'); plot(x(3,2),y(3,2),'*k'); pause(0.1); ... plot(x(:,50),y(:,50),'-b'); plot(x(3,50),y(3,50),'*k'); Zařídí, aby se každým dalším voláním funkce plot nevytvořil nový obrázek. Všechna další kreslení se budou přidávat do stávajícího existujícího obrázku.
Příklad - manipulátor plot(x(:,1),y(:,1),'-b'); hold on; plot(x(3,1),y(3,1),'*k'); pause(0.1); plot(x(:,2),y(:,2),'-b'); plot(x(3,2),y(3,2),'*k'); pause(0.1); ... plot(x(:,50),y(:,50),'-b'); plot(x(3,50),y(3,50),'*k'); • Manipulátor - změna zobrazení • Je zřejmé, že naznačený postup je funkční (lze experimentálně dokázat), avšak značněneefektivní: • Uvedenou sekvenci tří řádků musíme 50 x opsat (n = 50). • Při změně n na jinou hodnotu je nutnoupravit i řádky pro zobrazování. • Uvedené sekvence řádků se liší pouze druhým (sloupcovým indexem u matic x a y ve voláních funkce plot, jinak se jedná pouze o opakování totožných řádků (příkazů). Proto je vhodné uvažovat o parametrizaci kódu a použití cyklu. • Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. fori = 1:n plot(x(:,i),y(:,i),'-b'); plot(x(3,i),y(3,i),'*k'); pause(0.1); end Proměnná i bude postupně nabývat hodnoty z daného rozsahu, pro každou hodnotu i se provedou příkazy mezi for a end.
Příklad - manipulátor • Při přidávání více grafů do jednoho obrázku je vhodné napřed nakreslit osy příp. nastavit jiné parametry obrázku, provést hold on a pak do obrázku kreslit grafy. Celý kód pro postupné vykreslení poloh ramen by mohl vypadat např. takto: • Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. • n = 50; • l_1 = 1.3; • l_2 =0.7; • ... • y(1,:)=0; • axis([-1.5,2,-1,2]); • grid('on'); • hold on; • for i = 1:n plot(x(:,i),y(:,i),'-b'); plot(x(3,i),y(3,i),'*k'); pause(0.1); end • hold off;
Příklad - manipulátor • Manipulátor - změna zobrazení • Dále můžeme požadovat, aby polohy ramen na obrázku nezůstávaly, ale byla vždy zobrazena pouze jedna - aktuální, tzn. naposledy nakreslená. • Mazání nakresleného objektu lze realizovat různě - překreslením barvou pozadí, využitím XOR režimu zobrazování nebo nastavením atributu viditelnosti nakresleného objektu na off. Následující příklad používá naposledy zmíněnou možnost. • Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. fori = 1:n if i ~= 1 set(h,'visible','off'); end h = plot(x(:,i),y(:,i),'-b'); plot(x(3,i),y(3,i),'*k'); pause(0.1); end Pro i rovno 1je třeba zabránit provedení zneviditelňovací operace (zatím nebylo nic nakresleno)
Příklad - Taylorův rozvoj Ve 4. přednášce (polynomy) byl použit příklad na přibližný výpočet hodnoty funkce sinus pomocí Taylorova rozvoje. Taylorův rozvoj funkce sinus lze zapsat Derivace vyšších řádů obvykle zanedbáváme (je však otázkou, co přesně znamená "vyšší řád"). Např. pokud použijeme Taylorův polynom stupně 5, aproximační polynom bude mít tvar: Odpovídající reprezentace polynomu v Matlabu je: Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. REKAPITULACE >> sin5 = [1/factorial(5),0,-1/factorial(3),0,1,0];
Příklad - Taylorův rozvoj Chceme-li vykreslit průběh "skutečné" funkce sinus a její přibližné náhrady pomocí Taylorova rozvoje v intervalu <0, 2>, můžeme použít např. následující skript: Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. REKAPITULACE sin5 = [1/factorial(5),0,-1/factorial(3),0,1,0]; x = linspace(0,2*pi); subplot(2,1,1); plot(x,sin(x),'-r',x,polyval(sin5,x),'-b'); grid on; subplot(2,1,2); plot(x,polyval(sin5,x)-sin(x),'-g'); grid on;
Příklad - Taylorův rozvoj Zvýšení nebo snížení stupně polynomu je sice logicky jednoduché, ale dosti pracné. Ke snížení pracnosti by bylo možné upravit skript do sice delšího, ale pro práci pohodlnějšího tvaru: Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. psin = zeros(1,6); psin(5) = 1; psin(3) = -1/factorial(3); psin(1) = 1/factorial(5); x = linspace(0,2*pi); subplot(2,1,1); plot(x,sin(x),'-r',x,polyval(psin,x),'-b'); grid on; subplot(2,1,2); plot(x,polyval(psin,x)-sin(x),'-g'); grid on;
Příklad - Taylorův rozvoj Pro ilustraci zvýšíme stupeň Taylorova rozvoje na 9: Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. psin = zeros(1,10); psin(9) = 1; psin(7) = -1/factorial(3); psin(5) = 1/factorial(5); psin(3) = -1/factorial(7); psin(1) = 1/factorial(9); ...
Příklad - Taylorův rozvoj Pro další úvahy bude vhodné provést ještě jednu formální úpravu: Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. psin = zeros(1,10); psin(9) = 1; psin(7) = -1/factorial(3); psin(5) = 1/factorial(5); psin(3) = -1/factorial(7); psin(1) = 1/factorial(9); psin = zeros(1,9+1); psin(9-2*0) = (-1)^0/factorial(2*0+1); psin(9-2*1) = (-1)^1/factorial(2*1+1); psin(9-2*2) = (-1)^2/factorial(2*2+1); psin(9-2*3) = (-1)^3/factorial(2*3+1); psin(9-2*4) = (-1)^4/factorial(2*4+1);
Příklad - Taylorův rozvoj V posledním tvaru skriptu je zřejmé, že řádky popisující jednotlivé koeficienty Taylorova polynomu se liší pouze v hodnotě jediného parametru (vyznačeno červeně), jinak se jedná o opakování totožných příkazů. Proto lze vygenerování vektoru popisujícího koeficienty Taylorova rozvoje pro funkci sinus zapsat obecně pomocí cyklu: Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. psin = zeros(1,9+1); psin(9-2*0) = (-1)^0/factorial(2*0+1); psin(9-2*1) = (-1)^1/factorial(2*1+1); psin(9-2*2) = (-1)^2/factorial(2*2+1); psin(9-2*3) = (-1)^3/factorial(2*3+1); psin(9-2*4) = (-1)^4/factorial(2*4+1); N = 9; psin = zeros(1,N+1); fori = 0:floor(N/2) psin(N-2*i) = (-1)^i/factorial(2*i+1); end floor je funkce pro zaokrouhlení směrem dolů (nejbližší nižší celé číslo) Řádky mezi for a end se budou opakovat pro všechny hodnoty i. Pro n = 9 bude i postupně nabývat hodnot0,1,2,3,4.
Příklad - Taylorův rozvoj Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. N = 35; psin = zeros(1,N+1); for i = 0:floor(N/2) psin(N-2*i) = (-1)^i/factorial(2*i+1); end x = linspace(0,2*pi); subplot(2,1,1); plot(x,sin(x),'-r',x,polyval(psin,x),'-b'); grid on; subplot(2,1,2); plot(x,polyval(psin,x)-sin(x),'-g'); grid on;
Algoritmizace - základní pojmy • Pravidlo • vyčerpávající jednoznačný návod, jak provést určitou činnost • Interpret pravidla • někdo (něco), kdo pravidla provádí • Dekompozice a kompozice pravidel • Elementární pravidlo • interpret ho „umí“, není nutná další dekompozice • Postup • soubor pravidel s konečným počtem pravidel a definovaným pořadím • pravidel Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky.
Algoritmus • Smysl mají jen "rozumné" postupy. • Faktickou rozumnost je obtížné formalizovat, formální stránku lze • formalizovat snadno: • Algoritmus = soubor pravidel, který splňuje: • 1. determinovanost • každé pravidlo postupu jednoznačně proveditelné a definovatelné, vždy • jednoznačně určeno, jak pokračovat • 2. rezultativnost • po konečném počtu kroků vede k řešení nebo zjištění, že řešení nelze zajít • 3. hromadnost • řešení třídy úloh (nikoliv jediné úlohy s jediným konkrétním zadáním) • 4. efektivnost • proveditelné pomocí dostupných prostředků v konečném čase Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky.
Algoritmus • „Dům moudrosti“ kalífa Haruna al-Rašída v Baghdádu - Abu Ja'far Muhammad ibn Músá Al Chwarízmí (780-850) • Kitáb al-džam wa-t-tafrígh bi-hisáb al-Hind („Kniha o sčítání a odčítání dle učení indů“): výklad pozičního zápisu čísel, pojem 0, základní operace (+-×÷, půlení, zdvojnásobování, zlomky, druhá odmocnina, ...) • „Hisáb al-džabr wa-l-muqábala“ („Učebnice postupů/převodů při počítání“ - dochoval se jen latinský překlad „Algoritmi Dicit“): grafické a numerické postupy pro řešení rovnic vyšších stupňů (slovní popis mocnin vyšších stupňů, převody stran rovnic ~ "džabrování", důkazy správnosti řešení geometrickými konstrukcemi), kombinace řecké geometrie a babylonské početní algebry • Poziční zápis čísel v „Arabském“ formátu i „algoritmy“ pro práci s nimi se používají dodnes. Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky.
Možnosti zápisu algoritmu • běžný jazyk (technologické postupy, montážní návody, návody k obsluze, kuchařské předpisy, ...) • algoritmické jazyky(programovací jazyky - některé, ...) • speciální grafické prostředky (vývojové diagramy, programovací tabulky - NS, KoPeNogram, ...) Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky.
Vývojové diagramy • pro dokumentaci, pro zachycení myšlenky • dříve stěžejní, dnes okrajová role • spíše nevhodné při návrhu celého (složitějšího) programu • jednoznačný převod z textu programu do vývojového diagramu • nejednoznačný převod opačným směrem (diagram -> prog. jazyk) pro jazyky podporující strukturované programování (Pascal, C, C++, ...) Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. START mezní značka END A = 7 činnost A > 0 rozhodnutí
Vývojové diagramy Příklad: zjištění absolutní hodnoty Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. ABS vstup hodnoty z klávesnice a její uložení do proměnné x x = input() x < 0 - + provede se pouze pokud x < 0 x = -x disp ( x ) zobrazení výsledku na monitor END
Vývojové diagramy Faktoriál: n! = 1×2×...(n-1)×n n! = n×(n-1)! 1! = 1 Pozn.: příklad je jen ilustrativní, Matlab má funkci factorial. Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. Faktorial n = input() y = 1 i = 1 i <= n - + y = y*i i = i+1 disp (y) END
Vývojové diagramy Faktorial Faktorial Pozn.: Tyto varianty výpočtu faktoriálu jsou logicky v pořádku, v Matlabu ale není příkaz pro realizaci cyklu s podmínkou na konci. Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. x = input() x = input() y = 1 i = 0 y = 1 i = 1 i = i+1 y = y*i y = y*i i = i+1 i < x + i <= x + - - disp (y) disp (y) END END
Řídicí struktury • též řídicí příkazy • začínají vždy speciálním klíčovým slovem • řídí průběh provádění programu • lze vnořovat • příkazy if, switch, while, for, break a continue • příkazy if, switch, while a for ukončeny slovem end, které označuje konec řídicího příkazu • seznam příkazů mezi uvozujícím a ukončujícím klíčovým slovem se nazývá tělem řídicího příkazu Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. fori = 1:n if i ~= 1 set(h,'visible','off'); end h = plot(x(:,i),y(:,i),'-b'); plot(x(3,i),y(3,i),'*k'); pause(0.1); end Tělo příkazu if Tělo příkazu for
Příkaz if • řídicí struktura alternativa (selekce) • příkaz pro provedení rozhodnutí • kladná větev, záporná větev Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. x < 7 - LV + - + x = 1 y = x+3 x = 0 tělo 1 tělo 2 if LV tělo 1; else tělo 2; end if x < 7 x = 0; else x = 1; y = x+3; end
Příkaz if • záporná větev často bývá prázdná • v tomto případě se klauzule else neuvádí Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. ABS x = input() x = input('Zadej x:'); if x < 0 x = -x; end disp(x); x < 0 - + x = -x disp ( x ) END
Příkaz if • často nastane nutnost kaskádovitého řazení příkazů if • lze řešit vnořováním, lepší je použít klauzuli elseif Může se vyskytnout libovolný počet klauzulí elseif. Podmínky jsou testovány postupně a jakmile se nalezne prvá pravdivá, provede se odpovídající tělo. Jestliže žádná z podmínek není pravdivá a je přítomna klauzule else, provede se její tělo. V příkazu if se může vyskytnout nejvýše jedna klauzule else, a to v poslední části příkazu. Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. • if podmínka1 • tělo1 • elseif podmínka2 • tělo2 • else • tělo • end
Příkaz if Příklad: výpočet hodnoty funkce dané předpisem: Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. • if x < 1 • y = 0; • elseif x < 2 • y = 1; • else • y = 2; • end
Příkaz switch • Často je potřeba provádět různé akce v závislosti na hodnotě jedné • proměnné. Je to možné zajistit kaskádou příkazů if, avšak pohodlnější je • použít příkaz switch. • hodnotax může být jakýkoliv výraz. • Příkaz switch musí obsahovat alespoň jednu část case se seznamem příkazů. • Část otherwise je volitelná (nepovinná). Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. • switchvýraz • casehodnota1 • seznam_příkazů1 • casehodnota2 • seznam_příkazů2 • ... • otherwise • seznam_příkazů • end
Příkaz switch - příklad Příklad: vykreslí se graf funkce vybrané z menu Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. • x = linspace(0,2*pi); • k = menu('Funkce','sin','cos','exp'); • switchk • case1 • plot(x,sin(x)); • case 1 • plot(x,cos(x)); • case 2 • plot(x,exp(x)); • end
Příkaz while • řídicí struktura cyklus (iterace) • cyklus s podmínkou na začátku Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. i <= x - - LV - + + y = y*i i = i+1 tělo while i <= x y = y * i; i = i + 1; end while LV tělo; end
Příkaz while- příklad • Výpočet faktoriálu Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. N = input('Zadej n:'); F = 1; i = 2; while i <= N F = F * i; i = i + 1; end Faktorial = F
Příkaz while- příklad • Taylorův rozvoj funkce sinus ze začátku přednášky: Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. N = 9; psin = zeros(1,N+1); i = 0; whilei < N/2 psin(N-2*i) = (-1)^i/factorial(2*i+1); i = i + 1; end N = 9; psin = zeros(1,N+1); for i = 0:floor(N/2) psin(N-2*i) = (-1)^i/factorial(2*i+1); end
Příkaz for • řídicí struktura cyklus (iterace) • cyklus s podmínkou na začátku • pokud je třeba opakovat činnost pro všechny prvky nějaké datové struktury kde tělo je příkaz nebo seznam příkazů, výraz je libovolný platný výraz a var může mít několik tvarů (obvykle je to jednoduchá nebo indexovaná proměnná). • Přiřazovací výraz var = výraz v příkazu for pracuje tak, že se proměnné var přiřazuje postupně každý sloupec výrazu. Jestliže výraz je řada, řádkový vektor nebo skalár, hodnotou var bude skalár v každém okamžiku provádění těla cyklu. Jestliže výraz je sloupcový vektor nebo matice, var bude sloupcový vektor. Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. for var = výraz tělo; end
Příkaz for- příklad • Výpočet faktoriálu Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. N=4; F=1; for i=2:N F=F*i; end Faktorial=F N=4; F=1; for i=N:-1:2 F=F*i; end Faktorial=F
Příkaz break a continue • teoreticky zbytné příkazy, prakticky "se hodí" • Příkaz break provádí výskok zevnitř cyklu for nebo while. Výpočet pak pokračuje prvým příkazem následujícím po cyklu. Tento příkaz může být použit pouze uvnitř těla cyklu. • Příkaz continue je, stejně jako break, používán pouze uvnitř cyklů for nebo while. Na rozdíl od příkazu break, který vyskočí z cyklu, příkaz continue přeskočí zbytek těla cyklu a způsobí, že okamžitě začne další opakování těla cyklu (je-li splněna podmínka cyklu, ta se napřed znovu vyhodnotí). Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky.