Tomáš Kalvoda, publikován 26. 12. 2016, editován 26. 10. 2018
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.
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í.
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é.
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$.
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í).
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.
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.
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
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í.
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$.
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á.
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
%
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.
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.
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
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
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.
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.