Tomáš Kalvoda, puliková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.

Úvod

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

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

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.

Limity v Mathematica

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.

Mathematica: Kontrola správnosti výpočtů

Č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.

Limity v SageMath

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).

SageMath: Kontrola správnosti výpočtů

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

Ne vše Mathematica/SageMath spočítá

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. \]

Diskuze