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())
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
Pokud chceme rozhodnout o její konvergenci pomocí definice, musíme se pokusit najít explicitní výraz pro tý částečný součet,
K tomu účelu využijeme SageMath.
s(n) = sum(sin(k)/2^k, k, 0, n)
show(s(n))
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ů , to už je jednoduché cvičení se znalostmi s BI-ZMA,
show(limit(s(n), n=oo))
Jinak řečeno, naše řada je konvergentní a její součet je výše uvedené číslo,
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
Příklad divergentní číselné řady
Notoricky známou divergentní řadou je řada
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 .
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
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 .
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
(Bailey-Borwein-Plouffe formula, 1995)
VýpočetPlatí následující fascinující vztah
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))
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