Tomáš Kalvoda, publikován 26. 12. 2016, editován 27. 12. 2016

Počítačové algebraické systémy (CAS) nám mohou pomoci i při sčítání číselných řad. Pojďme se podívat na možnosti Mathematica a SageMath v tomto směru. Vedle samotného sčítání nás bude zajímat samozřejmě i vyšetřování jejich konvergence.

Číselné řady a jejich součet

Pod pojmem číselné řady máme na mysli formální výraz tvaru \[ \sum_{k=0}^\infty a_k, \] kde $(a_k)_{k=0}^\infty$ je zadaná číselná posloupnost. Bez symbolu $\Sigma$ (velké řecké písmenko sigma označující součet) bychom případně mohli psát \[ a_0 + a_1 + a_2 + a_3 + \cdots. \] Stručně řečeno, smyslem číselné řady je sečíst všechny členy (nekonečné) číselné posloupnosti $(a_k)_{k=0}^\infty$. Toho můžeme docílit pomocí limity jisté posloupnosti.

Protože zatím neumíme sečíst nekonečně mnoho čísel, pokusíme se jich nejdříve sečíst jen konečný počet a budeme sledovat, co se děje sčítáme-li jich čím dál tím více a více. Přesněji, pro nezáporné přirozené $n$ vezměme prvních $n+1$ členů posloupnosti $(a_k)_{k=0}^\infty$ a sečtěme je, tj. sestavme tak zvaný $n$-tý částečný součet číselné řady uvedené výše, \[ s_n = \sum_{k=0}^n a_k. \] Získáváme tak novou posloupnost $(s_n)_{n=0}^\infty$. Pokud se nyní podíváme na limitu \[ \lim_{n\to\infty} s_n \] a tato je konvergentní, pak její hodnotu prohlásíme za součet číselné řady $\sum_{k=0}^\infty a_k$ a tuto řadu nazveme konvergentní.

Příklad č. 1

Uvažme jako příklad číselnou řadu \[ \sum_{k=0}^\infty 1 = 1 + 1 + 1 + \cdots. \] Pro členy její posloupnosti částečných součtů platí \[ s_n = \sum_{k=0}^n 1 = n + 1. \] Očividně $\displaystyle\lim_{n\to\infty} s_n = +\infty$. Tato řada je proto divergentní. To by nemělo být překvapivé.

Příklad č. 2

Jako druhý příklad si představme číselnou řadu \[ \sum_{k=0}^\infty 2^{-k} = 1 + \frac{1}{2} + \frac{1}{4} + \frac{1}{8} + \cdots. \] V případě této řady pro posloupnost jejích částečných součtů platí \[ s_n = \sum_{k=0}^n \left( \frac{1}{2} \right)^k = \frac{1 - (1/2)^{n+1}}{1 - 1/2} = 2 \Big( 1 - (1/2)^{n+1} \Big). \] Při úpravě jsme využili známý vzorec pro součet prvních $n+1$ členů geometrické posloupnosti s kvocientem $1/2$. Pro limitu posloupnosti částečných součtů v tomto případě platí \[ \lim_{n\to\infty} s_n = 2 (1 - 0) = 2. \] Uzavíráme, že v tomto případě je naše číselná řada konvergentní a její součet je $2$.

Poznámka

Ve výše uvedených jednoduchých příkladech jsme měli poměrně štěstí. Podařilo se nám explicitně vyjádřit člen posloupnosti $(s_n)_{n=0}^\infty$ a pak vypočítat její limitu. Tj. vystačili jsme si pouze s definicí konvergence a součtu číselné řady. K vyšetřování konvergence existuje celá řada kritérií, s několika málo z nich jsme se seznámili na přednáškách BI-ZMA. Hledání součtů konvergentních řad je pak složitější úloha, někdy i s překvapivými výsledky. Například platí \[ \sum_{k=1}^\infty \frac{1}{k^2} = \frac{\pi^2}{6} \] nebo \[ \sum_{k=1}^\infty \frac{(-1)^{k+1}}{k} = \ln(2). \] I pokud víme, že řada je konvergentní, nemáme zaručeno, že lze její součet explicitně vyjádřit (alespoň pomocí elementárních funkcí).

Číselné řady v Mathematica

V Mathematica lze ke sčítání číselných řad použít příkaz Sum. Dokonce je k dispozici speciální příkaz k vyšetření konvergence SumConvergence. Pojďme se nyní podrobněji podívat na jejich použití na výše uvedených jednoduchých příkladech.

Příklad č. 1

Začněme prvním, divergentním, příkladem. Příkaz Sum požaduje dva argumenty: prvním je sčítaný výraz, druhým list o třech prvcích, který po řadě obsahuje sčítací index, dolní mez a horní mez. Čili Mathematica předhodíme následující příkaz

> Sum[1, {k, 0, Infinity}]

V Mathematica notebooku uvidíme nejprve varovnou hlášku Sum: Sum does not converge a na výstupu pak symbolický formální výraz $\displaystyle\sum_{k=0}^\infty 1$. Jinak řečeno, Mathematica nám naznačuje, že řada diverguje a vrací nám přesně to co jsme jí zadali, tedy onen formální výraz.

Pro tip: Místo Infinity můžete v Mathematica zadat i pěkně vypadající $\infty$ stisknutím klávesy ESC, zadáním inf a opětovným stisknutím klávesy ESC. Alternativně můžete použít paletu speciálních symbolů, ale kdo by to pořád hledal a klikal, že?

Příkaz SumConvergence očekává dva argumenty: sčítaný výraz a sčítací index. Meze nejsou potřeba, konvergence číselné řady se nezmění změnou dolní sčítací meze a je jasné, že sčítáme do $\infty$. Mathematica na dotaz

> SumConvergence[1, k]

vrátí False. Což jsme přesně očekávali.

O divergenci se můžeme přesvědčit i sami výpočtem členů posloupnosti částečných součtů a jejich limity:

> sn = Sum[1, {k, 0, n}]
> Limit[sn, n -> Infinity]

1 + n
Infinity

Příklad č. 2

V druhém, konvergentním příkladě, dostaneme

> Sum[2^(-k), {k, 0, Infinity}]
2

a také očekávané

> SumConvergence[2^(-k), k]
True

Žádné překvapení.

Další příklady

Mathematica umí sečíst i číselné řady, jejichž součet jsme pouze uváděli v předchozí poznámce.

> Sum[1/k^2, {k, 1, Infinity}]
Pi^2/6

a

> Sum[(-1)^(k+1)/k, {k, 1, Infinity}]
Log[2]

Ačkoliv je Mathematica pověstná svými symbolickými schopnostmi, nachytá se hned na velmi jednoduchém příkladě součtu geometrické posloupnosti se symbolickým koeficientem. Konkrétně požadavek

> Sum[x^k, {k, 1, Infinity}]

vesele vyhodnotí jako $\frac{1}{1-x}$. My ovšem víme, že tento výraz je správný součet pouze pro $|x| < 1$. To správně odhalí test konvergence pomocí

> SumConvergence[x^k, k]
Abs[x] < 1

To je přesně to co jsme čekali. Výsledek příkazu Sum může být ale pro uživatele studujícího BI-ZMA (nebo libovolný kurz Matematické analýzy) matoucí. Může z něj získat dojem, že řada konverguje pro libovolná $x$.

Z jiného (komplexního) úhlu pohledu má Mathematica vlastně pravdu. To co vrací příkaz Sum výše je analytické rozšíření $\sum_{k=0}^\infty x^k$ na celou komplexní rovinu $\mathbb{C}$ vyjma bodu $x=1$. Otázkou je, jestli toto uživatel chtěl, nebo vůbec věděl, že se na to ptá.

Poznámka

U mnoha řad nelze součet najít explicitně (jako "vzoreček"). Pokud jsou to zajímavé řady, pak jejich součty lze vyjádřit pomocí tzv. speciálních funkcí (funkce s kterými se nesetkáte ve středoškolské matematice, viz například NIST Digital Library of Mathematical Functions).

Například číselná řada \[ \sum_{k=1}^\infty \frac{1}{k} \frac{x^k}{k!} \] je absolutně konvergentní pro libovolné $x\in\mathbb{R}$. To snadno ověříte pomocí d'Alembertova kritéria. Pomocí Mathematica zjistíme, že její součet je

> Sum[1/k*x^k/k!, {k, 1, Infinity}]
-EulerGamma - Gamma[0, -x] - Log[-x]

Dle dokumentace je EulerGamma Eulerova konstanta, $\gamma \approx 0.577216$, Gamma[a,x] je neúplná $\Gamma$-funkce \[ \mathrm{Gamma}[a, x] = \int_x^\infty t^{-1} e^{a-t}\,\mathrm{d}t \] a Log je logaritmus komplexní proměnné (resp. jeho hlavní větev odpovídající řezu komplexní roviny zápornou částí reálné osy). Mathematica nás zde také lehce balamutí, protože pro kladná $x$ by tento výraz neměl dávat smysl, ale přesto ho vyhodnotí (jiným způsobem, což je uživateli skryto)

%/.{x -> 2.0}
3.68387
Pro tip: Symbol % označuje výsledek předchozího výpočtu. Čili kód výše znamená: vezmi poslední výsledek a dosaď do něj $2.0$ (ve strojové přesnosti).

Zamyslete se, na kolik se (konceptuálně) liší řada uvedené výše, například od řady \[ \sum_{k=0}^\infty \frac{x^k}{k!}, \] jejíž součet se označuje symbolem $e^x$ a nazývá se exponenciální funkce.

Číselné řady v SageMath

Počítačový algebraický systém SageMath umožňuje symbolicky sčítat (některé) číselné řady pomocí příkazu sum. Tento příkaz vyžaduje čtyři argumenty: sčítaný výraz, sčítací index a dvě meze pro sčítací index (odkud kam běží).

Abychom byli přesní, SageMath ve výchozím nastavení pro symbolické hledání (nejen) součtů číselných řad využívá počítačový algebraický systém Maxima.

Příklad č. 1

Podívejme se na výše uvedené příklady. V prvním, divergentním, příkladě dostaneme

sage: var('k')
sage: sum(1, k, 0, oo)
+Infinity

Nejprve jsme definovali symbolickou proměnnou $k$. Poté jsme SageMath požádali o výpočet $\displaystyle\sum_{k=0}^\infty 1$. Symbol oo SageMath interpretuje jako nekonečno, ekvivalentně můžeme použít delší infinity. Výsledkem celé této akce byla limita posloupnosti částečných součtů, čili v tomto případě $+\infty$.

Tento výsledek si můžeme i ověřit vypočtením členů posloupnosti částečných součtů a určením jejich limity.

sage: var('n') # potřebujeme ještě jednu symbolickou proměnnou
sage: sn = sum(1, k, 0, n)
sage: limit(sn, n=oo)
+Infinity

Příklad č. 2

V tomto, konvergentním, případě dostaneme očekávaný výsledek

sage: sum(2^(-k), k, 0, oo)
2

I zde můžeme každý člen posloupnosti částečných součtů sečíst a vypočíst její limitu.

sage: sn = sum(2^{-k}, k, 0, n)
sage: print(sn)
2^(-n)*(2^(n + 1) - 1)

sage: limit(sn, n=oo)
2

Další příklady

SageMath si poradí i s řadami, které jsme uvedli v poznámce na začátku tohoto příspěvku. Konkrétně

sage: sum(1/k^2, k, 1, oo)
pi^2/6

a

sage: sum((-1)^(k+1)/k, k, 1, oo)
log(2)

S případem geometrické posloupnosti si poradí lépe než Mathematica. Dostaneme

sage: var('x')
sage: sum(x^k, k, 0, oo)
(Traceback...)
ValueError: Computation failed since Maxima requested additional constraints; using the 'assume' command before evaluation *may* help (example of legal syntax is 'assume(abs(x)-1>0)', see `assume?` for more details)
Is abs(x)-1 positive, negative or zero?

Čili, sum vyvoval výjimku ValueError a naznačuje, že výsledek pravděpodobně bude záviset na $x$. Dokonce správně uvádí, že je potřeba specifikovat znaménko $|x| - 1$. To můžeme snadno udělat.

sage: assume(abs(x) < 1)
sage: sum(x^k, k, 0, oo)
-1/(x-1)

Při opačném předpokladu pak dostáváme toto

sage: forget() # zapomeňme na předchozí předpoklad
sage: assume(abs(x) > 1)
sage: sum(x^k, k, 0, oo)
(Traceback...)
ValueError: Sum is divergent.

Poznámka

SageMath na tom se speciálními funkcemi není tak dobře jako Mathematica. Zná jich méně a nedokáže s nimi tak dobře symbolicky pracovat jako Mathematica. Mathematica v sobě obsahuje velké množství znalostí (vztahů, vlastností) o spoustě speciálních funkcí.

S příkladem uvedeným výše se ale vyrovná i SageMath. Jen výsledek vyjádří pomocí jiné speciální funkce.

sage: sum(1/k*1/factorial(k)*x^k, k, 1, oo)
x*hypergeometric((1, 1), (2, 2), x)

Dle dokumentace jsme dostali

sage: hypergeometric?
(...)
Docstring:     
   Represents a (formal) generalized infinite hypergeometric series.
   It is defined as

      ,_pF_q(a_1, ..., a_p; b_1, ..., b_q; z) =
      sum_{n=0}^{infty} frac{(a_1)_n ... (a_p)_n}{(b_1)_n
      ...(b_q)_n} , frac{z^n}{n!},

   where (x)_n is the rising factorial.
(...)

Dosadíme-li do uvedené vzorečku, pak dokumentace tvrdí, že se jedná o funkci \begin{align*} x \cdot {}_2 F_2(1, 1; 2, 2; x) &= x \sum_{n=0}^\infty \frac{1_n 1_n}{2_n 2_n} \frac{x^n}{n!} \\ &= x + \sum_{n=1}^\infty \frac{\big(1\cdot 2 \cdot 3 \cdots n\big)^2}{\big(2\cdot 3 \cdot 4 \cdots (n+1)\big)^2} \frac{x^{n+1}}{n!} \\ &= x + \sum_{k=1}^\infty \frac{1}{n+1} \frac{x^{n+1}}{(n+1)!} \\ &= \sum_{n=1}^\infty \frac{1}{n} \frac{x^n}{n!}, \end{align*} což jsme přesně požadovali sečíst.

Dostaneme stejný numerický výsledek jako v Mathematica?

sage: _.subs({x: 2.0})
3.68387151054041

Tedy ano. Zde _ hraje stejnou roli jako % v Mathematica. Dosazení pak provádíme metodou subs na objektu třídy symbolický výraz. Metodě předáváme Pythonovský slovník, který udává co za co se má dosadit.