Základy programování (IZP) Bonusové laboratorní cvičení Vysoké učení technické v Brně, Fakulta informačních technologií v Brně Božetěchova 2, 612 66 Brno Cvičící: Petr Veigend (iveigend@fit.vutbr.cz) Gabriela Nečasová Petr Veigend 2014/2015
Obsah Zopakování zadání druhého projektu Zopakování problematiky iteračních výpočtů Obecný úvod Taylorova řada (minule e^x) Zřetězené zlomky IZP doplňkové cvičení 2
Seznámení se zadáním druhého projektu Iterační výpočty obhajoba: 24.11.2014 odevzdání: 30.11.2014 do WISu dokumentace: 05.12.2014 Název: proj2.c Výstup: standardní výstup pro výpis výsledků (na wiki) standardní chybový výstup pro výpis chyb V rámci projektu můžete používat pouze matematické operace +,-,* a / Součástí projektu je i dokumentace Zakázáno: použití math.h (až na isnan(), isinf(), tan() a konstanty NAN a INF) IZP doplňkové cvičení 3
Porovnání metod (--tan) Budete počítat funkci tangens dvěma iteračními výpočty: Taylorova řada (Taylor series) tan x = x + x3 3 + 2x5 15 + 17x7 315 + 62x9 2835 + Budete potřebovat 13 čitatelů a jmenovatelů (viz zadání) Zřetězené zlomky (Continued Fractions) Není omezena úroveň zanoření tan x = 1 3 x x 2 x 2 5 x2 7 IZP doplňkové cvičení 4
Porovnání metod (--tan) Vaše výsledky porovnáte s výsledky knihovní funkce tan() Pozor na správný formát výstupu Zkratka Význam Formát I počet iterací %d M tan() z math.h %e T taylor_tan() %e TE absolutní chyba (Taylor) %e C cfrac_tan() %e CE absolutní chyba (zlomky) %e Při porovnávání metod NEBUDETE uvažovat přesnost 1e-10 a odvozovat počet iterací tak, aby byla přesnost dosažena IZP doplňkové cvičení 5
Vzdálenost a výška měřeného objektu (-m) Pomocí metody zřetězených zlomků budete pomocí tangens úhlů α a β počítat proměnné d a v (pokud bude zadán i úhel β) na následujícím obrázku: Proměnná c je implicitně nastavena, ale pomocí argumentu příkazového řádku se může měnit Při výpočtech BUDETE uvažovat přesnost 1e-10 a odvozovat počet iterací tak, aby byla přesnost dosažena Pozor: výpis ve formátu %.10e IZP doplňkové cvičení 6
Další informace o implementaci Při implementaci věnujte pozornost: Nejdříve správnému algoritmickému schématu zápisu iteračního výpočtu, poté přesnosti (tj. počtu iterací), a až nakonec urychlování a optimalizaci (při hodnocení na to bude brán zřetel) Všechny úhly budou v radiánech a v prvním kvadrantu [0, π 2 ) Desetinná čísla budou typu double IZP doplňkové cvičení 7
Překlad programu Pokud používáme funkce z math.h, je nutné při překladu použít přepínač -lm: gcc std=c99 Wall pedantic g lm proj2.c o proj2 IZP doplňkové cvičení 8
Rekurentní problémy [1] Rekurentní problém: výpočet nové hodnoty závisí na hodnotě výpočtu z předcházejícího kroku Rekurentní vztah obecně: Y i+1 = F(Y i ) Pro výpočet hodnoty Y i+1 je nutné zjistit hodnotu Y i IZP doplňkové cvičení 9
Rekurentní problémy [1] Musí být dána počáteční hodnota Y 0 Co musí platit pro hodnoty získané posloupnosti Y i+1 = F(Y i ) pro y 0 Y i Y j pro všechna i j Y i pro i < N nesplňuje podmínky požadované hodnoty Y N splňuje podmínky hledané hodnoty IZP doplňkové cvičení 10
Rekurentní problémy [1] Algoritmické schéma řešení Y = y0; // Y proměnná, y0 počáteční hodnota while( B(Y)) // dokud není splněna koncová podmínka Y = F(Y); // budeme počítat další prvek // posloupnosti IZP doplňkové cvičení 11
Rekurentní problémy [1] Algoritmické schéma řešení Y = y0; // Y proměnná, y0 počáteční hodnota while( B(Y)) // dokud není splněna koncová podmínka Y = F(Y); Zápis v C může vypadat např. double y = y0; // budeme počítat další prvek // posloupnosti while(!b(y)) // dokud není splněna koncová podmínka return y; y = f(y); // budeme počítat další prvek // posloupnosti IZP doplňkové cvičení 12
Ukončovací podmínka [1] Běžně se iterační výpočet ukončí, pokud Y i Y i 1 EPS To se dá v C zapsat např. double y = y0; // aktuální člen double yp; // předchozí člen do { yp = y; // uložíme hodnotu předchozího členu y = f(y); // vypočítáme další člen } while (fabs(y - yp) >= eps); Algoritmické schéma lze použít pro výpočet číselných řad (Taylorův rozvoj), kterými lze aproximovat funkce IZP doplňkové cvičení 13
Výpočet řad [1] K výpočtu řad se používají částečné součty Pro řadu t 0, t 1, t 2, t 3,, kde t i = f t i 1 můžeme napsat řadu částečných součtů s 0, s 1, s 2, s 3,, kde s i = Můžeme je opět řešit rekurentně: i j=0 s 0 = t 0 s i = s i 1 + t i částečný součet pro aktuální člen je částečný součet pro předchozí člen + hodnota aktuálního členu t j IZP doplňkové cvičení 14
Výpočet řad [1] Algoritmické schéma T = t0; // první člen řady S = T; // součet = první člen řady while( B(S, T)) { } T = f(t); // vypočítáme nový člen řady S = S + T; // tento člen přičteme k aktuálnímu // částečnému součtu Je nutné si vždy zjistit, jak se od sebe liší jednotlivé členy řady Pozor: Některé řady konvergují nejrychleji jen v omezeném definičním oboru funkce IZP doplňkové cvičení 15
Iterační výpočty součtové řady Jak postupovat??? e x = 1 + x + x2 2! + x3 3! + x4 4! + IZP cvičení 3 16
Iterační výpočty součtové řady Jak postupovat??? e x = 1 + x + x2 2! + x3 3! + x4 4! + // x je v zadání // přesnost (eps) je v zadání // Základní proměnné: // částečný součet // současný a předchozí člen // Určete rozdíl mezi jednotlivými členy řady cyklus(ukončovací podmínka) { // výpočet nového členu řady // výsledek += nový člen řady } IZP cvičení 3 17
Zřetězené zlomky V následujícím příkladu budeme počítat číslo π pomocí zřetězeného zlomku Úroveň rozvoje zřetězeného zlomku (n) je zvolena na 4 IZP doplňkové cvičení 18
Zřetězené zlomky Implementujte výpočet čísla π pomocí zřetězeného zlomku: π = 1 + n = 4 3 + 4 5 + 1 2 2 2 3 2 7 + 42 9 + IZP doplňkové cvičení 19
Zřetězené zlomky Implementujte výpočet čísla π pomocí zřetězeného zlomku: π = n = 3 1 + n = 4 3 + 4 5 + 1 2 2 2 3 2 7 + 42 9 + IZP doplňkové cvičení 20
Zřetězené zlomky Implementujte výpočet čísla π pomocí zřetězeného zlomku: π = n = 2 n = 3 1 + n = 4 3 + 4 5 + 1 2 2 2 3 2 7 + 42 9 + IZP doplňkové cvičení 21
Zřetězené zlomky Implementujte výpočet čísla π pomocí zřetězeného zlomku: n = 1 π = n = 2 n = 3 1 + n = 4 3 + 4 5 + 1 2 2 2 3 2 7 + 42 9 + IZP doplňkové cvičení 22
Zřetězené zlomky Jak bylo řečeno, při výpočtu funkce tangens pomocí zřetězeného zlomku budete uvažovat přesnost 1e-10 a upravovat počet členů Postup výpočtu: // inicializace prvních dvou úrovní zanoření while (fabs(aktuální předchozí) > eps) { // provedení iteračního výpočtu // zavolání funkce pro výpočet, uložení nové // hodnoty }; IZP doplňkové cvičení 23
Zřetězené zlomky inicializace Pro n=1mplementujte výpočet čísla π pomocí zřetězeného zlomku: π = 4 1 IZP doplňkové cvičení 24
Zřetězené zlomky inicializace Pro n = 2výpočet čísla π pomocí zřetězeného zlomku: Atd. π = 4 1 + 12 3 IZP doplňkové cvičení 25
Poznámka Nepoužívejte zvláštní funkce pro výpočet Mocniny Faktoriálu apod. Vždy dopočítávejte pouze rozdíly mezi jednotlivými členy IZP doplňkové cvičení 26
Děkuji Vám za pozornost! IZP doplňkové cvičení 27
Použitá literatura [1] Materiály ke třetímu demonstračnímu cvičení. FIT VUT IZP doplňkové cvičení 28