Tomáš Kalvoda, publikován 12. 10. 2016, editován 26. 10. 2018
Při ověřování výsledků ručního počítání je občas vhodné sáhnout po pomoci. Jednou z možností je využít počítačových algebraických systémů (CAS). Ukážeme si, jak k tomuto účelu konkrétně používat program Mathematica a open-source alternativu SageMath.
Pomocí počítačových algebraických systémů (CAS, computer algebra system*) lze provádět symbolické výpočty i na Vašem notebooku. V této krátké poznámce si ukážeme, jak CAS využít při počítání limit posloupností. Z mnoha možností se soustředíme na programy **Mathematica* a SageMath.
Mathematica je komerční software vyvýjený firmou Wolfram Research. První verze programu byla do světa vypuštěna již v roce 1988. Duchovním otcem celého konceptu Mathematica je Stephen Wolfram.
S Mathematica se studenti FIT ČVUT intenzivněji setkají v prvním ročníku v předmětu BI-CAO. V BI-ZMA Mathematica používáme jen na přednáškám při různých, zejména grafických, demonstracích.
Ukázky uvedené níže v tomto dokumentu byly vytvořeny pomocí Mathematica verze 11.3.
SageMath je open-source projekt kladoucí si za cíl být použitelnou alternativou (mimo jiné) k Mathematica. Vývoj započal v roce 2005 pod vedením Williama Steina.
Zatímco Mathematica je postavená na vlastním jazyce (Wolfram Language), SageMath využívá ozkoušený a rozšířený programovací jazyk Python.
SageMath můžete instalovat lokálně na svém počítači, většina rozšířenějších linuxových distribucí nabízí instalační balíček, nebo můžete využít bezplatnou službu CoCalc (zde máte k dispozici daleko víc než SageMath, rovnou celý virtuální stroj, ale tím se teď nebudeme zabývat).
Ukázky uvedené níže v tomto dokumentu byly vytvořeny pomocí SageMath verze 8.3.
K výpočtu limit funkcí a posloupností v Mathematica slouží příkaz Limit
. Ve své nejzákladnější verzi (viz dokumentaci) bere dva argumenty: symbolický výraz jehož limitu počítáme a potom symbolický výraz určující ve které symbolické proměnné a v kterém bodě limitu počítáme. Například výstupem příkazu
Limit[2 + 3/n, n -> Infinity]
bude hodnota 2
. Jinak řečeno, vypočetli jsme
\[ \lim_{n\to\infty} \left( 2 + \frac{3}{n} \right) = 2. \]
Ve skutečnosti se ale Mathematica bez dalších informací dívá na n
jako na komplexní proměnnou.
To při počítání limit posloupností indexovaných přirozenými čísly není nejšťastnější. Podívejme se na výsledek příkazu
Limit[Sin[n*Pi], n -> Infinity]
Výsledkem bude Indeterminate
.
Jinak řečeno, dle Mathematica se jedná o "neurčitelnou" hodnotu.
To ale rozhodně není očekávaný výsledek.
My jsme chtěli vypočítat limitu posloupnosti $(\sin(n\pi))_{n=1}^\infty$, která je ve skutečnosti konstantní s hodnotou $0$, tj. jedná se o posloupnost $(0)_{n=1}^\infty$, jejíž limitou je samozřejmě číslo $0$!
Musíme Mathematica zdůraznit, že naše symbolická proměnná n
ve skutečnosti probíhá pouze přirozená čísla.
To můžeme provést pomocí dalšího nepovinného argumentu příkazu Limit
.
Příkaz
Limit[Sin[n*Pi], n -> Infinity, Assumptions -> Element[n, Integers]]
již vrátí očekávanou 0
.
Při počítání limit posloupností je prozřetelné tento předpoklad Mathematica vždy předávat, jinak hrozí, že dostanete odpověď na otázku, na kterou se neptáte.
Poznamenejme, že predikát $n \in \mathrm{Integers}$ můžeme v Mathematica zadat stiskem klávesy ESC, poté napsáním elem
a opětovnám stiskem ESC.
Často nechceme znát přímo výsledek, ale ověřit si správnost provedených úprav.
K tomu lze v Mathematica použít příkaz Simplify
.
Například pokud si nejsme jisti úpravou
\[ \sin(2x) = 2\sin(x)\cos(x), \]
můžeme porovnat levou a pravou stranu této rovnosti a měli bychom dostat nulu:
Simplify[Sin[2*x] - 2*Sin[x]*Cos[x]]
0
Příkazu Simplify
lze předávat doplňující předpoklady přímo v druhém argumentu:
Simplify[Cos[Pi*n] - (-1)^n, Element[n, Integers]]
0
Bez uvedeného předpokladu tento výraz samozřejmě nebude v Mathematica zjednodušen na 0
.
Mathematica dále nabízí příkaz FullSimplify
provádějící náročnější zjednodušovací transformace, na příklady v BI-ZMA ho ovšem s velkou pravděpodobností potřeba nebude.
Proveďme stejné výpočty pomocí SageMath.
K výpočtu limit v SageMath slouží příkaz limit
.
Podstatným rozdílem mezi SageMath a Mathematica je nutnost prvotní deklarace symbolické proměnné.
Při této deklaraci máme i možnost naklást na ní dodatečná omezení (my například budeme požadovat celočíselnost).
Provedeme proto nejprve příkaz
sage: var(n, domain=ZZ)
Po provedení tohoto příkazu máme k dispozici symbolickou proměnnou n
, o které se předpokládá, že nabývá celočíselných hodnot.
ZZ
označuje množinu celých čísel:
sage: ZZ
Integer Ring
*Ring*, česky obvykle okruh, je algebraická struktura, se kterou se potkáte např. v předmětu MI-MPI. Nyní můžeme spočítat první limitu uvedenou v předchozí části textu:
sage: limit(2 + 3/n, n=oo)
2
S druhou limitou SageMath také nemá problém:
sage: limit(sin(pi*n), n=oo)
0
Samozřejmě, pokud bychom neuvedli, že n
nabývá pouze celočíselných hodnot, dostali bychom se do podobného problému jako v Mathematica.
sage: var('x')
sage: limit(sin(pi*x, n=oo)
ind
V odpovědi zkratka ind
znamená *indefinite*, uvedený výraz tedy limitu nemá (to je správná odpověď, jedná-li se o limitu funkce).
Správnost výpočtů pomocí zjednodušování výrazů můžeme v SageMath provádět pomocí metody full_simplify
. Příklady uvedené v Mathematice bychom v SageMath provedli takto:
sage: var('x')
sage: expr = sin(2*x)-2*sin(x)*cos(x)
sage: expr.full_simplify()
0
Zde jsme nejprve vytvořili symbolický výraz, který zkoumáme, a pak jsme na něm zavolali metodu full_simplify
, která provádí řadu zjednodušujících transformací.
Druhý příklad vypočteme obdobně.
sage: var('n', domain=ZZ)
sage: expr = cos(pi*n) - (-1)^n
sage: expr.full_simplify()
0
Algoritmy pro symbolické výpočty zdaleka nejsou všemocné. Mohou selhat i na pro člověka velmi jednoduchých příkladech. Například Mathematica nevypočte limitu \[ \lim_{n\to\infty} \frac{n \cos(\pi n)}{\pi + n (-1)^n}. \] Skutečně, zkuste do Mathematica zadat
Limit[n Cos[Pi n]/(Pi + n(-1)^n), n -> Infinity, Assumptions -> Element[n, Integers]]
Vrátí Indeterminate
.
Nyní to ale neznamená, že limita neexistuje!
Jak si se stejným příkladem poradí SageMath?
Správný výsledek nevrátí, ale alespoň místo ind
vrátí und
, tedy že neví.
To považuji za lepší chování.
Jak to s touto limitou je? Její hodnotu nelezneme poměrně jednoduchým výpočtem, \[ \frac{n \cos(\pi n)}{\pi + n (-1)^n} = \frac{n (-1)^n}{\pi + n (-1)^n} = \frac{1}{\frac{(-1)^n \pi}{n} + 1} \ \to \ \frac{1}{0 + 1} = 1, \quad n \to \infty. \]