BI-ZMA Základy matematické analýzy
Jdi na navigaci předmětu

Konvergence číselné řady

var('k,n,x')
(k, n, x)

Sčítání řad

SageMath umí sečíst celou řadu konvergentních řad.

sum(2^(-k), k, 0, oo)
2
sum(1/(k*(k+1)), k, 1, oo)
1
show(sum(sin(k)/k, k, 1, oo).trig_reduce())
12π12\newcommand{\Bold}[1]{\mathbf{#1}}\frac{1}{2} \, \pi - \frac{1}{2}
sum((-1)^k * 2^(2*k) / (factorial(2*k)), k, 0, oo)
cos(2)

V případě divergentní řady občas dokáže i "zakřičet".

sum(2^k, k, 0, oo)
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
~/src/sage/local/lib/python3.8/site-packages/sage/interfaces/maxima_lib.py in sr_sum(self, *args)
    876         try:
--> 877             return max_to_sr(maxima_eval([[max_ratsimp],[[max_simplify_sum],([max_sum],[sr_to_max(SR(a)) for a in args])]]));
    878         except RuntimeError as error:

~/src/sage/local/lib/python3.8/site-packages/sage/libs/ecl.pyx in sage.libs.ecl.EclObject.__call__ (build/cythonized/sage/libs/ecl.c:8599)()
    851         lispargs = EclObject(list(args))
--> 852         return ecl_wrap(ecl_safe_apply(self.obj,(<EclObject>lispargs).obj))
    853 

~/src/sage/local/lib/python3.8/site-packages/sage/libs/ecl.pyx in sage.libs.ecl.ecl_safe_apply (build/cythonized/sage/libs/ecl.c:5897)()
    364     if error != NULL:
--> 365         raise RuntimeError("ECL says: {}".format(
    366             ecl_string_to_python(error)))

RuntimeError: ECL says: Error executing code in Maxima: sum: sum is divergent.

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-6-353789dc3396> in <module>
----> 1 sum(Integer(2)**k, k, Integer(0), oo)

~/src/sage/local/lib/python3.8/site-packages/sage/misc/functional.py in symbolic_sum(expression, *args, **kwds)
    572     """
    573     if hasattr(expression, 'sum'):
--> 574         return expression.sum(*args, **kwds)
    575     elif len(args) <= 1:
    576         return sum(expression, *args)

~/src/sage/local/lib/python3.8/site-packages/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression.sum (build/cythonized/sage/symbolic/expression.cpp:66042)()
  12407         """
  12408         from sage.calculus.calculus import symbolic_sum
> 12409         return symbolic_sum(self, *args, **kwds)
  12410 
  12411     def prod(self, *args, **kwds):

~/src/sage/local/lib/python3.8/site-packages/sage/calculus/calculus.py in symbolic_sum(expression, v, a, b, algorithm, hold)
    609 
    610     if algorithm == 'maxima':
--> 611         return maxima.sr_sum(expression,v,a,b)
    612 
    613     elif algorithm == 'mathematica':

~/src/sage/local/lib/python3.8/site-packages/sage/interfaces/maxima_lib.py in sr_sum(self, *args)
    882 # could not find an example where 'Pole encountered' occurred, though
    883 #            if "divergent" in s or 'Pole encountered' in s:
--> 884                 raise ValueError("Sum is divergent.")
    885             elif "Is" in s: # Maxima asked for a condition
    886                 self._missing_assumption(s)

ValueError: Sum is divergent.

Někdy ale může být výsledek okořeněný speciálními funkcemi.

sum(1/(k^2 + 1), k, 0, oo)
-1/2*I*psi(I) + 1/2*I*psi(-I)
psi?

Nebo si SageMath nemusí vědět rady, pak zadání nechá v symbolickém tvaru.

sum(1/(k^2 + k + 2^k), k, 0, oo)
sum(1/(k^2 + 2^k + k), k, 0, +Infinity)

Příklad konvergentní číselné řady

Na následujícím příkladě demonstrujeme definici konvergentní číselné řady

k=0sin(k)2k\sum_{k=0}^\infty \frac{\sin(k)}{2^k}

Pokud chceme rozhodnout o její konvergenci pomocí definice, musíme se pokusit najít explicitní výraz pro nntý částečný součet,

sn=k=0nsin(k)2k.s_n = \sum_{k=0}^n \frac{\sin(k)}{2^k}.

K tomu účelu využijeme SageMath.

s(n) = sum(sin(k)/2^k, k, 0, n)
show(s(n))
2n+1sin(1)cos(narctan(sin(1)cos(1))+arctan(sin(1)cos(1)))sin(1)+(cos(1)2)sin(narctan(sin(1)cos(1))+arctan(sin(1)cos(1)))2n(4cos(1)5)\newcommand{\Bold}[1]{\mathbf{#1}}-\frac{2^{n + 1} \sin\left(1\right) - \cos\left(n \arctan\left(\frac{\sin\left(1\right)}{\cos\left(1\right)}\right) + \arctan\left(\frac{\sin\left(1\right)}{\cos\left(1\right)}\right)\right) \sin\left(1\right) + {\left(\cos\left(1\right) - 2\right)} \sin\left(n \arctan\left(\frac{\sin\left(1\right)}{\cos\left(1\right)}\right) + \arctan\left(\frac{\sin\left(1\right)}{\cos\left(1\right)}\right)\right)}{2^{n} {\left(4 \, \cos\left(1\right) - 5\right)}}

V tomto výpočtu samozřejmě silně důvěřujeme Sage (resp. Maxima). Musíme její odpovědi proto prověřovat (následující ani předchozí kód samozřejmě není důkaz této součtové formule):

[
    (s(n) - sum([ sin(k)/2^k for k in range(n+1)])).simplify_full().reduce_trig()
    for n in range(5)
]
[0, 0, 0, 0, 0]

Nyní vypočteme limitu této posloupnosti částečných součtů (sn)n=0(s_n)_{n=0}^\infty, to už je jednoduché cvičení se znalostmi s BI-ZMA,

show(limit(s(n), n=oo))
2sin(1)4cos(1)5\newcommand{\Bold}[1]{\mathbf{#1}}-\frac{2 \, \sin\left(1\right)}{4 \, \cos\left(1\right) - 5}

Jinak řečeno, naše řada je konvergentní a její součet je výše uvedené číslo,

k=0sin(k)2k=2sin(1)54cos(1)\sum_{k=0}^\infty \frac{\sin(k)}{2^k} = \frac{2\sin(1)}{5 - 4\cos(1)}

Pojďme tuto situaci ilustrovat graficky.

list_plot(
    [ s(n) for n in range(21) ],
    gridlines=['automatic', [2*sin(1)/(5-4*cos(1))]],
    axes_labels=['$n$', '$s_n$']
)

Případně, chcete-li, podobně nepřesně numericky na deset cifer,

table([
    ['$n$', '$s_n\\approx$']] +
    [ [m, N(s(m), digits=10)] for m in range(21)
])

A přibližná hodnota skutečného součtu je, opět na deset cifer,

N(2*sin(1) / (5 - 4*cos(1)), digits=10)
0.5928376207

O této řadě lze samozřejmě velmi snadno ukázat, že je konvergentní srovnáním s geometrickou řadou. Nalézt součet je komplikovanější. Srovnání stojí na odhadu pro členy této řady

sin(k)2k12k,kN0.\left| \frac{\sin(k)}{2^k} \right| \leq \frac{1}{2^k}, \quad k\in\mathbb{N}_0.

Příklad divergentní číselné řady

Notoricky známou divergentní řadou je řada

k=11k\sum_{k=1}^\infty \frac{1}{k}

Vezměme její posloupnost částečných součtů

s(n) = sum(1/k, k, 1, n)

Její chování je znázorněno na následujícím grafu.

list_plot(
    [ s(n) for n in range(201) ],
    gridlines=True,
    axes_labels=['$n$', '$s_n$']
)

Zde pozorujeme kvalitativně jiné chování než v předchozím příkladě. Z přednášky máme i dokázáno, že sn+s_n \to +\infty.

Později během semestru ukážeme, že tato posloupnost do nekonečna ubíhá velmi pomalu, přesně jako přirozený logaritmus.

list_plot(
    [ s(n)/log(n) for n in range(2,201) ],
    gridlines=True, ymin=1/2, ymax=3/2,
    axes_labels=['$n$', '$s_n / \\ln(n)$']
)

Výpočty s využitím řad

Exponenciální funkce

Exponenciální funkci máme definovánu jako součet následující číselné řady

ex=k=0xkk!.e^x = \sum_{k=0}^\infty \frac{x^k}{k!}.

O takto definované funkci jsme ukázali, že má všechny požadované vlastnosti. Navíc nám tato definice umožňuje přibližně počítat funkční hodnoty této funkce, například Eulerovo číslo, tedy e1e^1.

s(n, x) = sum(x^k / factorial(k), k, 0, n)

Mimochodem,

s(0, 0).simplify()
0
0^0
1

Grafická ilustrace:

list_plot(
    [ s(n, 1).simplify() for n in range(21) ],
    gridlines=True,
    axes_labels=['$n$', '$s_n(1)$']
)

V tabulkové formě:

table([
    ['$n$', '$s_n(1)$', '$s_n(1)\\approx$']] + 
    [ [m, s(m, 1).simplify(), N(s(m, 1), digits=20)]
    for m in range(21)
])

Podle SageMath

N(e, digits=20)
2.7182818284590452354

Pozor, zamyslete se nad následujícím (také viz Mathematica notebook, zde je zajímavé oba programy porovnat):

N(exp(1.0), digits=20)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-27-0e6492cf627c> in <module>
----> 1 N(exp(RealNumber('1.0')), digits=Integer(20))

~/src/sage/local/lib/python3.8/site-packages/sage/misc/functional.py in numerical_approx(x, prec, digits, algorithm)
   1416         return numerical_approx_generic(x, prec)
   1417     else:
-> 1418         return n(prec, algorithm=algorithm)
   1419 
   1420 n = numerical_approx

~/src/sage/local/lib/python3.8/site-packages/sage/structure/element.pyx in sage.structure.element.Element.numerical_approx (build/cythonized/sage/structure/element.c:8182)()
    872         if prec is None:
    873             prec = digits_to_bits(digits)
--> 874         return numerical_approx_generic(self, prec)
    875 
    876     def n(self, prec=None, digits=None, algorithm=None):

~/src/sage/local/lib/python3.8/site-packages/sage/arith/numerical_approx.pyx in sage.arith.numerical_approx.numerical_approx_generic (build/cythonized/sage/arith/numerical_approx.c:2713)()
     63 
     64     if prec > inprec:
---> 65         raise TypeError("cannot approximate to a precision of %s bits, use at most %s bits" % (prec, inprec))
     66 
     67     # The issue is not precision, try conversion instead

TypeError: cannot approximate to a precision of 70 bits, use at most 53 bits

Výpočet π\pi (Bailey-Borwein-Plouffe formula, 1995)

Platí následující fascinující vztah

π=k=0116k(48k+128k+418k+518k+6).\pi = \sum_{k=0}^\infty \frac{1}{16^k} \left( \frac{4}{8k+1} - \frac{2}{8k+4} - \frac{1}{8k+5} - \frac{1}{8k+6} \right).

s(n) = sum(1/16^k * (4 / (8*k+1) - 2 / (8*k+4) - 1 / (8*k+5) - 1 / (8*k+6)), k, 0, n)
show(s(n))
12k=0n2(120k2+151k+47)(512k4+1024k3+712k2+194k+15)16k\newcommand{\Bold}[1]{\mathbf{#1}}\frac{1}{2} \, {\sum_{k=0}^{n} \frac{2 \, {\left(120 \, k^{2} + 151 \, k + 47\right)}}{{\left(512 \, k^{4} + 1024 \, k^{3} + 712 \, k^{2} + 194 \, k + 15\right)} 16^{k}}}
list_plot(
    [ s(n).simplify() for n in range(21) ],
    gridlines=True,
    axes_labels=['$n$', '$s_n$']
)
table([
    ['$n$', '$s_n$', '$s_n\\approx$']] +
    [ [m, s(m).simplify(), N(s(m), digits=30)]
    for m in range(21)
])
N(pi, digits=30)
3.14159265358979323846264338328