SP_SouradaTomas - Gymnázium Žamberk

Transkript

SP_SouradaTomas - Gymnázium Žamberk
 Gymnázium Žamberk Zajímavé matematické výpočty Seminární práce Informatika Autor: Tomáš Sourada Třída: 5. A Vedoucí práce: Mgr. Petr Vanický Žamberk 2016 Prohlášení: Prohlašuji, že jsem seminární práci vypracoval samostatně pod vedením Mgr. Petra Vanického a že jsem v seznamu použité literatury uvedl všechny prameny, ze kterých jsem vycházel. V Žamberku dne 15. 5. 2016
Jméno a příjmení: Tomáš Sourada 2 Poděkování Rád bych poděkoval panu učiteli Mgr. Petrovi Vanickému za vstřícný přístup, pomoc a podporu při psaní seminární práce. 3 Anotace SOURADA, T. Zajímavé matematické výpočty. Žamberk 2016. Seminární práce na Gymnázium Žamberk. Vedoucí seminární práce Mgr. Petr Vanický. 29 stran. Tato seminární práce se zabývá zajímavými matematickými výpočty za použití programování a počítačové techniky. Zmiňuje matematické výpočty bez použití počítače a jejich nevýhody. Porovnává počítání s pomocí výpočetní techniky a bez ní. Klíčová slova matematika, Small Basic, programování, iracionální číslo, Eulerovo číslo, e, faktoriál, počítač, odmocnina 4 Obsah Úvod Teoretická část Druhá odmocnina Eulerovo číslo Faktoriál Praktická část Small Basic Druhá odmocnina Metoda půlení intervalu Tabulka 1: Druhá odmocnina ­ odmocnina z 2015. Tabulka 2: Druhá odmocnina ­ kalkulačky. Eulerovo číslo Definice (1) Definice (2) Definice (1) + (2) Tabulka 3: Eulerovo číslo ­ Definice (1)+(2). Porovnání Vysvětlení Faktoriál Tabulka 4: Faktoriál ­ Druhý program v SB. Tabulka 5: Faktoriál ­ Třetí program v SB. Tabulka 6: Faktoriál ­ Třetí program ve VFP. Tabulka 7: Faktoriál ­ Druhý program ve VFP. Závěr Seznam použitých materiálů Seznam použité literatury Seznam použitých obrázků Seznam tabulek Přílohy Zajímavé odkazy 5 Úvod Téma seminární práce „Zajímavé matematické výpočty” jsem si zvolil z toho důvodu, že mě velice baví matematika jako taková, že už mnoho let řeším matematickou olympiádu, a hlavně proto, že když jsme se v prvním ročníku v informatice učili programovat, zaujalo mě, jak snadno lze napsat program, který spočítá něco, co by „ručně” trvalo hodně dlouho nebo by bylo nemožné spočítat. Původním tématem seminární práce byl „Výpočet konkrétního iracionálního čísla”. Rozhodl jsem se pro pěkné iracionální číslo ­ odmocninu z 2015. Ale pak jsem při hodinách matematiky a hlavně při řešení matematické olympiády a na kroužku matematiky vídal různé vzorce a řady, například na výpočet čísla e či na odhad faktoriálu u velkých čísel. Jelikož právě tyto řady nejdou snadno spočítat s tužkou a papírem, rozhodl jsem se, že si je naprogramuji. A když jsem se tímto tématem zabýval dál, rozhodl jsem se, že z něj učiním téma celé své seminární práce. Proto se v této seminární práci zabývám kromě programu pro výpočet druhé odmocniny i několika způsoby, jak vypočítat Eulerovo číslo, a také odhadem faktoriálu. Seminární práce je rozdělena na teoretickou a praktickou část a každá z těchto částí je rozdělena na tři podkapitoly, zabývající se jednotlivými tématy, plus praktická část obsahuje podkapitolu navíc obsahující základní informace o programovacím jazyku, ve kterém píši. V teoretické části si povíme základní informace a daných tématech, zazní něco o historii Eulerova čísla a o jeho vlastnostech a také se dozvíme, co vlastně znamená pojem faktoriál, v jakých oblastech matematiky se nejčastěji používá a proč je tak důležitý. V praktické části se zaměříme na samotné programy, které jsem napsal v jednoduchém programovacím jazyku Small Basic, se kterým jsem se naučil pracovat ve škole. Ukážeme si funkce, které Small Basic má, a také narazíme na problém s nemožností využití funkcí, které Small Basic bohužel neobsahuje. Řekneme si něco o samotném programovacím jazyku. Vysvětlíme si rozdíly v jednotlivých programech, které napíši, a metodách počítání. Uvidíme, zda při vysokých číselných hodnotách nedělá program početní chyby, které by se mohly výrazně projevit na výsledku, a zamyslíme se nad způsoby, jak těmto možným chybám předejít. 6 Teoretická část Druhá odmocnina Druhá odmocnina je speciálním typem obecné odmocniny. Často je označována pouze jako odmocnina. Odmocnina z čísla ​
a se značí √a a je definována jako objekt ​
b​
, pro který platí b2 = a . Geometrický význam druhé odmocniny je takový, že √a je délka strany čtverce, jehož obsah je ​
a​
. [1] Obrázek 1: Graf funkce druhá odmocnina f (x) = √x tvoří polovina paraboly souměrné podle osy x.
Eulerovo číslo Eulerovo číslo, e, základ přirozených logaritmů, Napierova konstanta. Pod všemi těmito názvy je známá jedna z nejzákladnějších matematických konstant. Ačkoliv je pojmenována po úspěšném švýcarském matematikovi, který publikoval i řadu matematických knih, Leonhardu Eulerovi, resp. po skotském matematikovi­amatérovi Johnovi Napierovi, který objevil logaritmus, první člověk, který na něj narazil při svých výpočtech, byl Jacob Bernoulli, významný švýcarský matematik a fyzik, který se snažil vypořádat s problémem n
složeného úrokování1)​
​
, při kterém právě došel k limitě lim (1 + 1n ) . Značení oné konstanty n→∞
1)​
O složeném úrokování si můžete více přečíst zde: https://cs.wikipedia.org/wiki/Slo%C5%BEen%C3%A9_%C3%BAro%C4%8Den%C3%AD 7 písmenkem ​
e poprvé použil Leonhard Euler roku 1728 (nebo 1736, 1727, historici se v určení n
roku rozcházejí). Označil jím právě limitu lim (1 + 1n ) . Euler také označil e jako součet n→∞
∞
posloupnosti e = ∑
n=0
1
n!
= 0!1 + 1!1 + 2!1 + 3!1 + 4!1 ... O vlastnostech Eulerova čísla píše Wikipedie: ​
„Eulerovo číslo je iracionální, tzn. jeho desetinný rozvoj je nekonečný a neperiodický. Dokonce je transcendentní, tzn. nelze ho vyjádřit jako kořen konečného mnohočlenu s celočíselnými koeficienty.” ​
[2][3][4] Faktoriál Faktoriál čísla n je označován n! a je roven součinu všech kladných celých čísel menších nebo rovných n (pro kladné n, pro n=0 je faktoriál 1). Například 8! = 8 × 7 × 6 × 5 × 4
× 3 × 2 × 1 = 40320. Výraz n! čteme „n faktoriál”. Toto značení se v matematice používá od roku 1808, kdy jej zavedl Francouz Christian Kramp. Své využití faktoriál nachází hlavně v kombinatorice, kde tvoří tzv. kombinační číslo (obr.2). Faktoriál čísla n také udává počet permutací množiny n prvků, tzn. počet způsobů, jak seřadit n různých objektů.​
​
[5] Obrázek 2: Kombinační číslo, ve kterém se používá funkce faktoriál. 8 Praktická část Small Basic Internetová Encyklopedie Wikipedie o Small Basicu píše: „​
Microsoft Small Basic je zjednodušená verze programovacího jazyka BASIC vytvořená firmou Microsoft v Říjnu 2008. Obsahuje minimum pojmů a je jednoduchý pro pochopení. Obsahuje pouze 15 klíčových slov a prostředí je přívětivé pro začátečníky. Microsoft Small Basic byl navržen skupinou Microsoft DevLabs a byl představen na Technology Preview v říjnu 2008. Jazyk je vhodný pro všechny, kteří začínají s programováním – od dětí po dospělé.” ​
[6] Obrázek 3: Ukázka přívětivého a jednoduchého prostředí Small Basicu. Druhá odmocnina Metoda půlení intervalu Pro výpočet druhé odmocniny z libovolného přirozeného čísla n využiji metodu půlení intervalu. Ta spočívá v tom, že nejprve vymezím dvě po sobě jdoucí přirozená čísla, mezi kterými se odmocnina z n vyskytuje (budu srovnávat, zda je druhá mocnina čísla větší či 9 menší než n). Pak tento interval rozdělím na poloviny a opět srovnáváním funkce druhá mocnina s n zjistím, ve které polovině se odmocnina z n nachází. Tím dostanu interval, který opět rozpůlím, a stejným způsobem budu pokračovat tak dlouho, jak bude zapotřebí pro zadanou přesnost. 1) Programátorský způsob, jak vymezím ona dvě po sobě jdoucí čísla, mezi jimiž se odmocnina nachází: Zavedu si dvě proměnné (VyssiOdhad, MocninaVyssihoOdhadu), za které nejprve dosadím nulu. Zavedu cyklus While s podmínkou, že proměnná MocninaVyssihoOdhadu je menší než číslo n, jehož druhou odmocninu zjišťujeme. V cyklu zvětším proměnnou MocninuVyssihoOdhadu. VyssiOdhad Následuje o jedna a konec cyklu vypočítám novou While. Jakmile MocninaVyssihoOdhadu nabude hodnoty větší než číslo n, víme, že máme větší z těch dvou po sobě jdoucích čísel (VyssiOdhad). To druhé je logicky o jedno menší. 2) Nyní mám proměnné Vyssi a Nizsi, což jsou po sobě jdoucí čísla. Vezmu jejich aritmetický průměr (proměnná Prumer), vypočítám jeho druhou mocninu a nastane jedna ze tří možností: a) ​
Mocnina průměru je menší než n ​
­ pak se odmocnina z n nachází v intervalu Prumer až Vyssi. Proto Vyssi odhad necháme stejný, za Nizsi odhad dosadíme hodnotu Prumeru. b) Mocnina průměru je větší než n ­ pak se odmocnina z n nachází v intervalu Nizsi odhad až Prumer. Proto Nizsi odhad necháme stejný, za Vyssi dosadíme hodnotu Prumeru. c) Mocnina průměru se rovná n ​
­ pak se odmocnina z n rovná hodnotě Prumeru. Je vyřešeno, nemusíme počítat dál, odmocnina je hotová. Toto celé dáme do cyklu For, který budeme opakovat tak dlouho, jak budeme potřebovat pro zadanou přesnost. Ale to je jak dlouho? 3) Zjistíme, jak dlouho (kolikrát) pro jakou zadanou přesnost musíme cyklus (2) opakovat: Po jednom opakování se interval zmenší na ½, po druhém na ¼ z původního, neboli na 12 a​
po x opakováních tedy na 21x .​
Pro přesnost na 1 desetinné 2
místo potřebujeme z původního intervalu 1
1
10 , pro y desetinných míst 10y
. ​
​
Takže počet opakování proměnná Presnost je rovna takovému x (co nejmenšímu), pro které je 2 větší než 10 . Proměnná y je rovna počtu míst za desetinnou čárkou. x
y
10 4) Jakmile máme cyklus zopakovaný tolikrát, kolikrát potřebujeme, stačí výsledný průměr zaokrouhlit na zadaný počet desetinných míst a vypsat ho uživateli. 5) Aby byl můj program přívětivý pro uživatele, zabalil jsem ho celý do cyklu While. Na konci se uživatele zeptá, zda chce pokračovat dál, a pokud uživatel chce, program běží od začátku. Ale dost povídání, zde je můj program: Pokracovani="ano" Text.ConvertToLowerCase(Pokracovani) While (pokracovani<>"ne") TextWindow.Write("Zadejte číslo, které chcete odmocnit:") Zaklad=TextWindow.ReadNumber() TextWindow.Write("Na kolik míst za desetinnou čárkou chcete výsledek zaokrouhlit (ne víc než 20):") PocetMist=TextWindow.ReadNumber() If PocetMist>20 Then PocetMist=20 EndIf Doreseno="ne" ZlomekPresnosti10=Math.Power(10,PocetMist) Presnost=0 ZlomekPresnosti2=1 While (ZlomekPresnosti2<ZlomekPresnosti10) ZlomekPresnosti2=ZlomekPresnosti2*2 Presnost=Presnost+1 EndWhile VyssiOdhad=0 MocninaVyssihoOdhadu=0 While (MocninaVyssihoOdhadu<Zaklad) VyssiOdhad=VyssiOdhad+1 MocninaVyssihoOdhadu=Math.Power(VyssiOdhad,2) If (MocninaVyssihoOdhadu=Zaklad) Then Doreseno="ano" 11 Odmocnina=VyssiOdhad EndIf EndWhile Vyssi=VyssiOdhad Nizsi=VyssiOdhad­1 If (Doreseno="ne") Then For i=1 To (Presnost) If (Doreseno="ne") Then Prumer=(Nizsi+Vyssi)/2 MocninaPrumeru=Math.Power(Prumer,2) If (MocninaPrumeru<Zaklad) Then Nizsi=Prumer ElseIf (MocninaPrumeru>Zaklad) Then Vyssi=Prumer ElseIf (MocninaPrumeru=Zaklad) Then Doreseno="ano" EndIf EndIf EndFor Zaokrouhlovani=Prumer*ZlomekPresnosti10 Odmocnina=Math.Round(Zaokrouhlovani) Odmocnina=Odmocnina/ZlomekPresnosti10 EndIf TextWindow.WriteLine("Odmocnina z čísla "+Zaklad+" s přesností na "+PocetMist+" desetinných míst je "+Odmocnina+".") TextWindow.WriteLine("Chcete pokračovat dál?") Pokracovani=TextWindow.Read() EndWhile Počet rozpůlení intervalu Vypočítaná 2015 odmocnina z 1 44.500000000000000 2 44.750000000000000 12 3 44.875000000000000 4 44.937500000000000 5 44.906250000000000 6 44.890625000000000 7 44.882812500000000 8 44.886718750000000 9 44.888671875000000 10 44.889648437500000 15 44.888763427734370 20 44.888751029968260 25 44.888751357793810 30 44.888751375488940 35 44.888751374935960 40 44.888751374927780 45 44.888751374926900 50 44.888751374926880 Tabulka 1: Druhá odmocnina ­ odmocnina z 2015. Ukázka výstupu napsaného programu ­ zvyšování přesnosti výsledku s každým dalším krokem. Typ kalkulačky Odmocnina z 2015 http://www.kalkulacka­online.com/ nemá funkci odmocnina http://www.kalkula.cz/ 44.889 Casio pro vysoké školy 44.88875137 http://www.calculator.net/ 44.888751375 Google kalkulačka 44.8887513749 http://www.online­calculator.com/ 44.888751374926 13 Kalkulačka na mobilu Nokia C1­01 44.888751374927 Můj program spuštěný ve Small Basicu 44.8887513749269 http://www.calculator.com/pantaserv/makec
alc 44.88875137492688 http://www.kalkulacka.info/ 44.88875137492688 http://web2.0calc.com/ 44.8887513749268816 Kalkulačka ­ příslušenství ve Windows XP 44,888751374926881563599680919998 http://www.numerics.info/ 44.888751374926881563599680919998171
50732429299478523442596154692 Tabulka 2: Druhá odmocnina ­ kalkulačky. Výběr snadno dostupných kalkulaček a poměření jejich přesnosti při počítání druhé odmocniny z 2015 s přesností mého programu. Kalkulačky jsou v tabulce seřazeny od nejméně přesné až po tu nejlepší. S přehledem vítězí webová kalkulačka Numerics.info. Eulerovo číslo Pro výpočet Eulerova čísla využiji dvě nejznámější definice, jejichž ekvivalenci dokázal Leonhard Euler: ∞
1) e = ∑
n=0
1
n!
= 0!1 + 1!1 + 2!1 + 3!1 + 4!1 ... ­ e je definováno jako součet této nekonečné řady. n
2) e = lim (1 + 1n ) n→∞
­ e je definováno jako limita této posloupnosti. Definice (1) je velice rychle rostoucí, zatímco definice (2) roste k e mnohem pomaleji. Definice (1): jelikož jde o řadu rychle se zmenšujících čísel, již po malém množství členů máme přesně první desetinná místa e. Z důvodu, že chceme porovnávat definice (1) a (2), upravíme obě definice: 1
0!
+ 1!1 + 2!1 + 3!1 + 4!1 + ... + n!1 1)
e~
2)
e ~ (1 + 1n ) n
Budeme počítat, jak rychle (pro jak velká n) jednotlivé definice konvergují k e. 14 Definice (1) Napíšeme program, který vypočítá daný faktoriál, výsledkem vydělí číslo jedna a výsledek přičte k základu. Jenže, jak si ukážeme, tento program bude mít řadu nevýhod: ​
'První způsob vypočítání čísla e.. For n=1 To 50 ​
(abychom viděli, jak funkce roste, odhadneme e pro čísla n od jedné do padesáti) e1=1 ​
(za 0! raději rovnou přiřadíme hodnotu 1) FaktorialI=1 ​
(budeme násobit, proto musíme pro první průchod cyklem za tuto hodnotu dosadit 1) zaokr=1000000000 ​
(přesnost zaokrouhlení výsledku; co nula, to jedno desetinné místo) For i=1 To n ​
(počítáme n!, proto musíme nkrát opakovat akci násobení původního výsledku číslem i) ​
FaktorialI=FaktorialI*i e1=e1+1/FaktorialI​
​
(zde konečně přičteme výraz i!1 k mezivýsledku) EndFor​
​
(ukončení cyklu) e1z=(Math.Round(e1*zaokr))/zaokr ​
(probíhá zaokrouhlení na zadaný počet des. míst) TextWindow.WriteLine(n+" : "+e1z) ​
(program vypíše jednotlivá n a odhad e pro ně) EndFor​
​
(ukončení cyklu) Jenže když tento program vyzkoušíme, zjistíme, že se zasekne už u n=28 a ohlásí chybu, protože číslo n! je pro jeho výpočty příliš veliké číslo. Proto musíme do programu vložit omezení: For n=1 To 50 e1=1 FaktorialI=1 zaokr=1000000000 If n>27 Then ​
(pro n větší než 27 program dosadí hvězdičky ­ důkaz, že selhaly výpočty) ​
e1z="**********" Else​
​
(a pouze pokud neplatí ta podmínka, že n>27, bude program pokračovat v zamýšlené činnosti) For i=1 To n FaktorialI=FaktorialI*i e1=e1+1/FaktorialI EndFor e1z=(Math.Round(e1*zaokr))/zaokr EndIf 15 TextWindow.WriteLine(n+" : "+e1z) Tento program nám tedy hezky vyřádkuje n a odhad e pro n do 27. Ale co kdybychom chtěli za n dosazovat větší čísla? Lze nějakým způsobem docílit toho, aby nebyl program tak hloupě omezen nízkým číslem 27? Odpověď samozřejmě zní ano. Stačí, když nebudeme faktoriál n počítat zvlášť a pak teprve jím dělit číslo jedna (tak, jak jsme to dělali doposud), ale budeme 1
sčítat rovnou výrazy 1a a a×(a+1)
a tak dále. Tímto způsobem se počítač nikdy nedostane k tak velkému číslu, jako je 27! a to ho tudíž nebude nikterak omezovat. ​
'Druhý způsob vypočítání čísla e, který ovšem nevyhlásí chybu tak brzy jako způsob první ​
For n=3 To 75 ​
(opět abychom viděli, jak funkce roste) e2=1 ​
(opět nahrazujeme výraz nula faktoriál hodnotou jedna) JednaLomenoFaktorialI=1 ​
(budeme násobit, takže za tuto proměnnou dosadíme 1) zaokr=1000000000 ​
(zaokrouhlování na zvolený počet desetinných míst) For i=1 To n ​
(řada má celkem n členů, proto se cyklus musí opakovat nkrát) ​
JednaLomenoFaktorialI=JednaLomenoFaktorialI*(1/i) ​
(výpočet pro jednotlivá i) ​
e2=e2+JednaLomenoFaktorialI ​
(ten přičteme k původnímu mezivýsledku) EndFor e2z=(Math.Round(e2*zaokr))/zaokr ​
(zaokrouhlíme) TextWindow.WriteLine(n+" : "+e2z) ​
(necháme vypsat jednotlivá n a odhady e) EndFor Tento program již počítá bez omezení. Ale u obou těchto programů narazíme na skutečnost, že programovací jazyk Small Basic počítá jen s omezeným počtem desetinných míst, a proto se od jisté doby výsledek již nemění, ať zadáme přesnost jakoukoli. Definice (2) Tento program bude velice jednoduchý, protože Small Basic obsahuje všechny funkce, které potřebujeme, takže si nemusíme žádnou sami naprogramovat (jako například faktoriál v předchozím programu). 'Třetí zpsob vypočítání čísla e... For n=3 To 75​
​
(opět chceme vidět, jak číslo roste k e) 16 zaokr=1000000000 ​
(počtem nul navolíme přesnost, s jakou chceme počítat) e3=Math.Power((1+1/n),n) ​
(samotný výpočet celý na jednom řádku) e3z=(Math.Round(e3*zaokr))/zaokr ​
(zaokrouhlení na daný počet desetinných míst) TextWindow.WriteLine(n+" : "+e3z) ​
(a vypsání jednotlivých n a odhadů e pro tato n) EndFor Tento program neohlásí chybu (leda při extrémně vysokých n, jako 1012 atd. Definice (1) + (2) Abychom mohli srovnávat výsledky jednotlivých programů, spojíme je v jeden: (všechny funkce jsou zde analogické jako v předchozích programech) For n=3 To 75 e2=1 e1=1 FaktorialI=1 JednaLomenoFaktorialI=1 zaokr=1000000000 For i=1 To n 'První způsob vypočítání čísla e... ​
If i<28 Then FaktorialI=FaktorialI*i e1=e1+1/FaktorialI EndIf ​
'Druhý způsob vypočítání čísla e, který ovšem nevyhlásí error tak brzy jako způsob první ​
JednaLomenoFaktorialI=JednaLomenoFaktorialI*(1/i) e2=e2+JednaLomenoFaktorialI EndFor 'Třetí zpsob vypočítání čísla e... e3=Math.Power((1+1/n),n) 'Zaokrouhlení a vypsání výsledků... e1z=(Math.Round(e1*zaokr))/zaokr e2z=(Math.Round(e2*zaokr))/zaokr e3z=(Math.Round(e3*zaokr))/zaokr If n>27 Then 17 e1z="**********" EndIf TextWindow.WriteLine(n+" : "+e1z+"; "+e2z+"; "+e3z) EndFor n n výsledek 1. programu 1
0!
+ 1!1 + 2!1 + 3!1 + ... + n!1 výsledek 2. programu 1
0!
+ 1!1 + 2!1 + 3!1 + ... + n!1 výsledek 3. programu n
(1 + 1n)
1 2.000000000 2.000000000 2.000000000 2 2.500000000 2.500000000 2.250000000 3 2.666666667 2.666666667 2.370370370 4 2.708333333 2.708333333 2.441406250 5 2.716666667 2.716666667 2.488320000 6 2.718055556 2.718055556 2.521626372 7 2.718253968 2.718253968 2.546499697 8 2.718278770 2.718278770 2.565784514 9 2.718281526 2.718281526 2.581174792 10 2.718281801 2.718281801 2.593742460 15 2.718281828 2.718281828 2.632878718 20 2.718281828 2.718281828 2.653297705 25 2.718281828 2.718281828 2.665836331 30 ********** 2.718281828 2.674318776 35 ********** 2.718281828 2.680439286 40 ********** 2.718281828 2.685063838 45 ********** 2.718281828 2.688681171 50 ********** 2.718281828 2.691588029 55 ********** 2.718281828 2.693975012 60 ********** 2.718281828 2.695970139 65 ********** 2.718281828 2.697662584 70 ********** 2.718281828 2.699116371 75 ********** 2.718281828 2.700378656 18 Tabulka 3: Eulerovo číslo ­ Definice (1)+(2). Výstup z uvedeného programu ­ porovnání konvergence jednotlivých způsobů počítání k e. Je zřejmé, že definice (2) konverguje mnohem pomaleji. Hvězdičky znamenají, že si už počítač (programovací jazyk) neví s výpočty rady a ohlásí chybu. Porovnání Porovnání výsledků mého programu (definice 1 a 2) a skutečné hodnoty e podle Wikipedie. Můj program: e ~ 2.71828182845905 Wikipedie: e ~ 2,71828182845904523536028747135266249775724709369995… Vysvětlení Není pochyby o matematické správnosti mého programu (uvedeného výsledku dosáhl můj program už pro n=17, což je úctyhodné), ale problém je s jazykem Small Basic, který není uzpůsobený k počítání s velkými čísly. Tato čísla proto zaokrouhluje a tím způsobuje nepřesnost výsledku pro větší čísla. Řešením by bylo poohlédnout se po jiném programovacím jazyce. Faktoriál n
Pro odhad faktoriálu velkých čísel lze využít tzv. Stirlingův vzorec: n! ~ √2πn( ne ) . Tento vzorec se pro velká čísla n přibližuje funkci n faktoriál. Ale je důležité si uvědomit, že se k sobě sice tyto dvě funkce blíží, ale jelikož jde o neuvěřitelně obrovská čísla, liší se stále hodně. Neboli relativní odchylka Stirlingova vzorce od funkce faktoriálu je pro velká n velmi malá, ale absolutní odchylka je neuvěřitelně obrovská. Stirlingův vzorec využívá nejdůležitější matematické konstanty, pí a e. Jejich hodnoty do programu dosadíme. Programovací jazyk Small Basic, ve kterém programuji, bohužel není dokonalý a nedokáže počítat s nekonečným počtem cifer. A jelikož je faktoriál velice rychle rostoucí funkce, neporadí si s ním pro velká čísla ani jiný jazyk. Small Basic se například zasekne na faktoriálu čísla 27 a dále už nepočítá. Pro zajímavost, faktoriál čísla 27 je „pouze” 19 10,888,869,450,418,352,160,768,000,000, což je v dlouhé soustavě desítkové soustavy2)​
zhruba 11 kvadriliard nebo pro lepší představu 11 milionů triliard. Proto nelze napsat program, který by vypočítal pro velká čísla n faktoriál čísla n a odhad faktoriálu čísla n pomocí Strilingova vzorce a pak spočetl jejich rozdíl či poměr. Toto je program, který vypíše skutečné faktoriály a odhady faktoriálu pomocí Stirlingova vzorce čísel od 1 do zadaného n: TextWindow.Write("Zadejte číslo n:") ​
(program vypíše faktoriály čísel 1 až n, zde zjistí n) n=Textwindow.ReadNumber() e=2.7182818284 ​
(hodnoty Eulerova a Ludolfova čísla musím programu určit) pi=3.1415926535 For i=1 To n ​
(cyklus FOR pro faktoriál a odhad u jednotlivých čísel, končí až na úplném konci programu) ​
faktorial=1 For j=1 To i faktorial=faktorial*j ​
(cyklus FOR pro výpočet faktoriálu) EndFor ILomenoE=i/e n
ILomenoENaItou=Math.Power(ILomenoE,i) ​
(výpočet části Stirlingova vzorce (ne ) ) zaklad=2*pi*i OdmocninaZakladu=Math.SquareRoot(zaklad) ​
(výpočet druhé části ­ √2πn ) ​
odhad=OdmocninaZakladu*ILomenoENaItou ​
(vynásobení jednotlivých částí) TextWindow.WriteLine("x="+i+"; x!="+faktorial+"; odhad="+odhad+"; odhad
poměr="+odhad/faktoriál) ​
(vypíšeme skutečný faktoriál, odhad faktoriálu a poměr f aktoriál
) EndFor Takový program nahlásí chybu už u čísla n=28, což ale nelze považovat za „velké” číslo, ke kterému by se mohla vztahovat platnost Stirlingova vzorce. Vzhledem k tomu, že jsem si toto téma seminární práce vybral kvůli tomu, že mě zajímá z matematického hlediska, a ne proto, že bych se chtěl velkou měrou zaobírat programovacími záležitostmi, nesnažil jsem se upravit program tak, aby zvládl víceciferná čísla (což by nebylo snadné, ale bylo by možné to 2)​
O dlouhé soustavě desítkové soustavy si můžete přečíst na: https://cs.wikipedia.org/wiki/Des%C3%ADtkov%C3%A1_soustava 20 naprogramovat ­ stačí počítači přikázat, aby dělal početní úkony tak, jak je děláme my lidé na papíře, sčítání, odčítání, násobení a dělení). Z tohoto důvodu jsem se tedy nezabýval touto přesností, ale použil jsem zdravý selský rozum. Jelikož z matematického hlediska nepotřebujeme znát přesnou hodnotu faktoriálu n a odhadu, ale chceme zjistit, jak se k sobě tyto funkce blíží, stačí nám spočítat jejich poměr, který můžeme počítat průběžně a ne až na n
konci programu. ​
Stirlingův vzorec totiž říká​
: POMĚR faktoriálu a √2πn( ne ) se pro velká čísla n blíží 1. Proto stačí upravit část uvedeného programu tak, aby nepočítal zvlášť faktoriál a Stirlingův vzorec, ale aby postupně násobil jejich poměr. Vzhledem k tomu, že √2πn je poměrně malé číslo, nezáleží na tom, zda poměr tímto číslem vynásobíme na začátku nebo až na konci. A jak n
e
rozepsat jako 1
n
( ne )
, tak i n! mají stejný počet prvků (n prvků), lze tedy jejich poměr n
e
n
e
n
e
× 2 × 3 × 4 × ... ×
( ne )n
To se opravdu rovná n! ​
. ​
Je to součin n . ​
n
e
n
1
několika (n) čísel, z nichž žádné není příliš velké, ale hodnota těchto čísel klesá od e k e .​
Čili některá čísla jsou přece jenom větší než jiná (o dost). Proto tento program nahlásí chybu u n=188, je tedy efektivnější než předchozí program, ale stále není příliš efektivní. Takto vypadá ten program, začátek i konec je shodný s předchozím programem, proto ho nevysvětluji: TextWindow.Write("Zadejte číslo n:") n=textwindow.ReadNumber() e=2.7182818284 pi=3.1415926535 For i=2 To n Step 2 ​
(pro přehlednost dáme vypsat pouze poměry pro sudá čísla n ) ILomenoE=i/e ​
(spočteme hodnotu ei postupně pro každé i od 1 do n) pomer=1 ​
(za poměr musíme na začátku dosadit 1, abychom ho mohli dál násobit) For j=1 to i ​
(cyklus FOR o i opakování) pomer=pomer*(ILomenoE/j) EndFor zaklad=2*pi*i OdmocninaZakladu=Math.SquareRoot(zaklad) pomer=pomer*OdmocninaZakladu TextWindow.WriteLine(i+";"+pomer) EndFor 21 poměr n n!
√2πn( ne )n
n poměr n!
√2πn( ne )n
n poměr n!
√2πn( ne )n
10 0.991704039757 70 0.998810241738 130 0.999359183843 20 0.995842347796 80 0.998958882821 140 0.99940494306 30 0.997226179875 90 0.999074508357 150 0.999444602802 40 0.997918879457 100 0.999167018724 160 0.999479306414 50 0.998334744704 110 0.999242715589 60 0.998612089299 120 0.999305800823 Pro větší n už program ohlásí chybu. Tabulka 4: Faktoriál ­ Druhý program v SB. Poměr skutečného a odhadovaného faktoriálu blížící se číslu 1. Všimněme si ale, že jak bylo řečeno, hodnota čísel v té řadě klesá od ne k 1e
. ​
​
Jelikož program ohlásí chybu kvůli „příliš velkým či příliš malým hodnotám”, stačilo by řadu vzít ze stran a nejprve vynásobit první člen s posledním, výsledek vynásobit s druhým a předposledním členem a tak dále. Pak by ten prozatímní poměr nebyl nikdy moc velký ani moc malý. A takto vypadá výsledný program (velká část programu je shodná s předchozím, proto ji nepopisuji): TextWindow.Write("Zadejte číslo n:") n=Textwindow.ReadNumber() e=2.7182818284 pi=3.1415926535 For i=2 To n Step 2 ILomenoE=i/e pomer=1 For j=1 to i/2 ​
(násobíme dvěma členy z celkových i zároveň, proto cyklus opakujeme pouze 2i krát) pomer=pomer*(ILomenoE/j)*(iILomenoE/(i+1­j)) ​
[1.číslo=prozatímní poměr, 2.číslo= první (resp. druhý, třetí,…) člen řady, 3.číslo=poslední (resp. předposlední, předpředposlední, …) člen řady] EndFor 22 zaklad=2*pi*i OdmocninaZakladu=Math.SquareRoot(zaklad) pomer=pomer*OdmocninaZakladu TextWindow.WriteLine(i+";"+pomer) EndFor Takto upravený program už vydrží počítat až do n=468. To sice stále není příliš vysoké číslo, ale pokud bychom nechtěli programovat všechny základní početní úkony mechanicky, lepšího výsledku ve Small Basicu nedosáhneme. Zde uvádím výsledek třetího programu, kde je patrné, jak se poměr skutečného faktoriálu a odhadu pomocí Strilingova vzorce s rostoucím n postupně přibližuje číslu 1: poměr n n!
√2πn( ne )n
n poměr n!
√2πn( ne )n
n poměr n!
√2πn( ne )n
2 0.9595021758 12
0 0.9993058008 30
0 0.9997222674 4 0.9794239639 14
0 0.9994049431 32
0 0.9997396423 6 0.986219701 16
0 0.9994793064 34
0 0.9997549394 8 0.9896427445 18
0 0.9995371486 36
0 0.9997685532 20 0.9958423478 20
0 0.9995834248 38
0 0.9997807341 40 0.9979188795 22
0 0.9996212889 40
0 0.9997916971 60 0.9986120893 24
0 0.9996528435 42
0 0.9998016161 80 0.9989588828 26
0 0.9996795443 44
0 0.9998106336 10
0 0.9991670187 28
0 0.9997024314 46
0 0.9998188670 Tabulka 5: Faktoriál ­ Třetí program v SB. Poměr skutečného a odhadovaného faktoriálu se skutečně čím dál víc přibližuje číslu 1. 23 Jelikož mám doma přístup i k jiným programovacím jazykům (ve kterých ovšem sám neumím programovat), mohu zde pro srovnání uvést výsledek třetího z programů ve Visual FoxPro. Tento programovací jazyk evidentně počítá s větší přesností: poměr n n!
√2πn( ne )n
poměr n n!
√2πn( ne )n
poměr n n!
√2πn( ne )n
poměr n n!
√2πn( ne )n
50 0.9983347436 1300 0.9999358995 2550 0.9999673208 3800 0.9999780704 100 0.9991670166 1350 0.9999382735 2600 0.9999679492 3850 0.9999783552 150 0.9994445996 1400 0.9999404780 2650 0.9999685540 3900 0.9999786327 200 0.9995834205 1450 0.9999425304 2700 0.9999691363 3950 0.9999789032 250 0.9996667224 1500 0.9999444460 2750 0.9999696974 4000 0.9999791669 300 0.9997222609 1550 0.9999462380 2800 0.9999702385 4050 0.9999794241 350 0.9997619332 1600 0.9999479180 2850 0.9999707607 4100 0.9999796750 400 0.9997916884 1650 0.9999494962 2900 0.9999712648 4150 0.9999799199 450 0.9998148320 1700 0.9999509816 2950 0.9999717518 4200 0.9999801589 500 0.9998333472 1750 0.9999523821 3000 0.9999722226 4250 0.9999803923 550 0.9998484963 1800 0.9999537048 3050 0.9999726780 4300 0.9999806203 600 0.9998611208 1850 0.9999549560 3100 0.9999731186 4350 0.9999808431 650 0.9998718031 1900 0.9999561413 3150 0.9999735453 4400 0.9999810608 700 0.9998809595 1950 0.9999572659 3200 0.9999739587 4450 0.9999812736 750 0.9998888951 2000 0.9999583342 3250 0.9999743593 4500 0.9999814817 800 0.9998958388 2050 0.9999593504 3300 0.9999747478 4550 0.9999816851 850 0.9999019656 2100 0.9999603182 3350 0.9999751247 4600 0.9999818842 900 0.9999074117 2150 0.9999612411 3400 0.9999754905 4650 0.9999820790 950 0.9999122846 2200 0.9999621219 3450 0.9999758457 4700 0.9999822697 1000 0.9999166701 2250 0.9999629636 3500 0.9999761908 4750 0.9999824563 1050 0.9999206381 2300 0.9999637688 3550 0.9999765261 4800 0.9999826390 1100 0.9999242453 2350 0.9999645396 3600 0.9999768521 4850 0.9999828180 1150 0.9999275389 2400 0.9999652784 3650 0.9999771692 4900 *************** 1200 0.9999305580 2450 0.9999659870 3700 0.9999774777 4950 *************** 1250 0.9999333356 2500 0.9999666672 3750 0.9999777780 5000 *************** 24 Tabulka 6: Faktoriál ­ Třetí program ve VFP. Výsledky třetího programu v lepším programovacím jazyce Visual FoxPro, který ohlásí chybu až u n zhruba 4900, což už je opravdu velké číslo, pro které se Stirlingův vzorec vyplatí využít a lze ho na něj opravdu aplikovat. Hvězdičky znamenají, že už si s výpočty počítač (programovací jazyk) neví rady. A pro další srovnání též ve Visual FoxPro druhý program (program, který jsem napsal jako druhý). Všimněme si, že se chyba výpočtů také projeví dříve než ve třetím programu (stejně jako ve Small Basicu). n n!
poměr √2πn
( n )n
e
n n!
poměr √2πn
( n )n
e
n n!
poměr √2πn
( n )n
e
50 0.9983347436 800 0.9998958388 1550 0.9999462380 100 0.9991670166 850 0.9999019656 1600 0.9999479180 150 0.9994445996 900 0.9999074117 1650 0.9999494962 200 0.9995834205 950 0.9999122846 1700 0.9999509816 250 0.9996667224 1000 0.9999166701 1750 0.9999523821 300 0.9997222609 1050 0.9999206381 1800 0.9999537048 350 0.9997619332 1100 0.9999242453 1850 0.9999549560 400 0.9997916884 1150 0.9999275389 1900 0.9999561413 450 0.9998148320 1200 0.9999305580 1950 0.9999572659 500 0.9998333472 1250 0.9999333356 2000 0.9993236887 550 0.9998484963 1300 0.9999358995 2050 30.0850105750 600 0.9998611208 1350 0.9999382735 2100 360906.11237754 650 0.9998718031 1400 0.9999404780 Zde je již zcela patrná chyba 700 0.9998809595 1450 0.9999425304 výpočtů. Je zajímavé, jak 750 0.9998888951 1500 0.9999444460 neuvěřitelně rychle se chyba zvyšuje. Tabulka 7: Faktoriál ­ Druhý program ve VFP. Ve Visual FoxPro se pro n větší než 2000 začne u tohoto programu razantně projevovat chyba ve výpočtech. Je zajímavé, ale jasné, že chyba roste čím dál rychleji (protože výsledek pro další n dostáváme z výsledku pro předchozí n, chyba se tedy násobí). 25 26 Závěr Před započetím psaní této seminární práce jsem si vytyčil určité cíle, které jsem chtěl v rámci seminární práce splnit. Ale postupem času jsem zjišťoval hloubku oněch problémů a s ní hlavně nemožnost zpracovat je v tak krátké seminární práci (která sama o sobě svým rozsahem překračuje zadané limity). Nakonec jsem musel velkou část problematiky odložit na později. Ale pokusil jsem se čtenářům této práce alespoň přiblížit výhody programování a jeho a využití v matematice a alespoň zlehka jsem se dotkl jednotlivých témat. V kapitole Zajímavé odkazy vidíme, že číslo e je tématem na Bakalářskou či Diplomovou práci a ani tyto ho nemůžou zcela obsáhnout. Já ve své práci tedy uvádím číslo e jen jako malou podkapitolu. Doufám, že jsem případnému čtenáři této práce umožnil snazší pohled do zajímavostí matematiky a že jsem ho neodradil od dalšího studia. Já sám jsem při psaní práce objevil spoustu nových zajímavých věcí, kterými bych se chtěl zabývat, početl jsem si v pracích jiných lidí, dozvěděl jsem se mnoho o historii matematiky a rozšířil si obzory v programování. Objevil jsem razantní rozdíly a naopak i podobnosti v různých programovacích jazycích a viděl, že to, co jsem se z programování naučil ve škole, je opravdu jen základ, ale že i tak obyčejný základ v programování může stačit na relativně složité matematické výpočty. Zjistil jsem, že s použitím selského rozumu není těžké vymyslet, jak si naprogramovat matematický výpočet, který by při ručním počítání trval hodiny. Vypracovávání seminární práce mi dalo hodně nového. Přál bych si, aby stejně tak dalo čtení této seminární práce hodně nového jejímu čtenáři. 27 Seznam použitých materiálů Seznam použité literatury [1] ​
Druhá odmocnina. In: ​
Wikipedia: the free encyclopedia​
[online]. San Francisco (CA): Wikimedia Foundation, 2001­ [cit. 2016­05­14]. Dostupné z: https://cs.wikipedia.org/wiki/Druh%C3%A1_odmocnina [2] ​
Eulerovo číslo. In: ​
Wikipedia: the free encyclopedia​
[online]. San Francisco (CA): Wikimedia Foundation, 2001­ [cit. 2016­05­14]. Dostupné z: https://cs.wikipedia.org/wiki/Eulerovo_%C4%8D%C3%ADslo [3] ​
Krása Eulerova čísla 1. In: ​
Věda a technika​
[online]. 2008 [cit. 2016­05­14]. Dostupné z: http://veda­technika.blogspot.cz/2008/10/krasa­eulerovy­konstanty­1.html [4] ​
Bakalářská práce: Historie čísla e. In: ​
Univerzita Palackého v Olomouci: Přírodovědecká fakulta Katedra matematické analýzy a aplikací matematiky​
[online]. Olomouc, 2014 [cit. 2016­05­14]. Dostupné z: http://theses.cz/id/9qlvst/Jezkova.pdf [5] ​
Faktoriál. In: ​
Wikipedia: the free encyclopedia​
[online]. San Francisco (CA): Wikimedia Foundation, 2001­ [cit. 2016­05­14]. Dostupné z: https://cs.wikipedia.org/wiki/Faktori%C3%A1l [6] ​
Microsoft Small Basic. In: ​
Wikipedia: the free encyclopedia​
[online]. San Francisco (CA): Wikimedia Foundation, 2001­ [cit. 2016­05­14]. Dostupné z: https://cs.wikipedia.org/wiki/Microsoft_Small_Basic Seznam použitých obrázků Obrázek 1:https://upload.wikimedia.org/wikipedia/commons/7/72/Square_root.png Obrázek 2:https://upload.wikimedia.org/math/a/7/9/a7909c72e1574fc5efc99062b9a6fdbb.png Obrázek 3:https://upload.wikimedia.org/wikipedia/commons/9/93/Editor­SmallBasic.png Seznam tabulek Tabulka 1​
: Druhá odmocnina ­ odmocnina z 2015​
. Ukázka výstupu napsaného programu ­ zvyšování přesnosti výsledku s každým dalším krokem. 28 Tabulka 2​
: Druhá odmocnina ­ kalkulačky​
. Výběr snadno dostupných kalkulaček a poměření jejich přesnosti při počítání druhé odmocniny z 2015 s přesností mého programu. Kalkulačky jsou v tabulce seřazeny od nejméně přesné až po tu nejlepší. S přehledem vítězí webová kalkulačka Numerics.info. Tabulka 3​
: ​
Eulerovo číslo ­ Definice (1)+(2)​
. Výstup z uvedeného programu ­ porovnání konvergence jednotlivých způsobů počítání k e. Je zřejmé, že definice (2) konverguje mnohem pomaleji. Hvězdičky znamenají, že si už počítač (programovací jazyk) neví s výpočty rady a ohlásí chybu. Tabulka 4​
: Faktoriál ­ Druhý program v SB. Poměr skutečného a odhadovaného faktoriálu blížící se číslu 1. Tabulka 5​
: Faktoriál ­ Třetí program v SB. Poměr skutečného a odhadovaného faktoriálu se skutečně čím dál víc přibližuje číslu 1. Tabulka 6​
: Faktoriál ­ Třetí program ve VFP. Výsledky třetího programu v lepším programovacím jazyce Visual FoxPro, který ohlásí chybu až u n zhruba 4900, což už je opravdu velké číslo, prokteré se Stirlingův vzorec vyplatí využít a lze ho na něj opravdu aplikovat. Hvězdičky znamenají, že už si s výpočty počítač (programovací jazyk) neví rady. Tabulka 7​
: Faktoriál ­ Druhý program ve VFP. Ve Visual FoxPro se pro n větší než 2000 začne u tohoto programu razantně projevovat chyba v počtech. Je zajímavé, ale jasné, že chyba roste čím dál rychleji (protože výsledek pro další n dostáváme z výsledku pro předchozí n, chyba se tedy násobí). 29 Přílohy Zajímavé odkazy 1) Diplomová práce UK o Eulerovu číslu, kde je k nalezení spousta zajímavých informací o jeho využití, které se do mé seminární práce nevešly. http://www.gvp.cz/~vinkle/mafynet/_M/funkce/expon_log_fce_rce/diplomka_eulerov
o_cislo.pdf 2) Bakalářská práce Univerzity Palackého, kde je k nalezení spousta jiných zajímavých informací o Eulerovu číslu. ​
http://theses.cz/id/9qlvst/Jezkova.pdf 3) Další Diplomová práce o Eulerovu číslu, Pí a dalších důležitých reálných číslech je ke stažení zde: https://www.google.cz/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uac
t=8&ved=0ahUKEwiRuJjPpNrMAhXCEiwKHW5fAwYQFggbMAA&url=https%3A
%2F%2Fis.cuni.cz%2Fwebapps%2Fzzp%2Fdownload%2F120017392&usg=AFQjC
NEpiwOdVMCLIjLj_r65EiTE5s5AKg&sig2=i­1nSMMMK9LgHhxRqhkikw&bvm=
bv.122129774,d.bGg 4) Zajímavé počtení pro pro příznivce matematiky: http://kdm.karlin.mff.cuni.cz/diplomky/tereza_bartlova/euler_maclaurin.pdf 5) Díky dnešním počítačovým technikám známe číslo e s neuvěřitelnou přesností. Zde je například odkaz na stránku, kde je Eulerovo číslo na první milion desetinných míst. http://www.beda.cz/~jirkaj/e/e1e6.pdf 6) Kromě těchto odkazů doporučuji k přečtení i veškeré zdroje, které jsem uváděl v seznamu použité literatury. 30 

Podobné dokumenty

endfor

endfor psaného ve vyšších programovacích jazycích do strojového kódu příslušného procesoru. Překladu do strojového kódu se obecně vzato nelze vyhnout, každá aplikace nějakým způsobem musí běžet ve strojov...

Více

Všechny kapitoly s rejstříkem pojmů ()

Všechny kapitoly s rejstříkem pojmů () (Commission Internationale de l’Eclairage) a vytvořili hypotetického standardnı́ho pozorovatele a jemu odpovı́dajı́cı́ barevný prostor, nezávislý na použité technologii. Tento prostor, dnes ...

Více

Eulerovo číslo

Eulerovo číslo vskutku jediná správná cesta ve vyhodnocování (9 + 16) je nejprve sečíst p

Více

Hlavní dokument - Technologie společnosti Microsoft pro vývoj

Hlavní dokument - Technologie společnosti Microsoft pro vývoj přehlednou shrnující formou hlavní součásti vývojové platformy Microsoftu. Programátoři, kteří používají technologie jiných společností, získají možnost porovnat rozdíly mezi „svým“ produktem a mož...

Více

Matematika - zsostrov.cz

Matematika - zsostrov.cz K výukovým materiálům je nutné uvádět také metodické poznámky. Poznámky by měly být uváděny u jednotlivých stránek materiálu, aby učitel, který chce materiál využít, ihned věděl, jak má se stránkou...

Více