VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ



Podobné dokumenty
Iterační výpočty. Dokumentace k projektu č. 2 do IZP. 24. listopadu 2004

Iterační výpočty Projekt č. 2

Iterační výpočty. Dokumentace k projektu pro předměty IZP a IUS. projekt č listopadu 2008

Dokumetace k projektu pro předměty IZP a IUS

Základy programování (IZP)

Základy programování (IZP)

Základy programování (IZP)

Iterační výpočty. Dokumentace k projektu pro předměty IZP a IUS. 22. listopadu projekt č. 2

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

Příklad 1. Řešení 1a Máme vyšetřit lichost či sudost funkce ŘEŠENÉ PŘÍKLADY Z M1A ČÁST 3

Základy programování (IZP)

Základy programování (IZP)

. je zlomkem. Ten je smysluplný pro jakýkoli jmenovatel různý od nuly. Musí tedy platit = 0

Algoritmizace a programování

ZÁPOČTOVÁ PRÁCE z UIR

Komisionální přezkoušení 1T (druhé pololetí) 2 x. 1) Z dané rovnice vypočtěte neznámou x:. 2) Určete, pro která x R není daný výraz definován:

Střední odborná škola a Střední odborné učiliště, Hořovice

10. cvičení - LS 2017

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Jednoduché cykly

Wolfram Alpha. v podobě html stránky, samotný výsledek je často doplněn o další informace (např. graf, jiné možné zobrazení výsledku a

Projektč.3dopředmětuIZP. Maticové operace

Funkce a lineární funkce pro studijní obory

X36UNX 16. Numerické výpočty v sh příkazy expr, bc, dc. Zdeněk Sojka

Maturitní témata z matematiky

Algoritmizace. Obrázek 1: Přeložení programu překladačem

Metody výpočtu limit funkcí a posloupností

Učební plán 4. letého studia předmětu matematiky. Učební plán 6. letého studia předmětu matematiky

NMAF 051, ZS Zkoušková písemná práce 17. února ( sin (π 2 arctann) lim + 3. n 2. π 2arctan n. = lim + 3.

Požadavky k opravným zkouškám z matematiky školní rok

ČÁST 1. Základy 32bitového programování ve Windows

FUNKCE 2. Autor: Mgr. Dana Kaprálová. Datum (období) tvorby: září, říjen Ročník: sedmý. Vzdělávací oblast: Informatika a výpočetní technika

ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE

KRY. Projekt č. 2. Kamil Dudka xdudka00

Algoritmy I. Cvičení č. 2, 3 ALGI 2018/19

ALGORITMIZACE Příklady ze života, větvení, cykly

MATEMATIKA Maturitní témata společná část MZ základní úroveň (vychází z Katalogu požadavků MŠMT)

Požadavky k opravným zkouškám z matematiky školní rok

Exponenciální funkce. a>1, pro a>0 a<1 existuje jiný graf, který bude uveden za chvíli. Z tohoto

Dokumentace k projektu pro předměty IZP a IUS

Operační systémy. Cvičení 3: Programování v C pod Unixem

KOMPLEXNÍ ČÍSLA INVESTICE DO ROZVOJE VZDĚLÁVÁNÍ

Rovnice 2 Vypracovala: Ing. Stanislava Kaděrková

2. úkol MI-PAA. Jan Jůna (junajan)

Lekce 01 Úvod do algoritmizace

INTERNETOVÉ ZKOUŠKY NANEČISTO - VŠE: UKÁZKOVÁ PRÁCE

Struktura programu v době běhu

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

I. Kalkulátor Rebell SC2040 manuál s příklady Tlačítko: MODE CLR

Příklad 1 ŘEŠENÉ PŘÍKLADY Z M1B ČÁST 2. Určete a načrtněte definiční obory funkcí více proměnných: a) (, ) = b) (, ) = 3. c) (, ) = d) (, ) =

Mgr. Ladislav Zemánek Maturitní okruhy Matematika Obor reálných čísel

MATURITNÍ TÉMATA Z MATEMATIKY

Nalezněte obecné řešení diferenciální rovnice (pomocí separace proměnných) a řešení Cauchyho úlohy: =, 0 = 1 = 1. ln = +,

Univerzita Karlova v Praze Pedagogická fakulta

Vzorce. StatSoft. Vzorce. Kde všude se dá zadat vzorec

Matematická analýza I

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Gymnázium Jiřího Ortena, Kutná Hora

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

1 Mnohočleny a algebraické rovnice

NMAF 051, ZS Zkoušková písemná práce 16. ledna 2009

Úvod do programování. Lekce 1

Paměť počítače. alg2 1

1. Několik základních pojmů ze středoškolské matematiky. Na začátku si připomeneme následující pojmy:

Požadavky na konkrétní dovednosti a znalosti z jednotlivých tematických celků

Komplexní čísla, Kombinatorika, pravděpodobnost a statistika, Posloupnosti a řady

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

DUM 06 téma: Tvorba makra pomocí VBA

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Cvičení z matematiky jednoletý volitelný předmět

Řešené příklady ze starých zápočtových písemek

Limita funkce. FIT ČVUT v Praze. (FIT) Limita funkce 3.týden 1 / 39

Maturitní otázky z předmětu MATEMATIKA

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Funkce jedné reálné proměnné. lineární kvadratická racionální exponenciální logaritmická s absolutní hodnotou

1 Tyto materiály byly vytvořeny za pomoci grantu FRVŠ číslo 1145/2004.

a r Co je to r-tá mocnina čísla a, za jakých podmínek má smysl, jsme důkladně probrali v kurzu ČÍSELNÉ MNOŽINY. Tam jsme si mj.

FORTANNS. 22. února 2010

Planimetrie 2. část, Funkce, Goniometrie. PC a dataprojektor, učebnice. Gymnázium Jiřího Ortena, Kutná Hora. Průřezová témata Poznámky

Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické

Princip funkce počítače

Maturitní okruhy z matematiky - školní rok 2007/2008

Algoritmizace a programování

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Programování v jazyce C a C++

C2115 Praktický úvod do superpočítání

Tematický plán Obor: Informační technologie. Vyučující: Ing. Joanna Paździorová

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

2.1.4 Funkce, definiční obor funkce. π 4. Předpoklady: Pedagogická poznámka: Následující ukázky si studenti do sešitů nepřepisují.

Jsou tři druhy výrazů, které jsou fuj a u kterých je třeba jisté ostražitosti. Jsou to:

ZŠ ÚnO, Bratří Čapků 1332

LEKCE10-RAD Otázky

Nerovnice, grafy, monotonie a spojitost

Algoritmy a algoritmizace

Vypracoval: Mgr. Lukáš Bičík TENTO PROJEKT JE SPOLUFINANCOVÁN EVROPSKÝM SOCIÁLNÍM FONDEM A STÁTNÍM ROZPOČTEM ČESKÉ REPUBLIKY

Vzdělávací oblast: Matematika a její aplikace Vzdělávací obor: Matematický kroužek pro nadané žáky ročník 9.

Logaritmus. Logaritmus kladného čísla o základu kladném a různém od 1 je exponent, kterým. umocníme základ a, abychom dostali číslo.

Transkript:

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ FAKULTA INFORMAČNÍCH TECHNOLOGIÍ DOKUMENTACE K PROJEKTU 2 DO PŘEDMĚTŮ IZP A IUS ITERAČNÍ VÝPOČTY BC. PETR ŠAFAŘÍK xsafar14 BRNO 2010

Obsah 1 Úvod 1 2 Analýza problému a princip jeho řešení 2 2.1 Funkce počítající tanh(x).............................. 2 2.1.1 Definice funkce............................... 2 2.1.2 Použití dílčích funkcí............................ 3 2.1.3 Algoritmické řešení faktoriálu...................... 3 2.2 Funkce počítající log a (x).............................. 3 2.2.1 Taylorův rozvoj funkce ln(x)....................... 4 2.2.2 Užití řetězových zlomků.......................... 5 2.2.3 Počítání binárního logaritmu....................... 5 2.3 Funkce počítající statistické informace...................... 5 2.3.1 Vážený aritmetický průměr........................ 6 2.3.2 Vážený kvadratický průměr........................ 6 3 Návrh řešení problému 7 3.1 Funkce počítající tanh(x).............................. 8 3.2 Funkce počítající log a (x).............................. 8 3.2.1 Výpočet binárního logaritmu lb(x)................... 9 3.3 Statistické funkce.................................. 10 4 Specifikace testů 11 5 Popis vlastního řešení 13 5.1 Ovládání programu................................. 13 5.2 Implementace.................................... 14 6 Závěr 15 Literatura 16 A Metriky kódu I B Grafy II C Schémata IV i

Seznam obrázků B.1 log(x) vypočtený více algoritmy......................... II B.2 Graf funkce tanh()................................. III B.3 Graf funkcí log 0.5 (x), log 2 (x) a log 10 (x)..................... III C.1 Schéma volání jednotlivých subroutin z funkce main()............ IV C.2 Schéma práce iteračních funkcí.......................... V C.3 Schéma výpočtu tanh(x).............................. VI C.4 Řešení výpočtu e x pomocí funkcí izpexpfact a izpexplim.......... VII C.5 Schéma výpočtu logaritmu............................. VIII C.6 Schéma výpočtu binárního logaritmu lb(x)................... IX C.7 Schéma výpočtu desetinné části binárního logaritmu lb(x).......... X C.8 Schéma volání statistických funkcí........................ XI ii

Typografická konvence Kurzivou jsou psány zásadní termíny či podstatná slova. Neproporciální písmo je použito v případě názvů vlastních funkcí, proměnných a částí kódu. Dále je užit v URLs. [Neproporciální font] v hranatých závorkách je použit pro klávesové zkratky. Šedé pozadí je použito pro zvýraznění prvních slov poznámek. Matematické funkce a konstanty jsou sázeny antikvou. Kaligrafický Font je užit pro sazbu definičního oboru (R, N,... ). iii

Kapitola 1 Úvod Dokumentace k druhému projektu do předmětů IZP základy programování, a IUS Softwarové inženýrství, vyučovaným na VUT v Brně, fakultě informačních technologií. Výsledný program má několik separátních funkcí počítá logaritmus libovolného čísla o libovolném základě a hyperbolický tangens oboje s předem definovanou přesností. Dále program umožňuje počítat vážený průměr ze vstupních hodnot a to bud to vážený aritmetický průměr a nebo vážený kvadratický průměr. Jelikož se jedná o tři vzájemně nesouvisející subroutiny, je řešení každé z nich ve většině kapitol této dokumentace věnována vlastní podkapitola. Bude zde postupně probrán návrh každé subroutiny, její implementace a případné problémy a nebo omezení. Výsledný program je pouze konzolový (CLI), přičemž o vybrané funkci rozhodne uživatel už při spuštění programu pomocí parametru. Pro informace o parametrech stačí spustit program s přepínačem -h, který vypisuje na terminál základní nápovědu. Poté program načítá data ze standardního vstupu a po zpracování je vypisuje opět na standardní výstup. Chybová hlášení se vypisují na standardní chybový výstup. Algoritmy jsou především řešeny jako iterační s podmínkou přesnosti, jak bude vysvětleno dále. Krom výše popsaných funkcí byly v rámci řešení naprogramovány i další knihovní funkce, jako je výpočet x y, kde y je celé číslo, počítání factoriálu a nebo funkce exp(). Řešení je zpracováno v jazyce C, ačkoli se pro matematické výpočty více hodí programovací jazyk Fortran (FORmula TRANslator), který je pro matematické výpočty rychlejší a efektivnější. Na druhou stranu zadání se snaží reflektovat skutečné možné problémy programátora (a je poměrně irelevantní, ve kterém jazyce programátor pracuje) s iteračními výpočty a řešení ve Fortranu by si vyžádalo podobné konstrukce pouze s nejspíše vyšší efektivitou při výpočtech plynoucí z vlastního jazyka. 1

Kapitola 2 Analýza problému a princip jeho řešení Pro použití maker NAN a INFINITY je nutné použít knihovnu math, proto je v některých případech přítomné preprocesové makro #include <math.h>. Ovšem nejsou používány funkce z této knihovny s výjimkou funkce double fabs(double x). 2.1 Funkce počítající tanh(x) 2.1.1 Definice funkce Funkce hyperbolického tangentu je z definice (Bartsch, 1996) definován vztahem (2.1) tanh(x) = ex e x e x. (2.1) + e x Pomocí roznásobení e x e x je možné vztah (2.1) převést na vztah tanh(x) = e2x 1 e 2x + 1, (2.2) který je v routinách dále použit. Graf funkce tanh(x) je na obrázku B.2. Na rozdíl od trigonometrických (a cyklometrických) funkcí nevychází hyperbolické funkce z "jedničkové kružnice", ale z hyperboly, přičemž základem jsou funkce sinh() a cosh() a funkce tanh() a coth() jsou z těchto funkcí zkonstruovány. Definiční obor funkce tanh(x) je celá reálná osa e 2x + 1 nikdy nenabude hodnoty 0. Obor hodnot je interval 1; 1. Hodnot 1, 1 funkce tanh() nabývá v bodě, resp.. Pro výpočet funkce exp(x) (či exp(2x)) je možné využít dvou aproximativních vztahů. První vychází z jedné z možných definic funkce exp(x), druhá z taylorovského rozvoje funkce. Řešení úlohy tanh(x) tedy představuje správné vyčíslení hodnoty exp(x). Poznámka: Od jisté hodnoty (v použitém řešení je tato hodnota ±5) není hodnota tanh(x) počítána, ale rovnou se vrací hodnota 1.0, tedy asymptotickou hodnotu. Další omezení je nutné aplikovat na přesnost algoritmy pro počítání jsou aproximativní a podobně jako v případě hodnoty x by vedly k příliš 2

dlouhým časům při výpočtu. V případě předkládaného programu přesnost limitována na 10 míst. 2.1.2 Použití dílčích funkcí Jak bylo napsáno o několik řádků výše, pro určení hodnoty tanh(x) je nutné určit hodnotu funkce exp(x). Možností vyčíslení hodnoty exp(x) je několik, pro algoritmizaci se ovšem nejlépe hodí dva následující. První vychází z infinitezimálního počtu e x = lim (1 + x ) n. (2.3) n n Rovnice (2.3) ovšem není rekurzivního, rekurentního a ani iteračního typu, takže pro dosažení požadované, předem neznámé přesnosti není možné použít předchozího výsledku a tím pádem je čas potřebný na výpočet delší. Ovšem netrpí přetečením což je naopak neduh u druhé metody vycházející z taylorova rozvoje funkce exp(x), kde platí vztah e x = 1 + x + x2 2! + x3 3! + x4 4! + = x i i!. (2.4) i=0 Silnou nevýhodou tohoto rozvoje je velká náročnost na pamět při výpočtu faktoriálu, který při vyšších číslech snadno způsobí přetečení. Naopak pro hodnoty v intervalu ( 1, 1) se jedná o velice rychle konvergující funkci, kde pro "rozumnou" přesnost nehrozí přetečení. Pokud je požadována přesnost vyšší, je použit algoritmus pomalejší, leč "bezpečnější". 2.1.3 Algoritmické řešení faktoriálu Počítání faktoriálu patří mezi nejčastější rekurzivní vztahy a úlohy. Faktoriál samotný je definován Bartsch (1996) rekurzivně F(0) = 1, F(n) = n F(n 1) (n N 0 ). Místo funkce F(n) se ovšem obvykle používá značení "n!". Z výše napsaného plyne, že n! = 1 2 3 (n 2) (n 1) n. Přehledové hodnoty faktoriálů čísel od 1 15 jsou uvedené v tabulce 2.1. 2.2 Funkce počítající log a (x) Matematická funkce log a (x) je definována ekvivalencí (2.5) log a (x) = y a y = x. (2.5) Logaritmus je inverzní funkce k funkci y = e x a definován pouze pro x R +, tedy kladná čísla reálné osy X. Dále je například z grafu funkce (na obrázku B.3) vidět, že funkce log a (x) je vždy rovna nule v případě, že x = 1; neboli log a (1) = 0. 3

Dále platí: lim log x 0 + a (x) = { + a (0, 1), a (1, ). Aby byl výpočet logaritmu univerzální, co se týče volby základu logaritmu a, je nutné zmínit ještě jednu vlastnost převod různých logaritmů mezi různými základy. Platí totiž (2.6) log a (x) = log b (x) log b (a). (2.7) Rovnice (2.7) vyplývá ze tří základních pravidel pro práci s logaritmy: log x m = m log x, log(x y) = (log x) + (log y), (2.8) ( ) x log = (log x) (log y). y Nyní již je nutné najít nejvhodnější algoritmus pro definování (libovolné) hodnoty logaritmu díky rovnici (2.7) se logaritmy mezi různými základy jednoduše převedou. Mezi uvažované algoritmy patřil taylorův rozvoj funkce ln(x) (logaritmus o základě e) a binární logaritmus (logaritmus o základě 2) a řešení ln(x) řetězovými zlomky. 2.2.1 Taylorův rozvoj funkce ln(x) Taylorův rozvoj je vztah pro aproximaci hodnoty funkce f v bodě a, který má podobu f (x) = f (a) + f (a) 1! (x a) + f (2) (a) 2! (x a) 2 + + f (n) (a) (x a) n. (2.9) n! Pro případ přirozeného logaritmu ln je možné udělat rozvoj funkce ln(x + 1) a z taylorova rozvoje dostaneme ln(x + 1) = x x2 2 + x3 ) 3... = (n+1) xn (( 1). (2.10) n n=1 Bohužel taylorův rozvoj funguje v případě ln jen pro blízké okolí v případě logaritmu je možné jej použít jen pro interval x (0; 2) a to při nekonečném množství iterací dle rovnice (2.10) v praxi je použitelná přesnost pro x (0; 1, 5). Ovšem i při maximálním (nekonečném) počtu kroků je přesný pouze pro polovinu hodnoty základu e. n n! n n! n n! 1 1 6 720 11 39 916 800 2 2 7 5 040 12 479 001 600 3 6 8 40 320 13 6 227 020 800 4 24 9 362 880 14 87 178 291 200 5 120 10 3 628 800 15 1 307 674 368 000 Tabulka 2.1: Tabulka hodnot vypočteného faktoriálu čísel 1 15 4

2.2.2 Užití řetězových zlomků V knize Cuyt et al. (2008) autor mimo jiné uvádí i užití řetězových zlomků pro řešení přirozeného logaritmu ln(x + 1). Algoritmus v knize pracuje dle rovnice ln(x + 1) = 2x 2 + x + (m 1) 2 x 2 m=2 (2m 1)(2 + x). (2.11) Algoritmus byl testován, bohužel se ukázalo, že pro větší hodnoty x není s to dosáhnout požadované přesnosti. Rozdíl hodnoty ln(x) spočtené pomocí tohoto algoritmu oproti správným hodnotám jsou v grafu B.1 na straně II. 2.2.3 Počítání binárního logaritmu Binární logaritmus lb = log 2 tedy logaritmus o základě a = 2 je pro počítač nejvhodnější možné řešení. Všechna data jsou v počítačích uložena jako jedničky a nuly. Jak již bylo napsáno, není podstatné, jestli bude algoritmus používat základ 10, e a nebo 2 díky vztahu (2.7) se spočítá logaritmus x a logaritmus požadovaného základu a vzájemně se podělí. 2.3 Funkce počítající statistické informace Statistika a statistické funkce jsou nutností při zpracování snad všech reálných dat reálná data jsou vždy zatíženy chybami, které rozlišujeme na dva druhy: Systematické chyby jsou takové chyby, které vznikají nevhodným či přímo špatným postupem při získávání dat (např. špatná kalibrace přístroje) a data jsou tak systematicky špatně. Vyhnout se systematickým chybám není vždy jednoduché, ale vždy je možné. Náhodné chyby jsou ovšem chyby vlastní každému měření a jejich odstranění není možné vznik těchto nepřesností je dán zákony (kvantové) fyziky. Ve vědeckých výpočtech (a nejen v nich) se tedy než s jednotlivými daty pracuje se statistickými informacemi. Program proto umí zpracovávat i některé statistické údaje o vstupních hodnotách. Jsou to dvě základní verze počítání váženého průměru aritmetický vážený průměr a kvadratický vážený průměr. Vážený průměr je složitější a o něco sofistikovanější verzí statistického průměru. Zatímco statistický průměr předpokládá, že všechna jednotlivá vstupní čísla jsou stejně podstatná, tak přikládáním různých vah vstupním údajům přikládáme různou důležitost těmto hodnotám váha je tak definována jako nezáporné reálné číslo. V jistém smyslu je možné považovat statistický průměr (at statistický aritmetický průměr nebo statistický kvadratický průměr) za speciální verze váženého průměru, kde mají všechny vstupní hodnoty stejnou váhu. Není možné definovat nic jako definiční obor statistických funkcí je možné dělat statistiku ze všeho. V případě programu je definičním oborem hodnot w celá reálná osa neboli w R a oborem hodnot vah h je celá kladná část reálné osy (h R + ). 5

2.3.1 Vážený aritmetický průměr Aritmetický průměr w z hodnot (w 1, w 2,..., w n ) je matematicky definován (Bartsch, 1996) vztahem (2.12) w = 1 n n w i. (2.12) i=1 Pokud je třeba pracovat i s vahami hodnot, upraví se vztah (2.12) na (2.13) w = n i=1 w i h i n. (2.13) h i i=1 2.3.2 Vážený kvadratický průměr Kvadratický průměr je statistická veličina počítána jako druhá odmocnina z aritmetického průměru druhých mocnin z daných hodnot Bartsch (1996). w = n i=1 w 2 i n. (2.14) Pokud bude do vztahu (2.14) začleněna i práce s vahami, je vztah následující w = n i=1 w 2 i h i n. (2.15) h i i=1 V programu je zapracován i algoritmus pro případ h = 0 nulová váha odpovídá nulové důležitosti hodnoty w. Ta je proto ignorována, pouze se vytiskne předchozí výsledek. Výjimku tvoří první dvojice hodnot, kde nejen záporná, ale i nulová váha znamená ukončení běhu programu. 6

Kapitola 3 Návrh řešení problému Volání programu musí vyhovovat zadání projektu 1. Jednotlivé možnosti jsou shrnuty v tabulce 3. Program musí provést testy vstupních parametrů (vizte kapitolu 4) na jejich správnost, případně se s chybovým hlášením ukončí. Pokud jsou vstupní parametry v pořádku, program vyhodnotí, kterou subroutinu spustit. Jsou-li zvolenou subroutinou statistické funkce, volá přímo modul pro statistické funkce. V případě vyčíslení funkce tanh(x) a nebo log a (x) se přímo z hlavního těla funkce volají funkce pro získání čísla, které se předává příslušné funkci. Funkce počítající log a (x) a tanh(x) vrací spočtenou hodnotu, kterou program přímo tiskne. Práce s matematickými funkcemi tanh(x) a log a (x) je uzavřena do smyčky, jejíž opuštění je EOF na vstup programu 2. Vývojový a rozhodovací diagram hlavní funkce main() je na obrázku C.1. Tento nezachyvuje testování vstupních hodnot. Pro počítání tanh(x) a log a (x) bude použit vztah (2.2) s podmínkou přesnosti sigdig platných míst. Takto definovaná přesnost znamená, že se dvě po sobě jdoucí iterace ite- 1 https://www.fit.vutbr.cz/study/courses/izp/private/projekty/proj2.html 2 Při načítání hodnot ze standardního vstupu se v UNIX-like systémech jedná o klávesovou zkratku Ctrl+D, v případě M$ Windows c S by to měla být klávesová zkratka Ctrl+Z program nikdy nebyl testován na tomto nesystémovém operátoru. Pozor, v případě použití Ctrl+Z na UNIX-like systému proces pouze přesunete na pozadí, přičemž návrat na popředí je možný např. příkazem fg (Bíbr and Šafařík, 2010). Funkce Přepínač Popis Nápověda proj2 -h Vytiskne nápovědu k použití programu. tanh(x) proj2 --tanh sigdig sigdig - přesnost log a (x) proj2 --logax sigdig a sigdig - přesnost; a - základ logaritmu w arit. proj2 --wam Hodnoty váženého aritmetického průměru již načtené posloupnosti hodnot. w kvadr. proj2 --wqm Hodnoty váženého kvadratického průměru již načtené posloupnosti hodnot. Tabulka 3.1: Parametry při spuštění programu 7

račního vztahu se na pozici sigdig+1 nezmění. Uvažujeme-li o přesnosti na 3 platná desetinná místa, poté bude testováno 4. platné místo, nikoli třetí! Každé spočtené číslo tedy vynásobíme hodnotou 10 N+1 a každé dvě iterace od sebe odečteme. Je-li absolutní hodnota rozdílu větší než nula, je třeba udělat další krok. Pokud je menší než jedna (tedy rozdíly jsou pouze zlomky z požadované přesnosti), je splněna výše definovaná podmínka přesnosti a výpočet může být ukončen. Algoritmy izptanh a logax pracují dle schémata na obrázku C.2, více v příslušných podkapitolách této kapitoly. 3.1 Funkce počítající tanh(x) Jak bylo napsáno v části 2.1 na straně 2, je k výpočtu funkce tanh(x) potřeba spočíst tanh(x) = e2x 1 e 2x + 1. Jedná se o přímou aplikaci iteračního algoritmu, jehož schéma je na obrázku C.2 na straně V. V případě, že výsledek nedosahuje požadované přesnosti, volá opět funkci pro výpočet e 2x, ovšem s požadavkem na vyšší přesnost. Z rozboru dvou možných řešení funkcí pro výpočet e x plyne, že v intervalu ( 1, 1) je vhodnější použít rychleji konvergující funkci využívající taylorova rozvoje (vizte část 2.1.2 na straně 3), naopak pro interval x (, 1 1, ) je výhodnější použití definice e x = lim n (1 + x/n) n. Funkce izpexp bude pracovat podle jednoduchého schématu na obrázku C.4a na straně VII. Dvě volané funkce budou pracovat podle schémat C.4b pokud je x ( 1, 1) a nebo C.4c, pokud abs(x) 1; 5. V případě, že funkce izpexpfact není schopna dosáhnout požadované přesnosti, je volána funkce druhá izpexplim. 3.2 Funkce počítající log a (x) Výpočet binárního logaritmu je velmi dobře známý a je tedy takřka nemožné vyhnout se nejrozšířenějším zdrojům informací Knuth (2008, str. 24 26) 3. Je zřejmé, že použitý algoritmus a i implementace je velmi podobná implementaci z těchto velkých zdrojů informací. Výpočet logaritmu musí akceptovat tyto případy a dávat správné výsledky, aniž by bylo nutné výsledky počítat: x < 0 výsledek musí být NAN x = 0 a > 1 výsledek je: x = 0 a < 1 výsledek je: + V případě, že je základ a = 2, není nutné přepočítávat výsledek logaritmu pomocí vztahu (2.7), ale stačí vypočítat jen lb(x). Pro výpočet obecného logaritmu o libovolném základě se využije obecný algoritmus na obrázku C.2 na straně V. Konkrétní podoba algoritmu je na schématu C.5 na straně VIII. Volaná funkce izplgx() počítá binární logaritmus z čísla x a přesností n počet desetinných míst. 3 Ale je možné totožný algoritmus najít i na stránkách projektu http://wikiperia.org 8

3.2.1 Výpočet binárního logaritmu lb(x) Výpočet binárního logaritmu je nutné provádět ve dvou krocích: 1. Spočíst celou část logaritmu subroutina izplgxbin() 2. Spočíst desetinnou část logaritmu subroutina izplgxfrac() Funkce izplgx() prvně spočte celou část logaritmu a poté i desetinnou voláním dvou různých funkcí. V případě, že je x v intervalu x (0; 1), volá se -izplgx() ovšem s argumentem nikoli x, ale převrácené hodnoty 1/x: log 2 x = 1 log 2 x 1 = 1 log 2 1/x x (0; 1) 1/x (1, R + ) Výpočet celé části binárního logaritmu Při výpočtu celé části binárního logaritmu je využito faktu, že známe-li číslo x a základ a, tak logaritmus log a (x) bude větší jako jedna, pokud x > a a menší jako jedna, pokud bude x < a. Pokud je x > a, tak se k výsledné hodnotě přičte 1 a číslo x se základem a podělí. Tato smyčka končí ve chvíli, kdy x < a. Tuto myšlenku je možné zefektivnit použitím podmínek. Je-li číslo x rovno nule, tak je návratová hodnota -1. V případě, že x je větší 2 n, (kde n je postupně n = {16, 8, 4, 2, 1}), tak bude zvětšena hodnota celé části lb(x) o n a x vyděleno 2 n. Algoritmus předpokládá, že největší zpracovávané číslo je 2 32 tedy že bude překlad a běh programu probíhat na 32bitovém operačním systému. Výpočet desetinné části logaritmu Máme-li spočtenu celou část logaritmu, je nutné dopočítat část desetinnou. Tu vypočte subroutina izplgxfrac() pracující s rekurentním algoritmem na schématu C.7. Mějme na začátku číslo x, které spadá do intervalu x (1; 2). Je-li x rovno jedné, poté je algoritmus u konce a navrací nulu. Stejně navrací nulu v případě, že přesnost je rovna nule v tomto případě algoritmus dosáhl požadovaného počtu iterací. Pokud je presnost větší než 0, je dekrementována. Jak již bylo napsáno, tak hodnota x náleží do intervalu (1, 2). Budeme jej tak dlouho umocňovat, dokud nebude x v intervalu x (2; 4). Při každém umocnění naopak vydělíme hodnotu zlomek dvěma. Návratová hodnota je proměnná zlomek+izplgxfrac(x/2,zlomek,presnost) tedy volání dalšího kroku pro zvýšení přesnosti. 9

3.3 Statistické funkce V rámci subroutiny izpstatistics() budou řešeny úlohy pro načtení dvou hodnot (w a váhy h), ověření, že h R + a w i h jsou různé od EOF. Po ověření správnosti načtených veličin budou data w a h předána požadované subroutině izpwam pro vážený aritmetický průměr a nebo izpwqm v případě váženého kvadratického průměru. Funkce počítající průměr (at již se jedná o izpwam tak i izpwqm) musí respektovat, že po každém zpracování hodnot je třeba uložit čitatele a jmenovatele funkce, aby bylo možné zpracovávat další hodnoty. Zvláště v případě počítání kvadratického průměru zopakuji rovnici (2.15) w = n i=1 wi 2 h i n, h i i=1 kde je vidět, že v případě, že by funkce vrátila pouze hodnotu w nebylo by možné počítat dále. Proto je nutné, aby každá funkce vracela nejen výsledek, který se na konci cyklu vytiskne, ale i hodnotu čitatele a jmenovatele, které jí budou při dalším cyklu opět předány jako parametry. Koncept práce statistické subroutiny izpstatistics je na obrázku C.8 na straně XI. Volané subroutiny pouze počítají čitatele, jmenovatele a nakonec výsledek. Funkce izpwam dostane na vstupu hodnoty w a váhu h, dříve spočtený citatel a jmenovatel. Data zpracuje a poté vrátí citatel, jmenovatel a konečně i vysledek. Jednotlivé prvky jsou počítány ze vztahů: citatel = citatel + w h, (3.1) jmenovatel = jmenovatel + h, (3.2) vysledek = citatel jmenovatel. (3.3) Podobně funkce izpwqm dostane na vstupu hodnoty w a váhu h, dříve spočtený citatel a jmenovatel a po zpracování vrátí aktualizované hodnoty citatel a jmenovatel a spočtený vysledek. Obdobou rovnic (3.1), (3.2) a (3.3) pro vážený kvadratický průměr jsou citatel = citatel + w w h, (3.4) jmenovatel = jmenovatel + h, (3.5) citatel vysledek = jmenovatel. (3.6) 10

Kapitola 4 Specifikace testů V této kapitole jsou popsány testy pro odhalení chybných a/nebo nesmyslných vstupních dat. Test 1 Chybná syntaxe kontrola chyby./proj2 #nedostatek parametrů./proj2 -wam #správně --wam./proj2 --tanh -6 #špatný rozsah přesnosti./proj2 --tanh 15 #špatný rozsah přesnosti./proj2 --logax 3 0 #špatný základ logaritmu./proj2 --logax 3 1 #špatný základ logaritmu Test 2 Správnost výsledku Porovnání s předpokládanou správnou hodnotou Statistické funkce wam Testy váženého aritmetického průměru 1 3 1 8 -> 1 #různé váhy stejné hodnoty dají stejnou hodnotu 1 3 1 8 1 150 -> 1 #různé váhy stejné hodnoty dají stejnou hodnotu 1 1 9 1 -> 5 #stejné váhy různé hodnoty dají průměrnou hodnotu 1 1 9 1 80 1 -> 30 #stejné váhy různé hodnoty dají průměrnou hodnotu 1 1 5 0 -> 1 #váha 0 nezmění průměr 1 1 5 0 9 1 -> 5 #váha 0 nezmění průměr Statistické funkce wqm Testy váženého kvadratického průměru 1 3 1 8 -> 1 #různé váhy stejné hodnoty dají stejnou hodnotu 1 3 1 8 1 150 -> 1 #různé váhy stejné hodnoty dají stejnou hodnotu Tangens hyperbolický tanh Testy hyperbolického tangentu +0 -> 0 # Test limity 0/x=0 +5 -> 1 # Test návratu hodnoty x>5-5 -> -1 # Test návratu hodnoty x<-5 11

Logaritmus logax Testy logarimu 0 -> -inf #při základě 3 0 -> +inf #při základě 0.5 1 -> 0 +inf -> -inf #řešení v nekonečnu pro a=3 -inf -> +inf #řešení v nekonečnu pro a=0.5 12

Kapitola 5 Popis vlastního řešení Řešení zadaných problémů vychází z rozborů v kapitolách 2 a 3. Byly zvoleny algoritmy s nejlepším poměrem přesnosti a efektivity. Vše je řešeno sadou vzájemně volaných funkcí, proto je doporučeno použít pro kompilaci přiložený Makefile. Poznámka: Makefile má naprogramovány také cíle pro instalaci (cíl install) a nebo odebrání ze systému (cíl uninstall). V případě úpravy kódu můžete použít cíl clean pro odstranění všech binárních souborů (objekty a nebo spustitelné soubory) a poté i distrib pro vytvoření tar.gz archivu vhodného k redistribuci (výsledný archiv má tvar xsafar14-fit.tar.gz; tvar bez koncovky můžete upravit v cílu TARNAME v souboru Makefile). Tyto cíle jsou ovšem funkční jen v UNIX-like operačních systémech. Pro použití cíle install a uninstall musíte mít práva superuživatele! 5.1 Ovládání programu Jedná se o čistě konzolovou (CLI-pure) aplikaci bez grafického rozhranní (GUI). Vzhledem k několika vzájemně nezávislým funkcím, jsou všechny možnosti popsány v nápovědě programu stačí jej spustit s parametrem -h. V rámci implementace jsou zavedeny některá omezení na požadovanou přesnost, která je součástí vstupních parametrů pro výpočet logaritmu a hyperbolický tangens. Ty se spouští parametry: --tanh presnost pro výpočet hyperbolického tangentu s přesností na presnost desetinných míst a --logax presnost zaklad pro výpočet logaritmu o základě zaklad s přesností přesností na presnost desetinných míst. Pro výpočet statistických informací se program spustí s parametry --wam a --wqm vážený aritmetický/kvadratický průměr. Po spuštění program očekává na standardním vstupu data ke zpracování. V případě funkcí tangentu a nebo logaritmu je to jediná hodnota funkční hodnota dané funkce se poté vypíše na standardní výstup. V případě statistických funkcí se jedná o dvojici dat hodnota a její váha. Funkce počítající statistické informace pracuje s nezápornou hodnotou váhy, přičemž krom první dvojice hodnota-váha je akceptovatelná i nulová váha. 13

5.2 Implementace Parametry z příkazové řádky zpracuje subroutina getparams() převzatá ze "vzorového projektu Ing. Davida Martinka". V případě, že byla zvolena nápověda (parametr -h), program rovnou vypíše nápovědu a skončí. Funkcí log a (x) a tanh(x), je spuštěna smyčka, kdy se funkcí scanf() načte jedna hodnota na vstupu, která se pošle funkci izplogax, případně izptanh. Na standardní výstup je pak funkcí printf() vypsána návratová hodnota volané funkce. Při volání statistických funkcí je spuštěna subroutina izpstatistics(usewqm). Parametrem této funkce je použití kvadratického průměru a nebo ne. Funkce izpstatistics načítá funkcí scanf() hodnoty x a váha, které poté dle parametru UseWQM volá bud to subroutinu pro počítání aritmetického nebo kvadratického váženého průměru dle vztahů (2.13) a (2.15). Hodnoty jsou ukládány do struktury STATISTICS. Na konci smyčky se vypíše aktuální průměr ze všech dříve získaných dat. 14

Kapitola 6 Závěr Program počítá tři úlohy, přičemž volba úlohy k počítání je provedena pomocí parametru při startu programu. Program umí spočíst log a (x), tanh(x) se zadanou přesností a statistické funkce váženého aritmetického a váženého kvadratického průměru. Funkce počítající tanh(x) výsledek řeší pouze v intervalu ( 5; 5) mimo tento interval navrací pouze asymptotickou hodnotu ±1. Funkce počítající log a (x) byla zvolena na základě analýzy (vizte část 2.2 na straně 3) tak, aby byla pokud možno co nejpřesnější a nejrychlejší. Funkce izptanh a izplogax jsou naprogramovány tak, aby je bylo možné použít i v jiných subroutinách. Stejně tak jsou ošetřeny i funkce pro výpočet statistické funkce váženého aritmetického a váženého kvadratického průměru. 15

Literatura H. Bartsch. Matematické vzorce. Mladá fronta, a. s., 1996. I. Bíbr and P. Šafařík. 333 Tipů a Triků pro Mandriva Linux. Computer Press, a. s., 2010. A. Cuyt, V. Petersen, B. Verdonk, and H. Waadeland. Handbook of Continued Fractions for Special Functions. Springer, 2008. D. Knuth. Umění programování; 1. díl Základní algoritmy. Computer Press, a. s., 2008. H. Kopka and P. Daly. L A TEX Kompletní průvodce. Computer Press, 2004. Tato práce byla vysázena v sázecím systému L A TEX 2ε (Kopka and Daly, 2004). 16

Dodatek A Metriky kódu Počet souborů: 19 souborů vč. souborů LICENSE a Makefile Počet řádků zdrojového textu (vč. komentářů): 1 303 řádků Velikost statických dat: 7 209 B 13 117 B (Linux, 32bit, bez ladících informací s optima- Velikost spustitelného souboru: lizací při překladu) Neoddělitelnou součástí programu je soubor s licencí LICENSE program je licencován pod GPLv3+. I

Dodatek B Grafy 0.4 Funkce ln (x) "data" u 1:4 0*x 0.2 log_a(x) 0-0.2-0.4 0 500 1000 1500 2000 2500 3000 3500 4000 4500 5000 Osa x Obrázek B.1: Logaritmus x řešený algorimty binárního logarimu (červená křivka) a řetězovým zlomkem (zelená křivka). Správná hodnota dosazená z knihovny math.h splývá s červenou křivkou. Řešení taylorovým rozvojem není v zobrazených hodnotách osy x je definován jen pro x (0; 2) II

2 (tanh(x)) 1.5 1 0.5 0-0.5-1 -1.5-2 -10-5 0 5 10 Obrázek B.2: Graf funkce tanh() 4 3 Funkce log_a (x) log0.5 (x) log2 (x) log10 (x) 2 1 log_a(x) 0-1 -2-3 -4 0 2 4 6 8 10 12 14 x Obrázek B.3: Graf funkcí log 0.5 (x), log 2 (x) a log 10 (x) III

Dodatek C Schémata main(akce[,presnost[,a]]) nacti_x NE akce = statistika return 0 x = EOF NE akce=wqm NE UseWQM = 0 UseWQM =1 y=izplogax(presnost, x, a) akce = log izpstatistics(usewqm) y=izptanh(presnost,x) akce = tanh x = EOF return 0 vytiskni(y) Obrázek C.1: Schéma volání jednotlivých subroutin z nejvyšší úrovně programu funkce main(). Funkce počítající log a (x) a tanh(x) pracují s již načtenou hodnotou, přesností (a příp. i základem a) IV

iteracni_algoritmus(presnost,x) rad = 10^(presnost+1) n = 0 y_old=urci_krok_0(x,n) n = n+1 y_new = dalsi_krok(x,n,y_old) y_old = y_new delta = abs( rad * (y_new - y_old)) NE delta > 1. return y_new Obrázek C.2: Schéma práce iteračních funkcí, které bylo použity pro řešení algoritmů funkcí tanh(x) a log a (x) V

izptanh(presnost,x) abs(x) > 5 return 1.0 exp2x = izpexp(2*x,1) n = 2 yold = (exp2x-1)/(exp2x+1) rad = izppow(10, presnost+1) exp2x = izpexp(2*x,n) ynew = (exp2x-1)/(exp2x+1) delta = abs( rad * (ynew-yold)) n++ yold = ynew return ynew NE delta > 1.0 Obrázek C.3: Schéma výpočtu tanh(x) se zadanou přesností presnost VI

izpexp(x,presnost) return izpexplim(x,presnost) NE (x < 1) && (x > -1) status = izpexpfakt(x,presnost) return izpexplim(x,presnost) status == -1 NE return status (a) Schéma volání dvou různých funkcí pro výpočet e x izpexplim(x,presnost) izpexplim(x,presnost) rad = izppow(10,presnost+1) rad = izppow(10,presnost+1) yold = 1 yold = 1. + x n = 1 ynew=yold+((izppow(x,n)/izpfactorial(n)) ynew = izppow((1 + x/n), n ) n = n+1 n = n+10 delta = abs( rad * ( ynew - yold) delta = abs( rad * (ynew-yold)) n > 15 return -1 yold = ynew yold = ynew delta > 1. delta > 1 return ynew (b) Schéma volání funkce izpexpfact return ynew (c) Schéma volání funkce izpexplim Obrázek C.4: Řešení výpočtu e x pomocí funkcí izpexpfact a izpexplim VII

izplogax(presnost,a,x) x < 0 return NAN x == 0 && a>1 return -INFINITY x == 0 && a<1 return +INFINITY x == 1 return 0 rad = pow(10.,presnost+1) n = 2 lgx=izplgx(x,1) yold = lgx NE a!= 2 lga=izplgx(a,1) yold = lgx / lga lgx = izplgx(x,n) ynew = lgx NE a!= 2 lga=izplgx(a,n) ynew = lgx / lga lgx = izplgx(x,n) n++ delta = fabs( rad*(yold-ynew)) yold = ynew delta > 1 NE return ynew Obrázek C.5: Schéma výpočtu logaritmu VIII

izplgx(x,presnost) rad=pow(10,presnost+1) n = 3 return (-1.0)*izplgx(1/x,presnot) NE x > 1 cele=izplogbin(x) zlomek=x*(1/pow(2,cele)) yold = cele+izplgxfrac(zlomek,1,2) ynew =cele + izplgxfrac(zlomek,1,n) n++ delta = fabs(rad*(ynew-yold)) yold=ynew return ynew NE delta>1 Obrázek C.6: Schéma výpočtu binárního logaritmu lb(x) IX

izplgxfrac(x,zlomek,presnost) presnost == 0 return 0 x ==1 return 0 presnost-- x < 2 i += 1 return zlomek + izplgxfrac(x/2,zlomek,presnost) zlomek /= 2 x *= x Obrázek C.7: Schéma výpočtu desetinné části binárního logaritmu lb(x) X

izpstatistics(usewqm) stav = nacti(w) stav == EOF return 0 stav!= 1 print(nan) stav = nacti(h) stav == EOF print(nan) return 0 stav!= 1 print(nan) h < 0 printerr("záporná váha!") return 1 [vysledek,citatel,jmenovatel] = izpwam(w,h,citatel,jmenovatel) NE (UseWQM == 1) [vysledek,citatel,jmenovatel] = izpwqm(w,h,citatel,jmenovatel) print(vysledek) return 0 NE stav == 1 Obrázek C.8: Schéma volání statistických funkcí XI