Uživatelské nástroje

Nástroje pro tento web


prog:konstanty

Matematické konstanty e a π

Poté, co jsme se poměrně úspěšně vyrovnali s výpočtem odmocnin, obrátíme svou pozornost k úkolu, jak vypočítat hodnotu nejběžnějších matematických konstant e (Eulerova čísla) a π jen pomocí základních aritmetických operací. Víme, že se jedná o iracionální čísla1), proto jakýkoliv desetinný zápis bude vždy pouze přiblížením.

Matematici odvodili řadu postupů, jak k hodnotě těchto konstant dospět. Mnoho z nich je založeno na součtu nekonečných řad. Přestože v matematice probíráme posloupnosti a řady až ke konci předposledního ročníku, je pro nás pravděpodobně intuitivně přijatelné, že za jistých podmínek se postupným přičítáním stále menších položek můžeme bez omezení blížit k nějaké konečné hodnotě. Pak má nekonečný součet řady členů an součet nekonečné řady dobře definovaný smysl.

Eulerovo číslo

Pro výpočet Eulerova čísla e máme nekonečnou řadu řada peo Eulerovo číslo složenou ze zlomků, kde ve jmenovatelích figurují faktoriály přirozených čísel (z řady důvodů je vhodné prohlásit 0! = 1). Faktoriál je velmi rychle rostoucí funkce, proto velikost jednotlivých členů s rostoucím n rychle klesá, což je pro výpočet výhodné.

Z hlediska výpočtu jednotlivých členů je vhodné si povšimnout, že nemusíme vždy počítat celý faktoriál. Mezi dvěma následujícími členy totiž pro n ≥ 1 platí další člen řady pro e a to při výpočtu využijeme2). Program pro výpočet e se kromě úvodních inicializací skládá z jednoduchého cyklu, ve kterém počítáme další člen a přičítáme jej do výsledku, a závěrečného tisku výsledků.

euler.py
# výpočet Eulerova čísla e
# součtem nekonečné řady e = 1 + 1/1! + 1/2! + 1/3! + ...
 
print('Výpočet Eulerova čísla')
print('--------------------------')
vysledek = 1.0 # proměnná pro součet členů
clen = 1.0 # hodnota a_0
print('a', 0, '=', clen) # tisk členu
n = 1 # počítadlo členů řady
presnost = 1e-16 # požadovaná přesnost
 
# počítáme další členy do dosažení požadované přesnosti
while clen > presnost:
    clen = clen / n # další člen s využitím předchozího
    vysledek = vysledek + clen # přičteme do výsledku
    print('a', n, '=', clen) # tisk mezivýsledku
    n = n + 1 # jdeme na další člen
 
# tisk výsledků
print('--------------------------')
print('e =', vysledek)
print('členů:', n)

Vzhledem k vlastnostem datového typu float jsme zvolili jako hraniční hodnotu pro velikost členu 1.10-16. Po spuštění zjistíme, že součet 19 členů nám poskytuje výsledek, který se od skutečné hodnoty e = 2,71828 18284 59045 23536… liší až na 16. desetinném místě.

Číslo π

Pro výpočet π (též Ludolfova čísla) existuje mnoho vztahů, my nyní použijeme nekonečnou řadu řada pro π/2často spojovanou s Newtonovým jménem. Z hlediska programátora je výhodnější vycházet z druhého tvaru. Je zřejmé, že členy řady neklesají tak rychle jako u Eulerova čísla, proto pro dosažení stejné přesnosti očekáváme potřebu většího počtu členů. V čitateli členů stojí faktoriály, ve jmenovatelích pak součiny lichých čísel. Díky platnosti další člen řady pro π/2 pro n ≥ 1 se nám výpočet následujícího členu opět zjednoduší. Program je velmi podobný předchozímu, stačí vlastně jen změnit výpočet následujícího členu v cyklu a nezapomenout na konci vynásobit výsledek 2 (součet řady je π / 2).

cislo_pi.py
# výpočet Ludolfova čísla
# součtem řady pi/2 = 1 + 1/1.3 + 1.2/1.3.5 + 1.2.3/1.3.5.7 + ...
 
print('Výpočet Ludolfova čísla')
print('--------------------------')
vysledek = 1.0 # proměnná pro součet členů
clen = 1.0 # hodnota a_0
print('a', 0, '=', clen) # tisk členu
n = 1 # počítadlo členů řady
presnost = 1e-16 # požadovaná přesnost
 
# počítáme další členy do dosažení požadované přesnosti
while clen > presnost:
    clen = clen * n / (2 * n + 1) # další člen s využitím předchozího
    vysledek = vysledek + clen # přičteme do výsledku
    print('a', n, '=', clen) # tisk mezivýsledku
    n = n + 1 # jdeme na další člen
 
# tisk výsledků
print('--------------------------')
print('pi =', 2 * vysledek)
print('členů:', n)

Po spuštění zjišťujeme, že až člen a51 je menší než předepsaná hranice a výsledek se shoduje se správnou hodnotou 3,14159 26535 89793 23846… v 14 desetinných místech, vyšší přesnosti již brání zaokrouhlovací chyby.

Bylo nalezeno mnoho jiných vyjádření pro π pomocí nekonečné řady, která konvergují mnohem rychleji. Jedním ze zajímavých vztahů je Baileyho-Borweinův-Plouffeův vzorec BBP řada pro π odvozený v roce 1995. Není sice rekordmanem v rychlosti konvergence, ale umožňuje provést výpočet libovolné číslice nekonečného rozvoje (zapsaného v hexadecimální soustavě) bez znalosti předchozích!

Číslo π bylo pomocí superpočítačů vypočteno již na více než 1012 platných číslic!

1)
matematický důkaz pro e viz např. zde, pro π zde
2)
S využitím této vlastnosti je časová náročnost algoritmu přímo úměrná potřebnému počtu členů pro výpočet. V případě vyčíslení celého faktoriálu pomocí cyklu v každém členu by čas výpočtu rostl kvadraticky s jejich počtem.
prog/konstanty.txt · Poslední úprava: 20.10.2017 07:54 autor: Ivana Stefanová

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki