Tomáš Kalvoda, publikován 10. 10. 2016, editován 08. 12. 2016

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.

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, nebo můžete využít bezplatnou službu SageMath Cloud (zde máte k dispozici daleko víc než SageMath).

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 reálnou (občas 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 Interval[{-1, 1}]. Tedy interval $\langle -1, 1 \rangle$. Jinak řečeno, Mathematica nám vrací množinu všech hromadných bodů funkce $\mathbb{R} \ni n \mapsto \sin(n\cdot\pi)$ když $n$ roste nadevšechny meze. 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ří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 předávat, jinak hrozí, že dostanete odpověď na otázku, na kterou se neptáte.

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 zjednodušen na 0.

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

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á

Alogitmy pro symbolické výpočty zdaleka nejsou všemocné. Mohou selhat i na velmi jednoduchých příkladech. Například Mathematica nevypočte limitu \[ \lim_{n\to\infty} \frac{n}{2 + (-1)^n}. \] Skutečně, zkuste do Mathematica zadat

Limit[n/(2 + (-1)^n), n -> Infinity, Assumptions -> Element[n, Integers]]

Dostanete zpět pouze symbolický výraz. Mathematica si neví s touto triviální limitou rady. Protože očividně platí \[ \frac{n}{2+ (-1)^n} \geq \frac{n}{3}, \quad n\in\mathbb{N}, \] je hodnotou výše zmíněné limity $+\infty$.

Jak si se stejným příkladem poradí SageMath? Selže také.

Diskuze