aboutsummaryrefslogtreecommitdiff
path: root/src/Lecture6/notebook
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano.tronto@gmail.com>2021-05-25 17:10:49 +0200
committerSebastiano Tronto <sebastiano.tronto@gmail.com>2021-05-25 17:10:49 +0200
commitd6c61d988bfa4255baf9cdae42db59ebee38363f (patch)
tree118ff3c2424e735149c145524965a4a337e50beb /src/Lecture6/notebook
parent46eef66b1e1571c77dc828d7e950b129b4c8bfd0 (diff)
downloadmathsoftware-d6c61d988bfa4255baf9cdae42db59ebee38363f.tar.gz
mathsoftware-d6c61d988bfa4255baf9cdae42db59ebee38363f.zip
Added files
Diffstat (limited to 'src/Lecture6/notebook')
-rw-r--r--src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-checkpoint.ipynb1372
-rw-r--r--src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-modified-checkpoint.ipynb1614
-rw-r--r--src/Lecture6/notebook/.ipynb_checkpoints/9-SageLatex-checkpoint.ipynb339
-rw-r--r--src/Lecture6/notebook/8-SageCalculus.aux58
-rw-r--r--src/Lecture6/notebook/8-SageCalculus.ipynb1372
-rw-r--r--src/Lecture6/notebook/8-SageCalculus.log1106
-rw-r--r--src/Lecture6/notebook/8-SageCalculus.out19
-rw-r--r--src/Lecture6/notebook/8-SageCalculus.pdfbin0 -> 323733 bytes
-rw-r--r--src/Lecture6/notebook/8-SageCalculus.tex1456
-rw-r--r--src/Lecture6/notebook/9-SageLatex.aux32
-rw-r--r--src/Lecture6/notebook/9-SageLatex.ipynb346
-rw-r--r--src/Lecture6/notebook/9-SageLatex.log954
-rw-r--r--src/Lecture6/notebook/9-SageLatex.out6
-rw-r--r--src/Lecture6/notebook/9-SageLatex.pdfbin0 -> 183997 bytes
-rw-r--r--src/Lecture6/notebook/9-SageLatex.tex634
-rw-r--r--src/Lecture6/notebook/output_75_0.pngbin0 -> 16225 bytes
-rw-r--r--src/Lecture6/notebook/output_77_0.pngbin0 -> 19822 bytes
-rw-r--r--src/Lecture6/notebook/output_80_0.pngbin0 -> 20185 bytes
-rw-r--r--src/Lecture6/notebook/output_82_0.pngbin0 -> 11723 bytes
-rw-r--r--src/Lecture6/notebook/output_84_0.pngbin0 -> 22962 bytes
-rw-r--r--src/Lecture6/notebook/output_86_0.pngbin0 -> 21648 bytes
-rw-r--r--src/Lecture6/notebook/output_88_0.pngbin0 -> 17372 bytes
22 files changed, 9308 insertions, 0 deletions
diff --git a/src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-checkpoint.ipynb b/src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-checkpoint.ipynb
new file mode 100644
index 0000000..4b81998
--- /dev/null
+++ b/src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-checkpoint.ipynb
@@ -0,0 +1,1372 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "# Symbolic expressions\n",
8 "\n",
9 "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n",
10 "\n",
11 "Last time we saw the basics of symbolic expressions:\n",
12 "* How to define and manipulate symbolic expressions\n",
13 "* How to introduce new variables (in the Mathematical sense) with `var()`\n",
14 "* How to solve equations and inequalities\n",
15 "* Some of the Mathematical constants that are included in Sage, and how to approximate them using `n()`\n",
16 "\n",
17 "Here are some examples to remind you of these basic things:"
18 ]
19 },
20 {
21 "cell_type": "code",
22 "execution_count": 2,
23 "metadata": {},
24 "outputs": [
25 {
26 "name": "stdout",
27 "output_type": "stream",
28 "text": [
29 "[\n",
30 "x == -sqrt(-pi),\n",
31 "x == sqrt(-pi)\n",
32 "]\n",
33 "[\n",
34 "z == -sqrt(pi + x^2),\n",
35 "z == sqrt(pi + x^2)\n",
36 "]\n",
37 "[[y < -2], [y > 1]]\n",
38 "2*pi + e is approximately 9.00146713563863\n"
39 ]
40 }
41 ],
42 "source": [
43 "var('y', 'z') # Define new variables (x is already defined by Sage)\n",
44 "f = x^2 + pi\n",
45 "g = y^2 + y - 2 > 0\n",
46 "print( solve(f==0, x) )\n",
47 "print( solve(z^2 - f, z) )\n",
48 "print( solve(g, y) )\n",
49 "print( 2*pi + e, \"is approximately\", n(2*pi + e) )"
50 ]
51 },
52 {
53 "cell_type": "markdown",
54 "metadata": {},
55 "source": [
56 "Now we will see some more details about solving equations and manipulating their solutions."
57 ]
58 },
59 {
60 "cell_type": "markdown",
61 "metadata": {},
62 "source": [
63 "## Solving equations and inequalities\n",
64 "\n",
65 "**Reference** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)] for the details of `solve()` and `find_root()`, [[2](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/relation.html#solving)] for examples.\n",
66 "\n",
67 "Other than equations and inequalities, we can also solve systems: it is enough to give Sage a list of expressions and a list of variables with respect to which we want to solve. For example the system\n",
68 "\n",
69 "\\begin{align*}\n",
70 " \\begin{cases}\n",
71 " x + y = 2 \\\\\n",
72 " 2x - y = 6\n",
73 " \\end{cases}\n",
74 "\\end{align*}\n",
75 "\n",
76 "Can be solved as"
77 ]
78 },
79 {
80 "cell_type": "code",
81 "execution_count": 40,
82 "metadata": {},
83 "outputs": [
84 {
85 "data": {
86 "text/plain": [
87 "[[x == (8/3), y == (-2/3)]]"
88 ]
89 },
90 "execution_count": 40,
91 "metadata": {},
92 "output_type": "execute_result"
93 }
94 ],
95 "source": [
96 "solve([x+y == 2, 2*x - y == 6], [x,y])"
97 ]
98 },
99 {
100 "cell_type": "markdown",
101 "metadata": {},
102 "source": [
103 "**Exercise.** Find the intersection of the circle of radius $2$ centered in the origin and the parabula of equation $y=x^2-2x^2+1$."
104 ]
105 },
106 {
107 "cell_type": "markdown",
108 "metadata": {},
109 "source": [
110 "### The set of solutions\n",
111 "\n",
112 "One would expect the result of `solve()` to be a list of solutions, but it is actually a list of expressions (technically it is not a list but a different type of Python collection, but this is not so important)"
113 ]
114 },
115 {
116 "cell_type": "code",
117 "execution_count": 37,
118 "metadata": {},
119 "outputs": [
120 {
121 "data": {
122 "text/plain": [
123 "x == -3"
124 ]
125 },
126 "execution_count": 37,
127 "metadata": {},
128 "output_type": "execute_result"
129 }
130 ],
131 "source": [
132 "solutions = solve(x^2-9 == 0, x)\n",
133 "solutions[0] # This is the expression 'x == -3'"
134 ]
135 },
136 {
137 "cell_type": "markdown",
138 "metadata": {},
139 "source": [
140 "To read the actual solution without the `x ==` part you can use the `rhs()` or `lhs()` functions, which can be applied to any expression containing a relation operator (like `==`, `<`, `>=`...) and return the *right hand side* and *left hand side* of the expression, respectively"
141 ]
142 },
143 {
144 "cell_type": "code",
145 "execution_count": 41,
146 "metadata": {},
147 "outputs": [
148 {
149 "name": "stdout",
150 "output_type": "stream",
151 "text": [
152 "rhs: 2\n",
153 "lhs: x\n"
154 ]
155 }
156 ],
157 "source": [
158 "f = x == 2\n",
159 "print(\"rhs:\", f.rhs())\n",
160 "print(\"lhs:\", f.lhs())"
161 ]
162 },
163 {
164 "cell_type": "markdown",
165 "metadata": {},
166 "source": [
167 "When you solve an inequality or a system, the set of solutions can be more complicated to describe. In this case the result is a list containing lists of expressions that have to be `True` at the same time. It is easier to explain with an example:"
168 ]
169 },
170 {
171 "cell_type": "code",
172 "execution_count": 38,
173 "metadata": {},
174 "outputs": [
175 {
176 "name": "stdout",
177 "output_type": "stream",
178 "text": [
179 "Simple inequality: [[x < -3], [x > 3]]\n",
180 "System of inequalities:\n",
181 " [\n",
182 "[3 < x, x < 6],\n",
183 "[x < -3]\n",
184 "]\n"
185 ]
186 }
187 ],
188 "source": [
189 "print(\"Simple inequality:\", solve(x^2-9 > 0, x))\n",
190 "print(\"System of inequalities:\\n\", solve([x^2-9 > 0, x < 6], x))"
191 ]
192 },
193 {
194 "cell_type": "markdown",
195 "metadata": {},
196 "source": [
197 "In the last example (system of inequalities), Sage is telling us that the system\n",
198 "\\begin{align*}\n",
199 " \\begin{cases}\n",
200 " x^2-9 > 9 \\\\\n",
201 " x < 6\n",
202 " \\end{cases}\n",
203 "\\end{align*}\n",
204 "has two solutions:\n",
205 "* $x$ is between $3$ and $6$;\n",
206 "* $x$ is less than $-3$.\n",
207 "\n",
208 "Since in Sage (and in Python) expressions can have at most on relational operator like `<`, the first solution requires two expressions to be described. Hence the \"list of lists\".\n"
209 ]
210 },
211 {
212 "cell_type": "markdown",
213 "metadata": {},
214 "source": [
215 "**Exercise.** In the first exercise you were asked to solve a system of equations, but some of its solutions were complex numbers. Select only the real solutions and print them as pairs $(x,y)$."
216 ]
217 },
218 {
219 "cell_type": "markdown",
220 "metadata": {},
221 "source": [
222 "When solving a system of equations (not inequalities), you can use the option `solution_dict=True` to have the solutions arranged as a *dictionary*, which is a type of Python collection that we did not treat in this course"
223 ]
224 },
225 {
226 "cell_type": "code",
227 "execution_count": 44,
228 "metadata": {},
229 "outputs": [
230 {
231 "data": {
232 "text/plain": [
233 "[{x: 8/3, y: -2/3}]"
234 ]
235 },
236 "execution_count": 44,
237 "metadata": {},
238 "output_type": "execute_result"
239 }
240 ],
241 "source": [
242 "solve([x+y == 2, 2*x - y == 6], [x,y], solution_dict=True)"
243 ]
244 },
245 {
246 "cell_type": "markdown",
247 "metadata": {},
248 "source": [
249 "### Alternative method for real roots: `find_root()`\n",
250 "\n",
251 "The `solve()` method is very useful when solving *symbolic* equations, for example when you have two variables and you want to solve for one of them in terms of the other. However, it does not always find explicit solutions.\n",
252 "\n",
253 "When you want to find an explicit, even if approximate, solution, it can be better to use `find_root()`. This function works *numerically*, which means that it finds an approximation of the root. It only works for real solutions and you need to specify an interval where you want the root to be searched:"
254 ]
255 },
256 {
257 "cell_type": "code",
258 "execution_count": 52,
259 "metadata": {},
260 "outputs": [
261 {
262 "name": "stdout",
263 "output_type": "stream",
264 "text": [
265 "Using solve():\n",
266 " [\n",
267 "x == -e^x + 10\n",
268 "]\n",
269 "Using find_root(): 2.070579904980303\n"
270 ]
271 }
272 ],
273 "source": [
274 "f = e^x + x - 10\n",
275 "print(\"Using solve():\\n\", solve(f, x))\n",
276 "print(\"Using find_root():\", f.find_root(0,100))"
277 ]
278 },
279 {
280 "cell_type": "markdown",
281 "metadata": {},
282 "source": [
283 "## Evaluating functions\n",
284 "\n",
285 "If an expression contains only one variable you can evaluate it easily, even if it is not a function."
286 ]
287 },
288 {
289 "cell_type": "code",
290 "execution_count": 21,
291 "metadata": {},
292 "outputs": [
293 {
294 "name": "stdout",
295 "output_type": "stream",
296 "text": [
297 "1\n",
298 "y + 3 > (y + 3)^2\n"
299 ]
300 }
301 ],
302 "source": [
303 "var('y')\n",
304 "f = x^2-3\n",
305 "g = x > x^2\n",
306 "\n",
307 "print(f(2))\n",
308 "print(g(3+y))"
309 ]
310 },
311 {
312 "cell_type": "markdown",
313 "metadata": {},
314 "source": [
315 "If an expression contains more than one variable, you can specify a value for each of them and they will be substituted in alphabetic order. You can also specify a value only for some of the variables."
316 ]
317 },
318 {
319 "cell_type": "code",
320 "execution_count": 38,
321 "metadata": {},
322 "outputs": [
323 {
324 "name": "stdout",
325 "output_type": "stream",
326 "text": [
327 "-2 == 0\n",
328 "3*y == 2\n"
329 ]
330 }
331 ],
332 "source": [
333 "var('y','z')\n",
334 "\n",
335 "f = y*z^2 - y == z\n",
336 "print(f(2, 0))\n",
337 "print(f(z=2))"
338 ]
339 },
340 {
341 "cell_type": "markdown",
342 "metadata": {},
343 "source": [
344 "## Symbolic computations\n",
345 "\n",
346 "Sage can understand and simplify symbolic expressions such as sums (finite or infinite) and products. In the following cell, we compute the following sums using the [`sum()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.sum) function:\n",
347 "\n",
348 "\\begin{align*}\n",
349 " \\begin{array}{llcc}\n",
350 " (1) & \\sum_{k=0}^nk &=&\\frac{n^2+n}{2}\\\\\n",
351 " (2) & \\sum_{k=0}^nk^4 &=&\\frac{6n^5+15n^4+10n^3-n}{30}\\\\\n",
352 " (3) & \\sum_{k=0}^n\\binom nk &=& 2^n\\\\\n",
353 " (4) & \\sum_{k=0}^\\infty \\frac1{k^2} &=& \\frac{\\pi^2}{6}\n",
354 " \\end{array}\n",
355 "\\end{align*}"
356 ]
357 },
358 {
359 "cell_type": "code",
360 "execution_count": 22,
361 "metadata": {},
362 "outputs": [
363 {
364 "name": "stdout",
365 "output_type": "stream",
366 "text": [
367 "(1) 1/2*n^2 + 1/2*n\n",
368 "(2) 1/5*n^5 + 1/2*n^4 + 1/3*n^3 - 1/30*n\n",
369 "(3) 2^n\n",
370 "(4) 1/6*pi^2\n"
371 ]
372 }
373 ],
374 "source": [
375 "var('k', 'n') # Remember to declare all variables\n",
376 "\n",
377 "s = []\n",
378 "s.append( sum(k, k, 0, n) )\n",
379 "s.append( sum(k^4, k, 0, n) )\n",
380 "s.append( sum(binomial(n,k), k, 0, n) )\n",
381 "s.append( sum(1/k^2, k, 1, infinity) )\n",
382 "\n",
383 "for i in range(len(s)):\n",
384 " print(\"({}) {}\".format(i+1, s[i]))"
385 ]
386 },
387 {
388 "cell_type": "markdown",
389 "metadata": {},
390 "source": [
391 "An alternative notation is `expression.sum(k, a, b)`. There is an analogous [`prod()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.prod) for products."
392 ]
393 },
394 {
395 "cell_type": "markdown",
396 "metadata": {},
397 "source": [
398 "Sometimes Sage tries to keep an expression in its original form without expanding out sums and products. To change this behavior you can use the [`expand()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.expand) function:"
399 ]
400 },
401 {
402 "cell_type": "code",
403 "execution_count": 30,
404 "metadata": {},
405 "outputs": [
406 {
407 "name": "stdout",
408 "output_type": "stream",
409 "text": [
410 "(x + 1)^2 - (x - 1)^2\n",
411 "4*x\n"
412 ]
413 }
414 ],
415 "source": [
416 "f = (x+1)^2 - (x-1)^2\n",
417 "print(f)\n",
418 "print(f.expand())"
419 ]
420 },
421 {
422 "cell_type": "markdown",
423 "metadata": {},
424 "source": [
425 "### The Symbolic Ring\n",
426 "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html)]\n",
427 "\n",
428 "The symbolic expressions that we have seen so far live in a ring called *symbolic ring* and denoted by `SR` in Sage. This ring works like the ring `ZZ` of integers or `RR` of reals numbers. In particular, you can define matrices and other objects using it as a \"basis\"."
429 ]
430 },
431 {
432 "cell_type": "code",
433 "execution_count": 45,
434 "metadata": {},
435 "outputs": [
436 {
437 "name": "stdout",
438 "output_type": "stream",
439 "text": [
440 "-b*c + a*d\n",
441 "[(-a, 2)]\n"
442 ]
443 }
444 ],
445 "source": [
446 "var('a', 'b', 'c', 'd')\n",
447 "\n",
448 "M = matrix([[a,b], [c,d]])\n",
449 "print(M.determinant())\n",
450 "\n",
451 "polring.<x> = SR[]\n",
452 "f = x^2 + 2*a*x + a^2\n",
453 "print(f.roots())"
454 ]
455 },
456 {
457 "cell_type": "markdown",
458 "metadata": {},
459 "source": [
460 "**Exercise.** Compute the eigenvalues of the matrix\n",
461 "\\begin{align*}\n",
462 "\\begin{pmatrix}\n",
463 "\\cos \\alpha & \\sin \\alpha\\\\\n",
464 "-\\sin\\alpha & \\cos \\alpha\n",
465 "\\end{pmatrix}\n",
466 "\\end{align*}"
467 ]
468 },
469 {
470 "cell_type": "markdown",
471 "metadata": {},
472 "source": [
473 "# Calculus\n",
474 "**Reference:** [[4](https://doc.sagemath.org/html/en/reference/calculus/index.html)] for an overview, but most functions are described in [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]"
475 ]
476 },
477 {
478 "cell_type": "markdown",
479 "metadata": {},
480 "source": [
481 "## Limits and series\n",
482 "\n",
483 "**References:** [[5](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/calculus.html#sage.calculus.calculus.limit)] for limits, [[6](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.series)] for series\n",
484 "\n",
485 "You can compute limits"
486 ]
487 },
488 {
489 "cell_type": "code",
490 "execution_count": 54,
491 "metadata": {},
492 "outputs": [
493 {
494 "name": "stdout",
495 "output_type": "stream",
496 "text": [
497 "1\n",
498 "0\n"
499 ]
500 }
501 ],
502 "source": [
503 "f = sin(x)/x\n",
504 "# print(f(0)) # This one gives an error\n",
505 "print( f.limit(x=0) )\n",
506 "\n",
507 "print( (e^(-x)).limit(x=infinity) )"
508 ]
509 },
510 {
511 "cell_type": "markdown",
512 "metadata": {},
513 "source": [
514 "**Exercise.** Compute the constant $e$ using a limit."
515 ]
516 },
517 {
518 "cell_type": "markdown",
519 "metadata": {},
520 "source": [
521 "You can also specify a direction for the limit. If you don't, Sage assumes that you want to take a two-sided limit."
522 ]
523 },
524 {
525 "cell_type": "code",
526 "execution_count": 55,
527 "metadata": {},
528 "outputs": [
529 {
530 "name": "stdout",
531 "output_type": "stream",
532 "text": [
533 "und\n",
534 "1\n",
535 "-1\n"
536 ]
537 }
538 ],
539 "source": [
540 "f = abs(x)/x # 1 if x>0, -1 if x<0\n",
541 "print( f.limit(x=0) ) # undefined\n",
542 "print( f.limit(x=0, dir=\"+\") )\n",
543 "print( f.limit(x=0, dir=\"-\") )"
544 ]
545 },
546 {
547 "cell_type": "markdown",
548 "metadata": {},
549 "source": [
550 "There is also the alternative notation `limit(f, x, dir)` which does the same as `f.limit(x, dir)`."
551 ]
552 },
553 {
554 "cell_type": "markdown",
555 "metadata": {},
556 "source": [
557 "You can also compute series expansions up to any order. **Watch out:** the notation uses `==` instead of `=` as `limit()` does."
558 ]
559 },
560 {
561 "cell_type": "code",
562 "execution_count": 56,
563 "metadata": {},
564 "outputs": [
565 {
566 "name": "stdout",
567 "output_type": "stream",
568 "text": [
569 "1 + 1*x + 1/2*x^2 + Order(x^3)\n",
570 "(-2) + 1*x + 1*x^2 + (-1/6)*x^3 + (-1/12)*x^4 + 1/120*x^5 + 1/360*x^6 + Order(x^7)\n",
571 "1*(x - 1) + (-1/2)*(x - 1)^2 + Order((x - 1)^3)\n"
572 ]
573 }
574 ],
575 "source": [
576 "f = e^x\n",
577 "g = sin(x) - 2*cos(x)\n",
578 "h = log(x)\n",
579 "\n",
580 "print(f.series(x==0, 3))\n",
581 "print(g.series(x==0, 7))\n",
582 "print(h.series(x==1, 3))"
583 ]
584 },
585 {
586 "cell_type": "markdown",
587 "metadata": {},
588 "source": [
589 "## Derivatives\n",
590 "**References:** [[7](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.derivative)] and [[8](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functional.html#sage.calculus.functional.derivative)] for derivatives, [[9](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functions.html#sage.calculus.functions.jacobian)] for the Jacobian matrix and [[10](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.hessian)] for the Hessian."
591 ]
592 },
593 {
594 "cell_type": "markdown",
595 "metadata": {},
596 "source": [
597 "When computing derivatives, you need to specify with respect to which variables you want to derive, except in case there is only one."
598 ]
599 },
600 {
601 "cell_type": "code",
602 "execution_count": 57,
603 "metadata": {},
604 "outputs": [
605 {
606 "name": "stdout",
607 "output_type": "stream",
608 "text": [
609 "8*y^3\n",
610 "6*x^2 - 1\n"
611 ]
612 }
613 ],
614 "source": [
615 "var('y')\n",
616 "print( (x^2+2*y^4).derivative(y) ) # Alternative: derivative(f, y)\n",
617 "print( (2*x^3-x+2).derivative() )"
618 ]
619 },
620 {
621 "cell_type": "markdown",
622 "metadata": {},
623 "source": [
624 "You can also compute higher order derivatives:"
625 ]
626 },
627 {
628 "cell_type": "code",
629 "execution_count": 58,
630 "metadata": {},
631 "outputs": [
632 {
633 "name": "stdout",
634 "output_type": "stream",
635 "text": [
636 "6*x\n",
637 "84*x^5*y + 10*y^4 + 24*x^2*y\n",
638 "1680*x^3 + 48\n"
639 ]
640 }
641 ],
642 "source": [
643 "print( (x^3).derivative(x, x) ) # Same as (x^3).derivative(x, 2)\n",
644 "\n",
645 "f = x^7*y^2 + x^4*y^2 - 2*x^3 + x^2*y^5 + y + 2\n",
646 "print( f.derivative(x, x, y) ) # Twice in x, once in y\n",
647 "print( f.derivative(x, 4, y, 2) ) # 4 times in x, twice in y"
648 ]
649 },
650 {
651 "cell_type": "markdown",
652 "metadata": {},
653 "source": [
654 "Jacobian and Hessian matrices are also easy to compute:"
655 ]
656 },
657 {
658 "cell_type": "code",
659 "execution_count": 59,
660 "metadata": {},
661 "outputs": [
662 {
663 "name": "stdout",
664 "output_type": "stream",
665 "text": [
666 "[-2*x + 2*y 2*x]\n",
667 "[ 0 3*y^2]\n",
668 "[ y + 1 x + 1] \n",
669 "\n",
670 "[ 2 -4*y + 1]\n",
671 "[ -4*y + 1 -4*x + 6*y]\n"
672 ]
673 }
674 ],
675 "source": [
676 "f = (-x^2 + 2*x*y, y^3, x+y+x*y)\n",
677 "print( jacobian(f, [x,y]), \"\\n\" )\n",
678 "\n",
679 "g = x^2 + x*y + y^3 -2*x*y^2 -3\n",
680 "print( g.hessian() )"
681 ]
682 },
683 {
684 "cell_type": "markdown",
685 "metadata": {},
686 "source": [
687 "*Note:* the notation `f.jacobian([x,y])` is also valid, but only if you specify that `f` is vector by declaring it as `f = vector([...])`."
688 ]
689 },
690 {
691 "cell_type": "markdown",
692 "metadata": {},
693 "source": [
694 "## Integrals\n",
695 "**References:** [[11](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/integration/integral.html)] for symbolic integration and [[12](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html)] for numerical methods.\n",
696 "\n",
697 "You should remember from high school or from your first calculus/analysis course that derivatives are easy, but integrals are hard.\n",
698 "When using a computer software to solve your integrals, you have two choices:\n",
699 "\n",
700 "1. You can try to compute a primitive function exactly, and then (if you are computing a definite integral) substitute the endpoints of your integration interval to get the result. We can call this *symbolic integration*.\n",
701 "2. You can get an *approximated* result with a *numerical method*. This method always gives some kind of result, but it cannot be used to compute indefinite integrals.\n",
702 "\n",
703 "Sage can do both of these things, although people that work in numerical analysis and use often the second method tend to prefer other programs, such as Matlab (or its open-source clone Octave)."
704 ]
705 },
706 {
707 "cell_type": "markdown",
708 "metadata": {},
709 "source": [
710 "### Symbolic integration\n",
711 "\n",
712 "Symbolic integrals work more or less like derivatives. You must specify an integration variable, but the endpoints of the integration interval are optional. If they are not given you get an indefinite integral."
713 ]
714 },
715 {
716 "cell_type": "code",
717 "execution_count": 60,
718 "metadata": {},
719 "outputs": [
720 {
721 "name": "stdout",
722 "output_type": "stream",
723 "text": [
724 "1/2*x^2 - cos(x)\n",
725 "0\n",
726 "-1/2*a^2 + 1/2*b^2 + cos(a) - cos(b)\n"
727 ]
728 }
729 ],
730 "source": [
731 "var('a', 'b')\n",
732 "f = x + sin(x)\n",
733 "print( f.integral(x) ) # Alternative: integral(f, x)\n",
734 "print( f.integral(x, -10, 10) )\n",
735 "print( f.integral(x, a, b) )"
736 ]
737 },
738 {
739 "cell_type": "markdown",
740 "metadata": {},
741 "source": [
742 "Your endpoints can also be $\\pm\\infty$:"
743 ]
744 },
745 {
746 "cell_type": "code",
747 "execution_count": 61,
748 "metadata": {},
749 "outputs": [
750 {
751 "name": "stdout",
752 "output_type": "stream",
753 "text": [
754 "1\n",
755 "sqrt(pi)\n"
756 ]
757 }
758 ],
759 "source": [
760 "print( integral(e^(-x), x, 0, infinity) )\n",
761 "print( integral(e^(-x^2), x, -infinity, infinity) )"
762 ]
763 },
764 {
765 "cell_type": "markdown",
766 "metadata": {},
767 "source": [
768 "The last function is also an example of an integral that perhaps you might want to compute numerically. In fact:"
769 ]
770 },
771 {
772 "cell_type": "code",
773 "execution_count": 65,
774 "metadata": {},
775 "outputs": [
776 {
777 "name": "stdout",
778 "output_type": "stream",
779 "text": [
780 "1/2*sqrt(pi)*erf(x)\n",
781 "1/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1)\n"
782 ]
783 }
784 ],
785 "source": [
786 "print( integral(e^(-x^2), x) )\n",
787 "print( integral(e^(-x^2), x, 1, 2) )"
788 ]
789 },
790 {
791 "cell_type": "markdown",
792 "metadata": {},
793 "source": [
794 "Here `erf(x)` denotes the [error function](https://en.wikipedia.org/wiki/Error_function)."
795 ]
796 },
797 {
798 "cell_type": "markdown",
799 "metadata": {},
800 "source": [
801 "### Numerical integration\n",
802 "\n",
803 "In order to get an explicit value for the computations above, we can use a *numerical* method.\n",
804 "\n",
805 "The word \"numerical\" does not have much to do with numbers, but it refers to the fact that we are trying to compute explicit results rather than symbolic or algebraic ones. [Numerical analysis](https://en.wikipedia.org/wiki/Numerical_analysis) is the branch of mathematics that studies methods to approximate computations over the real or complex numbers. With these methods there is usually a trade-off between speed and precision.\n",
806 "\n",
807 "The Sage function [`numerical_integral()`](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html#sage.calculus.integration.numerical_integral) takes as a parameter a real-valued one-variable function and the integration endpoints, and it returns both an approximate value for the integral and an error estimate."
808 ]
809 },
810 {
811 "cell_type": "code",
812 "execution_count": 40,
813 "metadata": {},
814 "outputs": [
815 {
816 "data": {
817 "text/plain": [
818 "(0.13525725794999466, 1.5016572202374808e-15)"
819 ]
820 },
821 "execution_count": 40,
822 "metadata": {},
823 "output_type": "execute_result"
824 }
825 ],
826 "source": [
827 "numerical_integral(e^(-x^2), 1, 2)"
828 ]
829 },
830 {
831 "cell_type": "markdown",
832 "metadata": {},
833 "source": [
834 "The result above means, in symbols\n",
835 "\\begin{align*}\n",
836 "\\int_1^2 e^{-x^2}\\mathrm dx = 0.13525725794999466 \\pm 1.5016572202374808\\times 10^{-15}\n",
837 "\\end{align*}\n",
838 "\n",
839 "There is also a [`monte_carlo_integral()`](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html#sage.calculus.integration.monte_carlo_integral) method for functions with more than one variable."
840 ]
841 },
842 {
843 "cell_type": "markdown",
844 "metadata": {},
845 "source": [
846 "**Exercise.** Compute the area of the ellipse of equation $y^2+\\left(\\frac x3\\right)^2=1$."
847 ]
848 },
849 {
850 "cell_type": "markdown",
851 "metadata": {},
852 "source": [
853 "## Differential equations\n",
854 "**Reference:** [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]\n",
855 "\n",
856 "A [differential equation](https://en.wikipedia.org/wiki/Differential_equation) is an equation involving an unknwon function and its derivatives. They can be of two kinds: *ordinary* differential equations ([ODE](https://en.wikipedia.org/wiki/Ordinary_differential_equation)) and *partial* differential equations ([PDE](https://en.wikipedia.org/wiki/Partial_differential_equation)). The latter involve multivariate functions and their partial derivatives.\n",
857 "\n",
858 "Differential equations are in general hard to solve *exactly* (or *symbolically*): even a simple equation of the form $f'(x)=g(x)$, where $g(x)$ is someknown function, requires solving the integral $\\int g(x)\\mathrm{d}x$ in order to find $f$, which as we know is not always easy!\n",
859 "\n",
860 "Theoretical results on differential equations usually ensure the existence and/or uniquess of a solution under certain conditions, but in general they do not give a way to solve them. There exits many methods to find approximate solutions, and some of them are implemented in Sage as well (see [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]). However we will focus on the simple ODEs that can be solved exactly.\n",
861 "\n",
862 "Let's start with a simple example. Let's find all functions $f(x)$ such that $f'(x)=f(x)$. In order to do so, we need to use the `function()` construct, which allows us to define an \"unknwon\" function inside Sage, like we define variables with `var()`."
863 ]
864 },
865 {
866 "cell_type": "code",
867 "execution_count": 4,
868 "metadata": {},
869 "outputs": [
870 {
871 "data": {
872 "text/plain": [
873 "_C*e^x"
874 ]
875 },
876 "execution_count": 4,
877 "metadata": {},
878 "output_type": "execute_result"
879 }
880 ],
881 "source": [
882 "var('x')\n",
883 "function('f')\n",
884 "equation = derivative(f(x)) == f(x)\n",
885 "desolve(equation, f(x)) # f is the unknown function"
886 ]
887 },
888 {
889 "cell_type": "markdown",
890 "metadata": {},
891 "source": [
892 "As you can expect, they are all the functions $Ce^x$ for some constant $C$. The constant $C$ plays the same role as the constant in the solution of an integral, but in this case Sage writes it explicitly.\n",
893 "\n",
894 "We can also specify *initial conditions* for our function. For example we can impose that $f(0)=3$ as follows:"
895 ]
896 },
897 {
898 "cell_type": "code",
899 "execution_count": 5,
900 "metadata": {},
901 "outputs": [
902 {
903 "data": {
904 "text/plain": [
905 "3*e^x"
906 ]
907 },
908 "execution_count": 5,
909 "metadata": {},
910 "output_type": "execute_result"
911 }
912 ],
913 "source": [
914 "desolve(equation, f(x), (0,3))"
915 ]
916 },
917 {
918 "cell_type": "markdown",
919 "metadata": {},
920 "source": [
921 "You can also solve *second order* equations, that is equations where the second derivative also appears. In this case if you want to specify an initial condition you should write the triple of values $(x_0, f(x_0), f'(x_0))$."
922 ]
923 },
924 {
925 "cell_type": "code",
926 "execution_count": 6,
927 "metadata": {},
928 "outputs": [
929 {
930 "data": {
931 "text/plain": [
932 "-1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e^(-1/2*x^2), x)"
933 ]
934 },
935 "execution_count": 6,
936 "metadata": {},
937 "output_type": "execute_result"
938 }
939 ],
940 "source": [
941 "equation = derivative(f(x), x, 2) + x*derivative(f(x)) == 1\n",
942 "desolve(equation, f(x), (0, 0, 0))"
943 ]
944 },
945 {
946 "cell_type": "markdown",
947 "metadata": {},
948 "source": [
949 "**Exercise.** Use Sage to find out the functions $f(x)$ that satisfy\n",
950 "\\begin{align*}\n",
951 " \\begin{array}{rlcrl}\n",
952 " (A) &\n",
953 " \\begin{cases}\n",
954 " f(0) &= 1\\\\\n",
955 " f'(0) &= 0\\\\\n",
956 " f''(x) &= -f(x)\n",
957 " \\end{cases}\n",
958 " & \\qquad \\qquad &\n",
959 " (B) &\n",
960 " \\begin{cases}\n",
961 " f(0) &= 0\\\\\n",
962 " f'(0) &= 1\\\\\n",
963 " f''(x) &= -f(x)\n",
964 " \\end{cases}\n",
965 " \\end{array}\n",
966 "\\end{align*}"
967 ]
968 },
969 {
970 "cell_type": "code",
971 "execution_count": null,
972 "metadata": {},
973 "outputs": [],
974 "source": []
975 },
976 {
977 "cell_type": "markdown",
978 "metadata": {},
979 "source": [
980 "### A real-world example\n",
981 "\n",
982 "Differential equations have countless applications in Science, so it would be a shame not to see at least a simple one.\n",
983 "\n",
984 "Consider an object moving with constant acceleration $a$. Its velocity at time $t$ is described by the formula $v(t) = v(0) + at$. For example an object falling from the sky has acceleration $g\\sim 9.8 m/s^2$ towards the ground, so its velocity is $v(t) = -gt$.\n",
985 "\n",
986 "However in the real world you need to take into account the air's resistance, which depends (among other things) on the velocity of the object. In this case the acceleration $a(t)$ is not constant anymore, and it satisfies an equation of the form $a(t)=-g -kv(t)$, where $k$ is some constant that may depend on the shape and mass of the object (in practice it may be more complicated than this).\n",
987 "\n",
988 "Since the acceleration is the derivative of the velocity, we have a differential equation\n",
989 "\\begin{align*}\n",
990 " v'(t) = -g -kv(t)\n",
991 "\\end{align*}\n",
992 "and we can try to solve it with Sage!"
993 ]
994 },
995 {
996 "cell_type": "code",
997 "execution_count": 7,
998 "metadata": {},
999 "outputs": [
1000 {
1001 "data": {
1002 "text/plain": [
1003 "-98/15*(e^(3/2*t) - 1)*e^(-3/2*t)"
1004 ]
1005 },
1006 "execution_count": 7,
1007 "metadata": {},
1008 "output_type": "execute_result"
1009 }
1010 ],
1011 "source": [
1012 "var('t')\n",
1013 "function('v')\n",
1014 "g = 9.8\n",
1015 "k = 1.5\n",
1016 "conditions = (0, 0) # Start with velocity 0\n",
1017 "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions)"
1018 ]
1019 },
1020 {
1021 "cell_type": "markdown",
1022 "metadata": {},
1023 "source": [
1024 "If you want to solve this equation symbolically (that is, keeping $g$ and $k$ in symbols) you need to specify that $t$ is the *independent variable* of the equation:"
1025 ]
1026 },
1027 {
1028 "cell_type": "code",
1029 "execution_count": 10,
1030 "metadata": {},
1031 "outputs": [
1032 {
1033 "data": {
1034 "text/plain": [
1035 "-(g*e^(k*t) - g)*e^(-k*t)/k"
1036 ]
1037 },
1038 "execution_count": 10,
1039 "metadata": {},
1040 "output_type": "execute_result"
1041 }
1042 ],
1043 "source": [
1044 "var('t', 'g', 'k')\n",
1045 "function('v')\n",
1046 "conditions = (0, 0) # Start with velocity 0\n",
1047 "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions, ivar=t)"
1048 ]
1049 },
1050 {
1051 "cell_type": "markdown",
1052 "metadata": {},
1053 "source": [
1054 "# Basic data analysis and visualization\n",
1055 "\n",
1056 "## Statistics\n",
1057 "**References:** [[14](https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html)]\n",
1058 "\n",
1059 "Sage includes the most basic functions for statistical analysis."
1060 ]
1061 },
1062 {
1063 "cell_type": "code",
1064 "execution_count": 20,
1065 "metadata": {},
1066 "outputs": [
1067 {
1068 "name": "stdout",
1069 "output_type": "stream",
1070 "text": [
1071 "Values:\t [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n",
1072 "Mean:\t\t\t 5/13\n",
1073 "Median:\t\t\t 1\n",
1074 "Mode:\t\t\t [3]\n",
1075 "Standard deviation:\t 2*sqrt(29/13)\n",
1076 "Variance:\t\t 116/13\n",
1077 "Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5]\n"
1078 ]
1079 }
1080 ],
1081 "source": [
1082 "L = [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n",
1083 "\n",
1084 "print(\"Values:\\t\", L)\n",
1085 "\n",
1086 "print(\"Mean:\\t\\t\\t\", mean(L))\n",
1087 "print(\"Median:\\t\\t\\t\", median(L))\n",
1088 "print(\"Mode:\\t\\t\\t\", mode(L))\n",
1089 "\n",
1090 "print(\"Standard deviation:\\t\", std(L))\n",
1091 "print(\"Variance:\\t\\t\", variance(L))\n",
1092 "\n",
1093 "print(\"Moving average (5):\", moving_average(L,5))"
1094 ]
1095 },
1096 {
1097 "cell_type": "markdown",
1098 "metadata": {},
1099 "source": [
1100 "You can also compare your data to a probability distribution, see [this page](https://doc.sagemath.org/html/en/reference/probability/sage/probability/probability_distribution.html). If you need to do more advanced statistics you should consider using [R](https://www.r-project.org/); you can also use it inside Sage."
1101 ]
1102 },
1103 {
1104 "cell_type": "markdown",
1105 "metadata": {},
1106 "source": [
1107 "## Plotting\n",
1108 "**Reference:** [[15](https://doc.sagemath.org/html/en/reference/plotting/index.html)], more specifically the subsection [[16](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html)].\n",
1109 "\n",
1110 "Some Sage objects can be plotted:"
1111 ]
1112 },
1113 {
1114 "cell_type": "code",
1115 "execution_count": 21,
1116 "metadata": {},
1117 "outputs": [
1118 {
1119 "data": {
1120 "image/png": "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\n",
1121 "text/plain": [
1122 "Graphics object consisting of 1 graphics primitive"
1123 ]
1124 },
1125 "execution_count": 21,
1126 "metadata": {},
1127 "output_type": "execute_result"
1128 }
1129 ],
1130 "source": [
1131 "f = sin(x)\n",
1132 "plot(f)"
1133 ]
1134 },
1135 {
1136 "cell_type": "markdown",
1137 "metadata": {},
1138 "source": [
1139 "Sage's plotting functions are based on Python's [matplotlib](https://matplotlib.org/).\n",
1140 "\n",
1141 "You can give a number of options to adjust the aspect of your plot, see [here](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html#sage.plot.plot.plot). Let's see some of them:"
1142 ]
1143 },
1144 {
1145 "cell_type": "code",
1146 "execution_count": 67,
1147 "metadata": {},
1148 "outputs": [
1149 {
1150 "data": {
1151 "image/png": "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\n",
1152 "text/plain": [
1153 "Graphics object consisting of 1 graphics primitive"
1154 ]
1155 },
1156 "execution_count": 67,
1157 "metadata": {},
1158 "output_type": "execute_result"
1159 }
1160 ],
1161 "source": [
1162 "f = sin(x)\n",
1163 "plot(f,\n",
1164 " -2*pi, 2*pi, # bounds for x\n",
1165 " ymin = -0.7, ymax = 0.7, # bounds for y\n",
1166 " color = \"red\",\n",
1167 " title = \"The sin function\",\n",
1168 " )"
1169 ]
1170 },
1171 {
1172 "cell_type": "markdown",
1173 "metadata": {},
1174 "source": [
1175 "Some of the options are not described precisely in Sage's documentation, but you can find them on [matplotlib's documentation](https://matplotlib.org/stable/contents.html). You can find many examples online for adjusting your plot as you like!"
1176 ]
1177 },
1178 {
1179 "cell_type": "markdown",
1180 "metadata": {},
1181 "source": [
1182 "If you need to plot more than one object at the time, you can sum two plots and show them together with `show()`:"
1183 ]
1184 },
1185 {
1186 "cell_type": "code",
1187 "execution_count": 36,
1188 "metadata": {},
1189 "outputs": [
1190 {
1191 "data": {
1192 "image/png": "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\n",
1193 "text/plain": [
1194 "Graphics object consisting of 2 graphics primitives"
1195 ]
1196 },
1197 "metadata": {},
1198 "output_type": "display_data"
1199 }
1200 ],
1201 "source": [
1202 "cosine = plot(cos(x), (x,-pi/2,pi/2), color=\"red\")\n",
1203 "exponential = plot(exp(x), (x,-2,0.5))\n",
1204 "\n",
1205 "show(cosine + exponential)"
1206 ]
1207 },
1208 {
1209 "cell_type": "markdown",
1210 "metadata": {},
1211 "source": [
1212 "Finally, there are other types of plots that you can use, like [scatter plots](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/scatter_plot.html#sage.plot.scatter_plot.scatter_plot) and [bar charts](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/bar_chart.html#sage.plot.bar_chart.bar_chart). You can also add [text](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/text.html#sage.plot.text.text) to your plot:"
1213 ]
1214 },
1215 {
1216 "cell_type": "code",
1217 "execution_count": 53,
1218 "metadata": {},
1219 "outputs": [
1220 {
1221 "data": {
1222 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkcAAAGGCAYAAABxHyV7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAtOElEQVR4nO3dfZhcdX338fd3d8MGhAyBalVYS1QUNoEQIEErJkEUFEGw0oIPuYUqtBCrctfbCLWCogYK1QisDwhEqpBETW0Rq1IoBAENEBKQBuQpIdiIIEg2xTiE7O/+Y3Y3J7sz+5DM7uyceb+u61yzM+fMzPfMCexnf+d3vhMpJSRJklTSVOsCJEmSxhLDkSRJUobhSJIkKcNwJEmSlGE4kiRJyjAcSZIkZRiOJEmSMgxHkiRJGQ0djqJkQkRErWuRJEljQ0utCxhBg7b+3rBhA4VCgQ0bNoxGPZIkqbaGNBjS0CNHkiRJfdV1OIqI3SJiQUQ8HhGbIuKOiJhe67okSVL9qvfTalcAU4A5wHrgA8CNEdHuF+pKkqTtUbfhKCJ2Bt4DHJ9SurX74fMi4gTgjJoVJkmS6lrdhiNKtTcDf+zz+Cbg8HJPKBaLFIvF3vudnZ0jVpwkSapPdTvnKKW0Efg58I8R8cqIaI6IDwCHAa8o95z58+dTKBR6l7a2ttEsWZKkHRYxekujinqemxMRrwGuAmYCW4B7gIeAg1NK+/fdvtzIUVtbGxs2bGDChAmjVLUkSdtvNENLHUeESob06dXzaTVSSo8CsyLiJcCElNJvImIJsAboF45aW1tpbW0d7TIlSVIdqdvTalkppee7g9FE4Gjg32tdkyRJqk91HY4i4uiIeHtETIqItwE3A78CFta4NEmSVKfqOhwBBaADeBD4F+A24KiU0uaaViVJkupWvc85+i7w3VrXIUmS8qPeR44kSZKqqiHDUUdHB+3t7Uyf7tewSZKkbdV1n6NBDLpjnZ2dFAoF+xxJkuqGfY52yJA+vYYcOZIkSarEcCRJkpRhOJIkScowHEmSJGUYjiRJkjIMR5IkSRkNGY7scyRJkiqxz5F9jiRJdcQ+RzvEPkeSJEnDZTiSJEnKMBxJkiRlGI4kSZIyDEeSJEkZhiNJkqSMhgxH9jmSJEmV2OfIPkeSpDpin6MdYp8jVV9EEBGcd955tS5lSGbPnk1EMHv27FqXIkmqE4YjaZSdcsopvSFz7dq1tS5HktSH4UjaAWvXru0NOt/61rdqXY4kqQoMR5IkSRmGI0mSpAzDkSRJUsawwlFE/CgiUkT8vML6w7vXp4h4LiKay2wzMSK6ureZW+F1XhoRn4+Ild2v88eIWBsR346Iwwd4Ts97/025bT784Q/3zg/ZY489yvY5WrBgARFBS0sLnZ2dA34e2+u5557jC1/4Am984xuZOHEi48aN46UvfSnt7e28+93v5mtf+xpPPfVUv+cN9UqxoV6htXbtWubNm8chhxzCnnvuyfjx45k0aRJHHHEE//zP/8y6desG3Ze77rqL9773vey99960tray1157MWfOHB544IFBnzuQ8847r3d/ofSZnXvuuUyePJldd92VPfbYg9mzZ3PNNdfs0Pv0uO2225gzZw777LMP48ePZ/fdd2fatGl8+tOf5umnny77nIhg0qRJvfdPPfXU3prr7ao+SY1gY60LqB8ppSEvwP+j1D9oM7BrmfWf7l7fsxxaZpsTMuunlFl/FLChz+v0XS4Dmso897+71y9OZbzmNa/pfY3JkyenDRs2JCBt2LChd5vjjz8+AemQQw4p9xI7bPXq1emVr3zlQPuWgHTppZf2e27PunPPPXfA95g1a1YC0qxZsypuc9FFF6Vx48YNWEO552druPTSS1NLS0vZ5+6yyy5p2bJlw/x0tjr33HN7X+uxxx7b5tj1XU488cS0efPm7fostmzZkubOnTvg51AoFNINN9xQ8bMYaCl3rD74wQ/2rl+zZs12f0aSGlOp+9Bwl3sSjOu+HfrzcmhIeadlyCmqZFn3bQtwOPCTPutnl7l/d4VtfkcpzPSKiIOAHwI7UQpgHcC/A88D04BPAZOAud2PzStTXzswq2/h//M//8Ojjz7ae3/16tX87ne/22ablBI/+9nPSkWOUF+cOXPmsH79esaNG8dpp53GO97xDl7+8pfT1dXF+vXrufPOO1m6dOmIvHeP888/n8985jMA7L777px55pkcccQR7Lnnnjz33HPcc889/OAHP+gdtSnnpz/9KcuXL+fAAw/kYx/7GAcccACbNm3iBz/4AV/5ylf4wx/+wJw5c3j44YfZaaeddqjek046iTVr1vC3f/u3nHjiiRQKBe677z4uvPBCHnroIb7//e/zile8gksuuWTYr/2pT32Kjo4OACZN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i2XLlvGJT3yCY489li1btrDTTjv1m6cG0NLS0huYrrrqKhYtWsQDDzzAI488wiOPPFKVq9skafjWsYWVFGkmcSFd3AgcTBc3kbiAIs1s4R7giVoXOjYNtZV234XSXKPsVzx8osJ2N2W2eY4yXxjbZ/vt/uLZ7PKhD32od/uISE899VS/HuKrV6/e5nX/7u/+bsCe41/96ld7t73kkksG3LachQsXDrRPvcvhhx+ennnmmbKv8aUvfani8yZOnJiWLVs2pC+e/eIXv1jxS2N7lsG+eHYgQ6lhIH2/eHbSpEkV63zPe96zQ188e+aZZw74ORQKhfTTn/60Yq3XX399ioiyz/WLZ6XRN/yv19ixZWzu3xMJjkmwvML6X3Svf2JM7dsoqP7Xh/RxJ5DtXHhLhe1uzvxcab5Rr1T62pDXAl+k9D1snUARWEepc9WbU0ofGex1siNFfecb9dhrr722uT/YfKOf/7x0JnHixImccsopA25bzvve9z5uvvlmzjnnHN785jczadIkdtllF3baaSf23ntv3vWud3HttdeybNmyildFnXXWWfzkJz/h6KOPZuLEibS2tjJp0iTmzp3LqlWrhtyG4Oyzz2b16tV8/OMfZ8qUKUyYMIHx48fz6le/miOPPJIFCxawePHiYe/jSJg0aRIrVqzgnHPOYf/992eXXXahUCgwc+ZMvvOd7/D973+flpbtm1jY1NRER0cHt956K+9///t51ate1dsL66CDDuKcc87h4Ycf5qijjqr4Gu985zu56aabOP7443nlK1/Z2zBSkmpnb+BHbL1+qa/DutdX/pqoRhapiv1bxpiKO9bR0UFHRwdbtmzhoYceYsOGDUPqObPPPvvw+OOP89nPfrb3W+01Ms4777ze0385/jcqaQSM9kWko/2/qNHcvxz+73dIn96OjBzVrblz57J69ephfYnounXrePzxxykUCnzsYx8bweokSVItNWQ42h49HbQ/+tGP9nY4liRJ+WMHqCGaM2fOmLl6S5IkjRxHjiRJkjIMR5IkSRkNebVaj87OTgqFwpCvVpMkjX1erVY9OYwIXq0mSZI0XA0Zjjo6Omhvb+/3PVmSJEmeVvO0miTliqfVqieHEcHTapIkScNlOJIkScowHEmSJGUYjiRJkjIMR5IkSRmGI0mSpIyGDEf2OZIkSZXY58g+R5KUK/Y5qp4c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\n",
1223 "text/plain": [
1224 "Graphics object consisting of 3 graphics primitives"
1225 ]
1226 },
1227 "metadata": {},
1228 "output_type": "display_data"
1229 }
1230 ],
1231 "source": [
1232 "b = bar_chart(range(1,10))\n",
1233 "s = scatter_plot([(1,5), (4,2), (8,8), (4,7)],\n",
1234 " marker = \"*\", # symbol\n",
1235 " markersize = 100,\n",
1236 " edgecolor = \"black\",\n",
1237 " facecolor = \"red\"\n",
1238 " )\n",
1239 "t = text(\"wow, such plot!\", (1, 8), color=\"black\", fontsize=20)\n",
1240 "show(b + s + t)"
1241 ]
1242 },
1243 {
1244 "cell_type": "markdown",
1245 "metadata": {},
1246 "source": [
1247 "## Interpolation\n",
1248 "**References:** [[17](https://doc.sagemath.org/html/en/reference/polynomial_rings/sage/rings/polynomial/polynomial_ring.html#sage.rings.polynomial.polynomial_ring.PolynomialRing_field.lagrange_polynomial)] and [[18](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/interpolation.html)].\n",
1249 "\n",
1250 "When you need to work with a discrete set of data, like measurements of real-world quantities, it can be useful to visualize a \"smoothed out\" version of this data, for example by plotting a function that approximates it.\n",
1251 "\n",
1252 "One way to do so is finding the lowest-degree polynomial that passes through all your points. This is called [Lagrange Polynomial](https://en.wikipedia.org/wiki/Lagrange_polynomial)."
1253 ]
1254 },
1255 {
1256 "cell_type": "code",
1257 "execution_count": 65,
1258 "metadata": {},
1259 "outputs": [
1260 {
1261 "data": {
1262 "image/png": "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uFx7LaSnw+LFbicpGhVKIiIS8tavt7/IH34YIiLcThNcqlWDNm3s2K9A5DeFUnx8PDExMcTGxrodRUREQsz48XYj15493U4SnK67Dj7+GBIT3U5SeBrMLSIiIW3DBjj/fHjlFejTx+00wWnXLqhd26523quX22kyaTC3iIhIfp58EurWVWuSN9WqBRdeGJjLBKhQEhGRkLV9O/zvfzBqlMYmeVvXrvDRR3DsmNtJCkeFkoiIhKz//heqVoXbbnM7SfC76io4dAhWrnQ7SeGoUBIRkZC0axe8+ircey+ULu12muDXrBlUrw7vved2ksJRoSQiIiFp0iQoVw7uvtvtJKHBceDqq+Hdd91OUjgqlEREJOT89RfMnAlDh0L58m6nCR1XXw07dtixYYFChZKIiIScadPsZq1DhridJLR07Gi7OQOpVUmFkoiIhJTERHjuORgwACpVcjtNaClTBi69VIWS5OKvv/6iYcOGhIeHMz9Q13L3Y8888wyO43DxxRdz5MgRt+MEJd3DEgymT4fkZBgxwu0koenqq+3Mt3/+cTtJwQRMobRgwQIuv/xyKleujOM4bNiwIcfj1qxZw6WXXkrZsmU57bTTaN++PcnJyVmOSU5OpkyZMmzbto1Vq1bRunVrKlWqRGRkJA0bNmTKlCk5nrt9+/ZFzn/o0CG6dOlC5cqVGTduHL169WLZsmV5vmbChAk4jsOwYcOKfN2C+t///kezZs0oU6YMderU4amnnsry+eXLl+M4TrbHtm3bsp1r3Lhx3HTTTQDcfffd1KtXj8jISE4//XTi4uJyfM3y5csZN25ckfO//vrr3H///TzzzDMcPHiQ6667juPHj2c55sCBA1xxxRVUr16dUqVKUatWLQYPHkxSUlKRr5th+vTpnHfeeURFRREVFUWrVq1YunRprsfffffdOI7D1KlTsz1fkPfr5HsYICUlhQcffJA6depQqlQp6tWrx0svvZTtdb64hydMmEBsbCzly5enSpUqXHvttfzwww9Fvm5BHD16lNtuu40mTZoQERHBtddem+Nx8fHxnHvuuURGRnLOOefw6quvZvn85s2bue6666hbt26O35+T3XbbbYwePTrz3++99x4tW7YkMjKSypUr071792yvefnll3n55ZeL8iV61J49e+jZsyfnnHMOYWFhPvkZ4y+OHoWpU6FvXzjjDLfT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hx9o06YNAMePH+eXX37J1n2W20y+t956iwULFrB8+XJuvPFGHnvsMcaPH59rhvLly1P+pH03ypcvT8WKFb3yfgWDnTth/ny7yGQuP0bFBZ07w6hR8MUX0KGD22ly541CqQy2u+1kaRRzKYKDBw/y22+/8ccffwBkFkTVqlWjWrVqOI7D/fffz9ixY2natCnNmjXjlVdeYdu2bcybNw+wP+A6depEmTJlMs8bHx9P7dq1M6dSr1q1iqeffpohBVzXPj4+njVr1vDdd99Rq1atzKn2a9euzTKupCDKly+fbRxH2bJlqVSpklfHd+zfv5958+bRvn17jh49yuzZs3n77bf5/PPPM4+ZOnUqdevWpVGjRhw7dow5c+Ywf/78zEUHU1NTWbp0aZZ1dXbu3Mlbb71F586dOf300/n999+ZOHEikZGRXHnllfnmOnToELfccgtDhgyhS5cu1K5dmxYtWnD11VfTo0ePQn+d77//Pnv37iU2NpZy5cqxZcsWRo4cSevWralbt26hz3eyBx54gC5dulCrVi0OHTrE3LlzWb58OR988AEAlSpVotIpSwCXKFGCatWqcc455wAFe79yuod79uzJY489Rt++fRk/fjz79+/n/vvv5/bbbycyMjLf7J68hwEGDRrEG2+8weLFiylfvjx//vknANHR0QXKU1Rbtmzh2LFjHDx4kEOHDmWutdasWTPAFo9fffUVLVu25O+//2by5Mls2rQpS+F97NgxtmzZkvnfv//+Oxs2bKBcuXLUr1+fffv2sW7dOhYtWpT5mqioKPr378/YsWOpVatWlnXICnKf7t69mwEDBjBx4kTatGnDyy+/zFVXXUWXLl246KKLPPPm5CDj/Tl8+DB//fUXGzZsoGTJkkUukP3Z1KlQsSLceqvbSeRk550HVarYcUr+XCh5o+vtZWA3/788QDfgL2BiQdrBcpv1Nnv27BzHMp3aXTNhwgRTs2ZNU6ZMGdOqVasszeFt2rTJNpvtmWeeMY0aNTJlypQxUVFR5vzzzzcJCQkFmpa7detWExkZmaVbJDEx0dStW9eMHDmyIF9uvnwx6+2vv/4yF110kSlbtqwpU6aM6dixo/nyyy+zHDNx4kRTr149U7p0aVOhQgXTpk0b895772V+ftmyZdmm2f/++++mS5cupkqVKqZEiRKmZs2apmfPnmbbtm0FytW3b1/TpEmTLFPSp02bZipWrGh2795d4K8vw6effmpatWploqOjTenSpU2DBg3MqFGj8l3yoCBuv/12U6dOHVOyZElz+umnm44dO2ZbsuBUp3btFOT9yukeNsbei506dTKRkZGmZs2aZsSIEdm6rXPijXs4p/9PgVy7nHJSlFlvderUyfG6GbZs2WKaNWtmIiMjTVRUlImLi8t2L2Z07Z/6yOiynDVrVo7LCRw7dszce++9pkqVKqZ8+fKmU6dO2Wa95SQ9Pd107NjRXH755ZlLcRhjzPDhw029evXMoUOHCvS1F2XWW05fZ17dwIFq/37bvVPESYHiZb16GXPBBa5dvkB1jWNOdD14iuM45YHHThRIVYA/gDeBR40xOfdvnCQpKYno6GgSExML1fWWn/3793PGGWewa9euPBeSk6IZOnQoqampJCQkuB0laOkedt8111xDmzZtGDlypNtRpICeeAIefxx+/dW2Xoh/efVV29K3bx+cfrrPL+8U5CCPd70ZYw4Bw048/MbBgweZPHmyfsF4SePGjWnVqpXbMYKa7mH3tWnThptvvtntGFJAR4/Cs8/aX8QqkvxTxtDNTz+FG290N0tuPN6ilI98L+atFiUREQktL74I/frBtm1w9tlup5HcnHMOXHqp3azYxwrUohQwm+KKiIgUlDEwZQp07aoiyd916AC5TMj1CyqUREQk6Hz6KWzeDPfc43YSyU+HDrbV78RGEH5HhZKIiASdadOgSRM/n3YuALRrZz+etCKNX1GhJCIiQeXHH+Hdd21rklOgUSjipmrV4Nxz4bPP3E6SMxVKIiISVJ591i4w2bOn20mkoNq3999xSiqUREQkaCQlwezZ0L8/eHEhePGwDh1g+3Y4sfmGX1GhJCIiQeOllyA5GQYOdDuJFEbGOCV/bFVSoSQiIkEhLc12u/XoAdWru51GCqNKFWjUyD/HKXljU1wRERGfe+892LkT3nzT7SRSFB06wIl9xP2K37QoxcfHExMTQ2xsrNtRREQkAE2dChddBBde6HYSKYp27eyMxd9/dztJVtrCREREAt5330HTprY16aab3E4jRfHnn3DGGfDWW3DDDT65pLYwERGR0PDMM1CjBlx3ndtJpKiqVYP69WHVKreTZKVCSUREAtpff8GcOTBoEJQo4XYaKY42bVQoiYiIeNTMmXYF7rvucjuJFFeb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H40xX58Yd7sRuCeXwz1y/6pQCiLGmGPAN9jZFie7DPiiEKc6H9scLMW3huzfj87A18aY4y7kCQW6f3PgWM9hu3cuNcb8XICX6f4thCK+xznRPVxwDlAql8955P5V11vwmQy85jjO19ib5C6gNrYvF8dxJgA1jDF9Tvx7GPALsBkoCfTGNmdq+m8OHMcpB9Q/6akzHcdpBhw0xvx26vuLfd8HO44zGXgBO7jwDuBmH8YOGIV9f3X/Fko80BOIAw45jpPxl3aiMSYZsv98QPdvYRX6PdY9XHCO4/wHWArswi5MfRPQHrjixOe9c/8aY/QIsgcwEPs/Xgq2hantSZ97GVh+0r9HAj8CydiZGSuBK93+Gvz1ceJ/SpPD4+Wc3t8Tz7UD1p/4fvwM9Hf76/DXR2HfX92/hXpvc3pfDXDbScfo/vXxe6x7uFDv74sn/W7bBywDLsvtvT3xXLHvX62jJCIiIpILjVESERERyYUKJREREZFcqFASERERyYUKJREREZFcqFASERERyYUKJREREZFcqFASERERyYUKJREREZFcqFASERERyYUKJREREZFcqFASERERycX/AcX86mbC2eHsAAAAAElFTkSuQmCC\n",
1263 "text/plain": [
1264 "Graphics object consisting of 3 graphics primitives"
1265 ]
1266 },
1267 "metadata": {},
1268 "output_type": "display_data"
1269 }
1270 ],
1271 "source": [
1272 "points = [ (0,1), (1,2), (1.5,0), (2,4), (3,5) ]\n",
1273 "polring.<x> = QQ[] # you need to specify a polynomial ring\n",
1274 "lp = polring.lagrange_polynomial(points)\n",
1275 "show(scatter_plot(points, facecolor=\"red\")\n",
1276 " + plot(lp, 0, 3) # slightly different notation for polynomials\n",
1277 " + text(lp, (1,8), color=\"black\")\n",
1278 " )"
1279 ]
1280 },
1281 {
1282 "cell_type": "markdown",
1283 "metadata": {},
1284 "source": [
1285 "One can compute the Lagrange Polynomial over any base ring, and it has the advantage that it is a very \"nice\" function (continuous and differentiable as much as you like, with easily computable derivatives and primitives).\n",
1286 "\n",
1287 "However, it does not always give you good approximation of your data:"
1288 ]
1289 },
1290 {
1291 "cell_type": "code",
1292 "execution_count": 2,
1293 "metadata": {},
1294 "outputs": [
1295 {
1296 "data": {
1297 "image/png": "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\n",
1298 "text/plain": [
1299 "Graphics object consisting of 2 graphics primitives"
1300 ]
1301 },
1302 "metadata": {},
1303 "output_type": "display_data"
1304 }
1305 ],
1306 "source": [
1307 "R = [x/10 for x in range(-10,10)]\n",
1308 "L = [1/(1+25*x^2) for x in R]\n",
1309 "points = [(R[i], L[i]) for i in range(len(L))]\n",
1310 "polring.<x> = RR[]\n",
1311 "lp = polring.lagrange_polynomial(points)\n",
1312 "\n",
1313 "show(plot(lp, -0.82, 0.72) + scatter_plot(points))"
1314 ]
1315 },
1316 {
1317 "cell_type": "markdown",
1318 "metadata": {},
1319 "source": [
1320 "This particular example is called [Runge's phenomenon](https://en.wikipedia.org/wiki/Runge%27s_phenomenon). For a better approximation you can use a [spline](https://en.wikipedia.org/wiki/Spline_(mathematics)), which is a *piecewise* polynomial function:"
1321 ]
1322 },
1323 {
1324 "cell_type": "code",
1325 "execution_count": 90,
1326 "metadata": {},
1327 "outputs": [
1328 {
1329 "data": {
1330 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkwAAAGGCAYAAACJ/96MAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAA9hAAAPYQGoP6dpAABDSUlEQVR4nO3deXxU1f3/8dfNIBBrElSQQAQEXEoUXCAiBFBQwiZCGlCrFbSiIvDTBNtatXXrQrUquGSB4vLFFaUERCAJdUESqUUUqRJFCQpEluKSERkBZ+7vj0OAkG2STObO8n4+HveBDnfmfoa5ufPOOeeeY9m2jYiIiIjULsbpAkRERERCnQKTiIiISD0UmERERETqocAkIiIiUg8FJhEREZF6KDCJiIiI1EOBSURERKQeCkwiIiIi9VBgEpGIYxnxlmVZTtciIpGhRQBeQ1OFi0hI2bFjB4mJiezYscPpUkQk9Pn1i5VamEQkYhQXFzMuI4OkpCQAkpKSGJeRQUlJicOViUi4U2ASkWb19ttvM3r0aDp27IhlWSxatKje56xcuZLevXvTunVrunXrRl5eXr3Pyc3NZdCgQZSuW8vfp01i8YP38vdpkyhdt5aBAwf69RoiIrUJRJeciEitfvjhB84++2yuu+46MjIy6t1/8+bNjBw5khtuuIHnnnuOkpISpkyZQrt27Wp9fnFxMVOnTmXa+MuYeetNxMQc/l3wlsvHkDkrjylTptCzZ09SU1MD9t5EJHpYtt3kIUgawyQifrEsi/z8fMaOHVvrPrfffjuvvvoqpaWlhx6bPHkyH374IatXr67xOeMyMihdt5b1z+ZWCUuVfD4fva65meTz+vDKKwua/D5EJKJoDJOIhJ/Vq1eTlpZW5bFhw4bx3nvvceDAgWr7ezweFi1ezKTRw2sMSwAxMTFMGj2c/PxFeDyeZqlbRCKbApOIhJQdO3bQvn37Ko+1b9+en376id27d1fb3+124/V66Z7Uoc7X7ZaUiNfrxe12B7ReEYkOCkwiEnKOnj6pcuhATdMqxcfH43K52FS+vc7XLCvfgcvlIj4+PnCFikjUUGASkZBS0/xJu3btokWLFpx44onV9v/ii1hatBhDXn4BPp+vxtf0+XzkLSygY8extGoV2yx1i0hkU2ASkZDSr18/VqxYUeWxoqIi+vTpwzHHHFPl8f/9D0aMgI4ds/hs6xayHp1dLTT5fD4yZ+Xx2bYtbN2axe9/3+xvQUQikKYVEJFmtWfPHj7//PND/79582bWrVvHCSecQOfOnbnjjjsoLy9n3rx5gLkj7oknnmD69OnccMMNrF69mieffJIXX3yxyuv6fHDNNbB3L6xdO4ClS3OYMmUKr7+3jkmjh9MtKZGy8h3MXVJA6eYt5OTk4PGkMn069O8PddyoJyJSnW3bTd1ERGr15ptv2pjpR6psEydOtG3btidOnGhfeOGFVZ7z1ltv2eeee67dsmVL+5RTTrFzc3OrvW5urm2DbS9ffvix4uJie9y4DNvlctmA7XK57HHjMuzi4mLbtm3b57Pt9HTbPvFE2969u7nesYiEGb/yjuZhEpGws2sX/PznkJ4OTz5Z/e937tx5aCzU0Xfc7dwJZ5wB48bB3LlBKlhEQpnmYRKRyHT77ebPv/2t5r+PjY2t8ueR2reHGTNM0NIScyLiL7UwiUhYKSmBAQNg9my48caa93G73SQkJFBRUVHjNAJeL/TrB/v3w/vvQy3zXYpIdPCrhUmBSUTCykUXgdsN771Xe9CpLzDB4eD1yiume05Eopa65EQksrz1FqxcCffe2/RWodRUGDYM7rnHtDiJiNRFgUlEwsZ998G558Lo0YF7vQ0bTCuTiEhdFJhEJCy8/bZpYbr7bqhhhZRG6dsXRo40wamWScJFRAAFJhEJE3/9K5x9NowZE9jXvesu+OQTKCgI7OuKSGRRYBKRkPfpp1BYCNOnB651qVK/ftCnDzz6aGBfV0QiiwKTiIS8J56Adu3giisC/9qWBbfeCkVFZjyTiEhNFJhEJKS53fDMM2bOpVatmucYl18OiYnw2GPN8/oiEv4UmEQkpP3f/4HHA5Mn179vdnY2ycnJpKSkNOgYLVvCzTfDvHnw7beNLFREIpomrhSRkGXbkJwMPXvCyy/7/zx/Jq482o4dcPLJZizT1KmNLFhEwpEmrhSR8LZ6tbmD7aabmv9YiYlw6aU1L+YrIqLAJCIh6+mnoUsXGDw4OMe7/nr44AOziYgcSYFJRELSDz/ASy/BxInBWxx3xAjT0vTUU8E5noiEDwUmEQlJ//wn7NkD114bvGO2aGEC2vPPw48/Bu+4IhL6FJhEJCQ9/bTpiuvaNbjHve46c6fckiXBPa6IhDYFJhEJOVu3mnXjJk4M/rHPOMPM/P3ii8E/toiELgUmEQk5r7xi5kYaO9aZ4//yl7BsGVRUOHN8EQk9CkwiEnJeeglGjoSEBGeOf/nlsH8/LFrkzPFFJPQoMIlISCkrgzVrmmfdOH+dfDIMHKhuORE5TIFJRELKyy/DscfC6NHO1nHllfCvf8H//udsHSISGhSYRCSkvPSSmXH7Zz9zto5x48yfCxY4W4eIhAYFJhEJGZ98Ah9+aFp3nNauHVxyibrlRMRQYBKRkDF/PsTFmRm3Q8EvfwmrVkF5udOViIjTFJhEJGTMn2+mEmjd2ulKjMsuM7N/6245EVFgEpGQ8MknUFoK48c7Xclhxx8PQ4bAwoVOVyIiTlNgEpGQsHixuTvukksa/xrZ2dkkJyeTkpISsLrS02HlSvj664C9pIiEIcu27aa+RpNfQESkXz/o0CEwrTlut5uEhAQqKiqIj49v0mtt3w5JSWZtOyeWahGRZmf5s5NamETEcTt2wLvvwpgxTldSXYcOJsypW04kuikwiYjjliwBy4JRo5yupGbp6VBUBD/84HQlIuIUBSYRcdzixTBgALRt63QlNUtPhx9/hOXLna5ERJyiwCQijtqzxyxBEordcZW6d4eePU1LmIhEJwUmEXFUYSHs2xfagQnMci3LloHX63QlIuIEBSYRcdTixXDmmaYVJ5SNGgW7d8OaNU5XIiJOUGASEcf89BMsXWpm9w51F1wAJ5wAr73mdCUi4gQFJhFxTHExfPNN6HfHAbhcMHKkApNItFJgEhHHLFli5jnq3dvpSvxz6aXw4YewbZvTlYhIsCkwiYhjCgth+HCICZMr0bBhpqVp6VKnKxGRYAuTy5SIRJrycvj4Y0hLc7oS/7VpY+aLUrecSPRRYBIRRxQVmdm9m7LYrhMuvRRefx08HqcrEZFgUmASEUcUFpqxS6E6u3dtLr3UhKU333S6EhEJJgUmEQk6rxdWrDBjgsLNGWdAt27qlhOJNgpMIhJ0779vphMIdGDKzs4mOTmZlJSUwL7wESzLtDItXQq23WyHEZEQY9lN/4nXJUNEGuTPf4YHH4Svv4Zjjgn867vdbhISEqioqCA+Pj7gr79ihRms/uGH0KtXwF9eRILL8mcntTCJSNAVFcGQIc0TloJh0CD42c9g+XKnKxGRYFFgEpGgcrth9erwHL9UqVUrGDzYDFwXkeigwCQiQfXmm2YNuXCaf6kmw4aZpV327HG6EhEJBgUmEQmqwkLo3t1s4WzYMDhwQNMLiEQLBSYRCarCwvDujqt06qlmegF1y4lEBwUmEQmaTZugrCz8u+PATC8wbJgCk0i0UGASkaApLIQWLcyA6UgwbBh8/rkJgiIS2RSYRCRoCguhf39ohqmRHDF4sAmAamUSiXwKTCISFAcOwBtvREZ3XKX4eEhNVWASiQYKTCLS7DweD0uX7mTPHk9EDPg+0rBhJghWVHjYuXMnHo/H6ZJEpBkoMIlIsykuLmZcRgbHHXcc6emJWMSRNvQEcnJy6nze888/z9lnn82xxx5Lhw4duO666/j666+DVHXDnHRSMT/syeDEE+NITEwkLi6OcRkZlJSUOF2aiASQ1pITkWaRm5vL1KlT+XmXTtwwZgTdkzqwqXw7cxYt45Mvt/KXv/yFO++8s9rziouLufDCC5k5cyajR4+mvLycyZMnc9ppp5Gfn+/XsZt7LblKle/xtE6dmZw+/NB7nLukgNLNW8jJyWHy5MnNdnwRCQi/1pJTYBKRgCsuLmbQoEFMG38ZM2+9iZiYw43ZPp+PzFl5ZC9YwqpVq0hNTa3y3Iceeojc3Fw2HXHr2eOPP86DDz7I1q1b/Tp+MAJTU96jiIQULb4rIs6YNXMmPbp2rhYkAGJiYpiVOZnTOyUxa9bMas/t378/27ZtY9myZdi2zc6dO1mwYAGjRo0KVvl+8ec99ujaucb3KCLhR4FJRALK4/GwaPFiJo0eXi1IVIqJieGm9FHk5y+qNki6f//+PP/881xxxRW0bNmSxMRE2rRpw+OPP17rMfft24fb7a6yNSd/3+Ok0cNrfI8iEn4UmEQkoNxuN16vl+5JHercr1tSIl6vt1q42bBhA7fccgt33303a9eupaCggM2bN9c5FmjGjBkkJCQc2jp16hSQ91Kbpr5HEQk/CkwiElDx8fG4XC42lW+vc7+y8h24XK5qY4xmzJhBamoqv/3tb+nVqxfDhg0jJyeHp556iu3ba37NO+64g4qKikObv2OdGqup71FEwo8Ck4gEVGxsLGPHjGHukgJ8Pl+N+/h8PuYsWkZ6+lhiY2Or/N3evXurdXO5XC4AartJpVWrVsTHx1fZmpO/73HukoIa36OIhB8FJhEJuMysLEo3byHr0dnVAkXlHWSfbtlGZmYWd9xxBxMmTDj096NHj2bhwoXk5uZSVlZGSUkJt9xyC+effz4dO3YM9luplT/vsXTzFjIzsxyqUEQCSdMKiEizyMvLY8qUKZx2cmcm/2I43ZISKSvfwez8pWzcWn5ojqJrr72WL774grfeeuvQcx9//HHy8vLYvHkzbdq0YciQITzwwAMkJSX5dexgzcNU+R57dO3MpNGH36PmYRIJK5qHSUSc9cgjJdx220xcrkV4vV5cLhfp6WPJzMxq1rmJghWYAEpKSpg1ayb5+eY9WrgYM2Ysv/lt875HEQkYBSYRcdZtt8H8+bBxo4fvv3cTHx8flPE8wQxMlTweD+vWuenfP55XX41l9OigHFZEmk4TV4qIswoLIS0Njj02lvbt20f04OfY2FguuKA9XbvGUlTkdDUiEmgKTCLSLLZtg48/hmHDnK4keCzLBEQFJpHIo8AkIs1ixQoTIC65xOlKgistDTZuhC++cLoSEQkkBSYRaRaFhdCnD5x4otOVBNeQIeByqZVJJNIoMIlIwHm9poUpmrrjKrVpA337KjCJRBoFJhEJuPffh2++ic7ABKZb7vXX4aefnK5ERAJFgUlEAq6wEOLiTEtLNEpLg+++g/fec7oSEQkUBSYRCbiiIrj4YjjmGKcrcUZKCiQkmOAoIpFBgUlEAsrthtWro7c7DqBFC3N3oMYxiUQOBSYRCag33jBjd9LSgn/s7OxskpOTSUlJCf7Bj5KWBu++a7rmRCT8aWkUEQmoKVPMHXKffeZcDU4sjXK0zZuhWzdYuBDS0x0pQUT8o6VRRCT4CgujuzuuUteucNppGsckEikUmEQkYD7/HMrKnOmOC0XDhpnA1PSGfBFxmgKTiARMUZEZ8Dx4sNOVhIa0NLNEyqZNTlciIk2lwCQiAVNYCP37mzmYBC66yARI3S0nEv4UmEQkIA4cMHfIafzSYXFxJkBqHJNI+FNgEpGAWL0a9uxRYDrasGEmSB444HQlItIUCkwiEhCFhdC2LZx7rtOVhJa0NBMk//1vpysRkaZQYBKRgCgqgqFDIUZXlSrOPRdOPFHjmETCnS5tItJku3fD2rXqjquJy2WWSdE4JpHwpsAkIk22YoWZa2joUKcrCU3DhsF778HXXztdiYg0lgKTiDRZURH07AkdOzpdSWgaOtQEytdfd7oSEWksBSYRaRLbNoFJ3XG1O/lkSE7WOCaRcKbAJCJN8tFH8NVXWg6lPmlpWiZFJJwpMIlIkxQVQWwsDBzodCWhbdgw2LYNPvnE6UpEpDEUmESkSQoL4cILoXVrpysJbYMGQcuW6pYTCVcKTCLSaB4PvP126HTHZWdnk5ycTEpKitOlVHPssaYVToFJJDwpMIlIo739NuzbFzoDvqdOncqGDRtYs2aN06XUKC0N3nrL/JuJSHhRYBKRRissNHeA9ejhdCXhYdgw2LsXSkqcrkREGkqBSUQarajItJpYltOVhIeePaF9e3XLiYQjBSYRaZRt2+Djj0OnOy4cxMSYSSwVmETCjwKTiDRKUZFpWbrkEqcrCS9pafDBB7Brl9OViEhDKDCJSKMUFUFKCpxwgtOVhJfK9fZWrHC2DhFpGAUmEWkwr9d84as7ruESE+Hss9UtJxJuFJhEpMHefx+++SZ05l8KN2lpJjBpmRSR8KHAJCINVlgI8fHQt6/TlYSntDTYscOswyci4UGBSUQarLAQLr4YjjnG6UrC04ABZv29wkKnKxERfykwiUiDuN2werW645qidWuz/p7GMYmEDwUmEWmQN94wg7414Ltp0tLM0jIej9OViIg/FJhEpEEKC+G006BrV6crCW9paWZNuVWrnK5ERPyhwCQiDVK5HIo0TXIyJCVpHJNIuFBgEhG/ff45lJWpOy4QLOvw9AIiEvoUmETEb4WF5s64iy5yupLIkJZmphb46iunKxGR+igwiYjfCgrMLfFxcU5XUrPs7GySk5NJSUlxuhS/XHKJaWnSMikioc+ymz7VrOaqFYkC+/aZdePuuQd+9zunq6mb2+0mISGBiooK4uPjnS6nTikpZhD9Cy84XYlI1LL82UktTCLil1WrYO9eGDHC6UoiS1qaaWHy+ZyuRETqosAkIn4pKICOHeGss5yuJLKkpcHu3bBundOViEhdFJhExC8FBTB8uBlzI4HTrx8cd5zulhMJdQpMIlKvrVvh449NYJLAatkSBg/WfEwioU6BSUTqVVAAMTHmri4JvLQ0KCmBPXucrkREaqPAJCL1KiiACy6A4493upLIlJYGBw7AypVOVyIitVFgEpE6HTgA//qX7o5rTqedBl26aByTSChTYBKROv373+B2a/xSc7Iss9yMxjGJhC4FJhGp0/Ll0LYtnHee05VEtrQ0+PRT+PJLpysRkZooMIlInQoKTOtHjK4WzWrIEPNvrGVSREKTLoEiUqsdO+CDD5reHZeTk0PXrl1p3bo1vXv3ZtWqVXXuv2/fPu666y66dOlCq1at6N69O0899VTTighxxx8P55+vcUwioaqF0wWISOgqKjo8vqax5s+fT2ZmJjk5OaSmpjJ79mxGjBjBhg0b6Ny5c43Pufzyy9m5cydPPvkkp556Krt27eKnn35qfBFhYtgweOwx8HrB5XK6GhE5khbfFZFa/fKX8PnnsGZN41+jb9++nHfeeeTm5h56rEePHowdO5YZM2ZU27+goIArr7ySsrIyTjjhhEYdM5wW3z3SO+9AaiqsXm2mcRCRoNDiuyLSeF6vaWFqSnfc/v37Wbt2LWlpaVUeT0tL45133qnxOa+++ip9+vThwQcfJCkpidNPP53f/OY3eDyeWo+zb98+3G53lS0cnX++6ZpbtszpSkTkaApMIlKj996Db75pWmDavXs3Xq+X9u3bV3m8ffv27Nixo8bnlJWVUVxczEcffUR+fj6zZs1iwYIFTJ06tdbjzJgxg4SEhENbp06dGl+0g1q0MP/eS5c6XYmIHE2BSURqVFAAbdpA375Nfy3rqBV7bduu9lgln8+HZVk8//zznH/++YwcOZJHHnmEZ555ptZWpjvuuIOKiopD29atW5tetENGjYL334ft252uRESOpMAkIjVavhyGDjWtHo3Vtm1bXC5XtdakXbt2VWt1qtShQweSkpJISEg49FiPHj2wbZtt27bV+JxWrVoRHx9fZQtXw4aZgfbqlhMJLQpMIlLN7t3wn/80fTqBli1b0rt3b1YcNbnQihUr6N+/f43PSU1N5auvvmLPESvRbty4kZiYGE4++eSmFRQG2rY1A77VLScSWhSYRKSa5cvBtmHkyKa/1vTp05k7dy5PPfUUpaWlZGVlsWXLFiZPngyY7rQJEyYc2v+qq67ixBNP5LrrrmPDhg28/fbb/Pa3v+XXv/41sbGxTS8oDIwaZSaw3L/f6UpEpJICk4hU89prkJICiYlNf60rrriCWbNmcf/993POOefw9ttvs2zZMrp06QLA9u3b2bJly6H9jzvuOFasWMF3331Hnz59uPrqqxk9ejSPPfZY04sJE6NGwZ49UM/8niISRJqHSUSqOHDAdAvddhvcfbfT1TROuM7DVMm2oVMnuPxyeOQRp6sRiXiah0lEGq64GNxuuPRSpyuJXpZlukM1jkkkdCgwiUgVr70GHTvCuec6XUl0GzUKNm40M62LiPMUmESkitdeM1/WtUyTJEFy8cXQsqVamURChQKTiByycaPZ1B3nvOOOg4suUmASCRUKTCJyyNKl0KqVad0Q540aBStXmjvmRMRZCkwicshrr8GQIfCznzldiYAJTPv3w7/+5XQlIqLAJCIAVFTA22+rOy6UdO8OZ5yhbjmRUKDAJCIAFBXBTz+ZVg0JHSNHmnXlmj5lnog0hQKTiACmO65nTzg4AbeEiNGj4auvYO1apysRiW4KTCKC12taMdQdF3oGDoTjj4fFi52uRCS6KTCJCP/5D+zeHf6BKTs7m+TkZFJSUpwuJWBatDDdpApMIs7SWnIiwp13wpw5sHMnuFxOV9N04b6W3NEWLIDx46GsDLp2dboakYijteRExD/5+WasTCSEpUg0bJiZ9VutTCLOUWASiXKffGK29HSnK5HaxMWZyUQVmESco8AkEuXy881ElUOHOl2J1GXMGFi1Cr75xulKRKKTApNIlMvPhxEjIDbW6UqkLqNHm7sZNYmliDMUmESi2LZtsGaNuuPCQceOcP756pYTcYoCk0gUW7QIjjlGs3uHizFjoKAAfvzR6UpEoo8Ck0gUW7jQLLabkOB0JeKP9HT44QdYscLpSkSijwKTSJT6+muz2K6648JHjx5mW7DA6UpEoo8Ck0iUWrIEfD7TzSPhY9w4ePVV2L/f6UpEoosCk0iU8Xg87Ny5kwULPPTrB4mJTlckDZGRAd99B8uXm8/R4/E4XZJIVFBgEokSxcXFjMvIIC4ujsTERJYtjWPP9xmUlJQ4XZo0gNtdTNxxGfwi3XyOcXFxjMvQ5yjS3BSYRKJAbm4ugwYNonTdWv4+bRKLH7yXh2+dxIE9axk4cCB5eXlOlyh+yM3N5cILB5F04loeusV8jn+fNonSdfocRZqbFt8ViXDFxcUMGjSIaeMvY+atNxETc/j3JJ/PR+asPLIXLGHVqlWkpqY6WGngRNriuxCdn6NIkPi1+K4Ck0iEG5eRQem6tax/NrfKl2wln89Hr2tuJvm8PrzySmTcfhWJgSkaP0eRIPErMKlLTiSCeTweFi1ezKTRw2v8kgWIiYlh0ujh5Ocv0gDiEKXPUcR5CkwiEcztduP1eume1KHO/bolJeL1enG73UGqrHlkZ2eTnJxMSkqK06UEVLR9jiKhSIFJJILFx8fjcrnYVL69zv3KynfgcrnCvvtq6tSpbNiwgTVr1jhdSkBF2+coEooUmEQiWGxsLGPHjGHukgJ8Pl+N+/h8PuYuKSA9fSyxsbFBrlD8oc9RxHkKTCIRLjMri9LNW8h6dHa1L9vKu6tKN28hMzPLoQrFH/ocRZylu+REokBeXh5TpkzhtJM7M/kXw+mWlEhZ+Q7mLimgdPMWcnJymDx5stNlBkwk3iUHhz/HHl07M2n04c9x9qICNm6JvM9RJEg0rYCIHPb735fw4IMziYlZhNfrxeVykZ4+lszMrIibtydSAxNASUkJs2bNJD/ffI4xMS5iYsZSWJjFkCGR9TmKBIkCk4gcNngwtGgBr77qwe12Ex8fH7FjXSI5MFXyeMznuGtXPL16xfLyyzB+vNNViYQlzcMkIsbWrfDWW/CrX5kBxO3bt4/YsBQtKj/Hnj1j6dMHXnzR6YpEIpsCk0gUePFFaN0a0tOdrkSaw1VXwdKl8N13TlciErkUmESiwHPPwZgxEKG9U1HviivgwAFYuNDpSkQilwKTSIRbvx7++1/THSeRqWNHuOgieOEFpysRiVwKTCIR7rnn4MQTYdgwpyuR5nT11fDGG7Btm9OViEQmBSaRCOb1mlaHK6+EY45xuhppTuPHm3Fqzz7rdCUikUmBSSSCrVwJ5eXqjosG8fGQkQFPPw1Nny1GRI6mwCQSwZ57Drp3h759na5EguG66+Czz2D1aqcrEYk8CkwiEer77+Hll2HCBLD8mpZNwt1FF0GXLvDMM05XIhJ5FJhEItTLL8PevXDttU5XEjzZ2dkkJyeTkpLidCmOiImBiRPhpZfMZy8igaOlUUQiVL9+0KYNLF/udCXBFw1Lo9Rm0yY49VTTHXv11U5XIxIWtDSKSLT6+GP497/h+uudrkSCrXt3GDTIDP4WkcBRYBKJQE8+CW3bwmWXOV2JOOG668ycTF9+6XQlIpFDgUkkwuzbZ+bimTABWrZ0uhpxwrhxcNxxMHeu05WIRA4FJpEI8+qrsHu3uuOi2XHHwTXXmJbGAwecrkYkMigwiUSYJ580A76Tk52uRJx0002wfTssWeJ0JSKRQYFJJIJ8+SUUFal1SaBXLxOc8/KcrkQkMigwiUSQ2bMhLg6uuMLpSiQUTJ4MK1bA5587XYlI+FNgEokQ+/aZQb4TJ5oxLCLjx8Pxx8OcOU5XIhL+FJhEIsSCBfC//8GUKU5XIqEiNtbM9P7UUyZQi0jjKTCJRIicHBgyBH7+c6crkVBy003w9dfwz386XYlIeFNgEokA69bBO++EbutSTk4OXbt2pXXr1vTu3ZtVq1b59bySkhJatGjBOeec07wFRrAzzoDBgyE31+lKRMKbApNIBMjJgY4dYcwYpyupbv78+WRmZnLXXXfxwQcfMHDgQEaMGMGWLVvqfF5FRQUTJkzg4osvDlKlkevmm6G42ARrEWkcLb4rEua++w6SkuD22+Huu52uprq+ffty3nnnkXtEE0ePHj0YO3YsM2bMqPV5V155Jaeddhoul4tFixaxrgHf9tG8+G5NfvoJunWDiy/WGnMiNdDiuyLR4B//MF+IN97odCXV7d+/n7Vr15KWllbl8bS0NN55551an/f000+zadMm7rnnnuYuMSq0aAHTpsELL8CuXU5XIxKeFJhEwtiBA/DYY3DVVZCY6HQ11e3evRuv10v79u2rPN6+fXt27NhR43M+++wzfv/73/P888/TokULv46zb98+3G53lU2qmjQJXC4zV5eINJwCk0gY++c/Yds2yMx0upK6WVbVFm/btqs9BuD1ernqqqu47777OP300/1+/RkzZpCQkHBo69SpU5NrjjQnnGAWZM7Jgf37na5GJPxoDJNImLJt6NvXzOz9+utOV1Oz/fv3c+yxx/LKK6+Qnp5+6PFbb72VdevWsXLlyir7f/fddxx//PG4XK5Dj/l8PmzbxuVyUVRUxJAhQ6odZ9++few7YqIht9tNp06dNIbpKBs2wJlnwrPPwq9+5XQ1IiHDrzFM/rV3i0jIeecdWLMmtBdXbdmyJb1792bFihVVAtOKFSsYU8MtffHx8fz3v/+t8lhOTg5vvPEGCxYsoGvXrjUep1WrVrRq1SqwxUeg5GQYNgweegiuvhpqaOQTkVooMImEqZkz4fTTYeRIpyup2/Tp07nmmmvo06cP/fr1Y86cOWzZsoXJkycDcMcdd1BeXs68efOIiYnhrLPOqvL8k046idatW1d7XBrnd78zd8sVFZnwJCL+UWASCUMbN8LChWY8SkyIj0S84oor+Prrr7n//vvZvn07Z511FsuWLaNLly4AbN++vd45mSRwBg+GPn3gwQcVmEQaQmOYRMLQ9dfDsmWweTO0bu10NaFH8zDVbcECszDvmjUmPIlEOc3DJBKJtmyBefPgttsUlqRx0tPh1FPhgQecrkQkfCgwiYSZhx82d8bddJPTlUi4crngN78x01J89pnT1YiEBwUmkTCya5eZ2fuWW0xoEmmsiRPhpJPMHXMiUj8FJpEw8uijZpD3Lbc4XYmEu9at4dZb4Zln4KuvnK5GJPQpMImEiYoKeOIJs/L8CSc4XY1EgilT4NhjzR1zIlI3BSaRMJGTAz/+CNOnO12JRIqEBMjKMuvLbd/udDUioU2BSSQM7N1rJqr89a+hQwenq5FIcuutpntOd8yJ1E2BSSQMPPEEfPedmaVZJJASEkyrZV6exjKJ1EWBSSTEVVTA3/4GkyZBLUupiTTJLbdAbKxamUTqosAkEuIeeQQ8HvjDH5yuRCJVZSvT7NlqZRKpjQKTSAjbvdsEpmnToGNHp6sJfdnZ2SQnJ5OSkuJ0KWHnllvMHXMzZjhdiUho0lpyIiHsN7+BOXOgrAzatnW6mvChteQaZ8YMuOceKC2F7t2drkYkaLSWnEg4Ky+H7GzTVaKwJMFw661m9u+77nK6EpHQo8AkEqL+/GfTRaJ5lyRYjj0W7rsP5s+HNWucrkYktCgwiYSgsjKYOxd+/3tQj5IE08SJcOaZZgqLpo/YEIkcCkwiIej2203XyNSpTlci0aZFCzONxVtvwfLlTlcjEjo06FskxKxaBYMGwbx5cM01TlcTnjTou2lsGy66CL75BtatA5fL6YpEmpVfg74VmERCiM8H558PlgXvvgsxagNuFAWmpvvPf6BvX3j6abj2WqerEWlWuktOJBx4PB527tyJx+Ph2Wdh7VqzbpzCkjjp/PNh/HgzYereveaxI89VkWijS7KIQ4qLixmXkUFcXByJiYnExcVx880ZDBlSwoABTlcnYuZl+t//YOrU6ufquIwMSkpKnC5RJGjUJSfigNzcXKZOnUqPrp2ZNHo43ZM6sKl8O3kLC/hs2xZycnKYPHmy02WGLXXJBc7w4bkUFppz9YbLDp+rc5cUULpZ56pEBI1hEglFxcXFDBo0iGnjL2PmrTcRc0Tfm8/nI3NWHtkLlrBq1SpSU1MdrDR8KTAFhs5ViRIKTCKhaFxGBqXr1rL+2dwqX0CVfD4fva65meTz+vDKKwscqDD8KTAFhs5ViRIa9C0SajweD4sWL2bS6OE1fgEBxMTEMGn0cPLzF2lwrThG56pIVQpMIkHkdrvxer10T+pQ537dkhLxer243e4gVSZSlc5VkaoUmESCKD4+HpfLxaby7XXuV1a+A5fLpe4kcYzOVZGqFJhEgig2NpaxY8Ywd0kBPp+vxn18Ph9zlxSQnj6W2NjYIFcoYuhcFalKgUkkyDKzsijdvIWsR2dX+yKqvPOodPMWMjOzHKowfGVnZ5OcnExKSorTpUQEnasih+kuOREHTJiQx7PPTjk0t023pETKyndobpsA0V1ygZOXl8eUKVMOzRlWea7m5Rfw2VadqxIRNK2ASCjauROSkyElpYS4uJnk5y/C6/XicrlITx9LZmaW5rRpIgWmwCopKWHWrKrnakzMWNLSsnjtNZ2rEvYUmERCjW3D2LGwejV8/DG0a2du33a73cTHx2scSIAoMDWPI8/VZ5+N5aab4PXXYcgQpysTaRIFJpFQM28eTJwI+fkmOEnzUGBqfj6fCUpffgnr10NcnNMViTSaJq4UCSVbt8Itt8A11ygsSfiLiYGnnjKL8/7mN05XI9L8FJhEgsC2YdIkOO44ePRRp6sRCYxu3eChh2DOHCgsdLoakealwCQSBHPmQFERPPkkHH+809WIBM5NN8HQoXD99fDNN05XI9J8FJhEmllZGdx2m/liGTbM6WpEAsuyzC8Ce/eaVtSmD4sVCU0KTCLN6Kef4Npr4aST4O9/d7oakebRqZMJTfn5MHu209WINA8FJpFm9Kc/QUkJ/N//6S4iiWzp6XDzzZCVBR995HQ1IoGnaQVEmskbb8All8D998Mf/uB0NdFF0wo4w+OBvn3B64U1a+DYY52uSMQvmlZAxCm7dsHVV8PgwXDHHU5XIxIcsbHw0kuweTNMn+50NSKBpcAkEmA+H0yYYP587jlwuZyuSCR4kpNh1iwzlumf/3S6GpHAUWASCbAHHjBz0jz7LHTo4HQ1IsF3ww0wbpyZaqCszOlqRAJDgUkkgAoK4K67zJiltDSnqxFxhmXBP/4BbduaWe1/+MHpikSaToFJJEA+/xx++UsYMQLuvdfpakSc1aYNLFpkWph+/WvNzyThT4FJJAD27DG/SbdrB88/r3FLTsnOziY5OZmUlBSnSxHgrLPMlBovv6x5yCT8aVoBkSaybRg/3oxbevddM+hVnKVpBULLXXfB3/4Gy5erq1pCkqYVEAmGGTPM3UDz5iksidTk/vvNskBXXgmbNjldjUjjKDCJNMH8+ea35z/+0cx0LCLVuVzwwgtmEPill8K33zpdkUjDKTCJNNLbb5v5lq6+WoO8RerTpg0sXQr/+58Z77dvn9MViTSMApNII5SWwpgxkJoKTz0FMfpJEqnXaafBq6+asX7XXmsmdxUJF7rMizTQ9u1m6oCTT4aFC6FlS6crEgkf/fubO0kru7NFwoUCk0gDfP89jBoFP/0Ey5aZbgYRaZiMDHjoIXPnXF6e09WI+KeF0wWIhIv9++Hyy80ElcXF0KmT0xWJhK+sLNiyBaZMgYQEM+mrSChTYBLxw08/mcHdb7xhWpZ69XK6IpHwZlnwyCPmjrkJEyAuztxBJxKq1CUnchSPx8POnTvxeDyAGZj6619Dfj688gpcfLHDBYpEiJgYePJJGD3aTP761ltV//7on0URJykwiRxUXFzMuIwM4uLiSExMJC4ujnEZGfziFyU89xw89xxcdpnTVYpElhYt4MUXYeBA08K0alXtP4slJSVOlytRTIFJBMjNzWXQoEGUrlvL36dNYvGD9/L3aZP4aO1aFi8eyNVX53HllU5XGb5ycnLo2rUrrVu3pnfv3qxatarWfRcuXMjQoUNp164d8fHx9OvXj8LCwiBWK8HWqpVpwe3bFy6+uOafxdJ1axk4cCB5GiUuDtFachL1iouLGTRoENPGX8bMW28i5ohJlXw+H5mz8shesIRVq1aRmprqYKXhaf78+VxzzTXk5OSQmprK7NmzmTt3Lhs2bKBz587V9s/MzKRjx44MHjyYNm3a8PTTT/PQQw/x7rvvcu655/p1TK0lF57+9a9i0oYOYtrl+lmUoPJrLTkFJol64zIyKF23lvXP5la5QFfy+Xz0uuZmks/rwyuvLHCgwvDWt29fzjvvPHJzcw891qNHD8aOHcuMGTP8eo0zzzyTK664grvvvtuv/RWYwtO4jAxKP1jL+uf0syhBpcV3Rerj8XhYtHgxk0YPr/ECDRATE8Ok0cPJz1+kwacNtH//ftauXUvaUUvUp6Wl8c477/j1Gj6fj++//54TTjih1n327duH2+2uskl4OfSzeJl+FiU0KTBJVHO73Xi9Xrondahzv25JiXi9Xn0RN9Du3bvxer20b9++yuPt27dnx44dfr3Gww8/zA8//MDll19e6z4zZswgISHh0NZJk2SFHf0sSqhTYJKoFh8fj8vlYlP59jr3KyvfgcvlUvdOI1lW1RZv27arPVaTF198kXvvvZf58+dz0kkn1brfHXfcQUVFxaFt69atTa5Zgks/ixLqFJgkqsXGxjL0kjHk5Rfgq2UlUJ/Px9wlBaSnjyU2NjbIFYa3tm3b4nK5qrUm7dq1q1qr09Hmz5/P9ddfz8svv8wll1xS576tWrUiPj6+yibhJTY2lrFjxjB3iX4WJTQpMElU++ADePc/WWzcsoWsR2dXu1BX3plTunkLmZlZDlUZvlq2bEnv3r1ZsWJFlcdXrFhB//79a33eiy++yLXXXssLL7zAqFGjmrtMCRGZWVmUbq7nZ7FsC5Mn62dRgk9Lo0jUys+HX/0KkpMHcPnlOdx++xRef28dk0YPp1tSImXlO5i7pIDSzVsO3RIvDTd9+nSuueYa+vTpQ79+/ZgzZw5btmxh8uTJgOlOKy8vZ968eYAJSxMmTODRRx/lggsuONQ6FRsbS0JCgmPvQ5rfgAEDyMnJYcqU2n8WWxyTwx/+kEqvXtCundMVS1Sxbbupm0hY8fls+y9/sW2w7fHjbfuHH8zjxcXF9rhxGbbL5bIB2+Vy2ePGZdjFxcXOFhwBsrOz7S5dutgtW7a0zzvvPHvlypWH/m7ixIn2hRdeeOj/L7zwQhszXUmVbeLEiX4fr6KiwgbsioqKAL4LCZa6fhbXrLHtk06y7VNOse1165yuVCKEX3lH8zBJVPF44MYbzTIn99wDd99t1rOquo8Ht9tNfHy8xkmEKc3DFBlq+1ncsgXGjoVPP4VnnjHr0Ik0gSauFDlSWRlkZMAnn8DTT6OlTiKYAlPk27sXrr8eXnoJ7rwT7r8fXC6nq5IwpYkrRSotXw59+oDbDf/+t8KSSLg79lh44QV44AGYMQNGjICdO52uSiKZApNEtJ9+gj/8AUaNgtRUeO89OPtsp6sSkUCwLPjd76CoCNavNz/b//qX01VJpFJgkoj1xRcwaBD87W/w5z/D4sVw/PFOVyUigXbJJbBuHfTsCWlp8Mc/ml+WRAJJgUki0oIFcM458NVXsGqVGeNQy/JUIhIBEhOhsND8cjRjBgwZAtu2OV2VRBJ9hUhE+fZbmDjR3DWTlmZ+6+zXz+mqRCQYYmLML0crV5oW5rPPhuefh6bf2ySiwCQRZPlyOOss0/X29NMwfz60aeN0VSISbKmpZhb/4cPN5LSXXQbl5U5XJeFOgUnCntsNkybByJFmDMNHH8G115oBoSISnU480bQuLV4Ma9dCcjLMnavWJmk8BSYJaR6Ph507d+LxeGr8+8WLTavS/PkwZ45pZTr55CAXKSIh67LLYMMGGDcObrjBdNV/8UXt+9d3zZHopcAkIam4uJhxGRnExcWRmJhIXFwc4zIyKCkpAeDLL2HMGDPb71lnwX//ay6GalUSkaO1aQNPPmkGhW/caK4ZTzwBXu/hfeq75ohopm8JObm5uUydOpUeXTszafRwuid1YFP59kOLb44dm0Nh4WSOPx4efRR+8QsFJTGys7PJzs7G6/WyceNGzfQt1bjd8PvfQ26umcz2iSfg/ffrvubk5OQcWixaIpKWRpHwU1xczKBBg5g2/jJm3noTMUfMBeDz+ciclccTryzh8stXMXduKnFxDhYrIUtLo0h9Skpg2jRYt64Yy6r7mpO9YAmrVq0iNTXVwYqlGSkwSfgZl5FB6bq1rH82t8qFq5LP56Pnr27mzN59eOWVBQ5UKOFAgUn84fVCSkoGP3y9lg0v1n7N6XXNzSSfp2tOBNNachJePB4PixYvZtLo4TVeuABiYmK44bLh5Ocv0qBMEWmS/fs9rF+/mMnpdV9zJo3WNUcUmCSEuN1uvF4v3ZM61Llft6REvF4vbrc7SJWJSCTSNUcaQoFJQsYxx8QTE+NiU/n2OvcrK9+By+VSV4uINEl8fDwul6454h8FJnHcvn2QnQ1nnRULjGH2ogJ8Pl+N+/p8PuYuKSA9fSyxsbHBLVREIkpsbCxjx4xh7pK6rzl5Cws4qd1YPvxQ15xopsAkjtmzB2bNgtNOg1tugaFD4YUXsti4ZQtZj86udgGrvGOldPMWMjOznClaRCJKZlYWpZvrvuZ8tm0LrVpn0a+fuU6tXOlQseKoFk4XINFn1y54/HHTqvT993DVVWZelB49AAbw7bc5TJkyhdffW8ek0cPplpRIWfmOKnOi6PZeEQmEAQMGkJNT/zXnxhtTWbgQ/vxnuOgiGDgQ/vAHE6A0D1x00LQCEjRlZfDQQ2ZhXJfLzMydlQWdO1fft6SkhFmzZpKfvwiv14vL5SI9fSyZmVkKS1IvTSsgDeXvNce24bXX4E9/gjVroFcvmD4drrwSWrVy8A1IU2geJnGebZsJ4h5/HBYsgBNOMN1vU6ea/66Px+PB7XYTHx+vMUviNwUmaSx/rzm2DW+9BQ8/DEuXQocOZiLMG26Adu2CV68EhAKTBJ6/F5M9e+CFF0y32/r1cOqpkJkJ110Hxx4bvHolOikwSTCVlsLMmTBvnglS48bB5MkwYED93XX6pTAkaOJKCRx/F6b89FO49VZISoKbb4ZTToGCAvP41KkKSyISeXr0gDlzYNs2+OtfTVfdoEFw5pnw2GPw7bfVn6PFfsOPWpikXvUthjtzZg4JCZN56ilYtco0R0+aBDfdBF26OF29RCO1MImTfD7TXZeXB/n5cMwxcMUVptXp/PMhL0+L/YYYdclJ0/m7GC6sYujQVK67Dn7xCw1+FGcpMEmo2LEDnnrKtEB9+SWcckoxX36pxX5DjAKTNJ0/i+GeddXNdEvuw9JlWphSQoMCk4QarxdWrIAbb8wglrVseEmL/YYQjWGSpvF3Mdwbxw6nsEgLU4qI1Mblggsv9PDVV4uZ/Ast9huOFJikRqWl8Kc/aWFKCS/Z2dkkJyeTkpLidCki1TR0sd+vvtI1NZQoMAlgboVdswbuvBN+/nNIToZHH40nxtLClBI+pk6dyoYNG1izZo3TpYhU05DFfi1cJCfHc+mlMHs2lJcHqUiplQJTGPN4POzcubPRzbbffWcmk7z+ejj5ZHP3xpw50L8/LFkCX38dS3p6/QtTajFcEZH6+bvY79wlBYwYMZa//jWWPXvMlCwnnwy9e8N998H775tfchujqd8b0UyBKQw1dv4O24YPPjDzhAwaBG3bwvjxsHq1mdb/jTcO39Fx6aXQurV/C1NqMVwREf/4e029864sbrvNTE+waxc895xZqPyRR0xw6tTJ/LL78svw9df1H1fzPjWd7pILM/XNiXT0/B07d8Kbb0JhoZlAcscOOO44uPhiGDEChg+vf66kvLw8pkyZcuiYNS1MqTlDJJToLjkJZU25pu7fb+a7W7rUXNc3bDCziaekwLBhcMkl0Ldv1aldGvq9EYU0rUCk8WdOpOwFS/jTn1axfXsqb75pfpjAzDg7YoTZBgyAli0bdmwthivhRIFJQl2grqlbt5rpCgoLzZ/ffmt6B/r3h4sughNPLGbaNM37VA8Fpkjjz5xIyVfezMatfTj11AUMHgyDB5sfmg5135ThN617JOFAgUnCRSCvqV4vfPih6cZ76y14+21wV2RwWifN+1QPBaZga84w4fF4iIuL4+/TJpF5ZXqt+816KZ/fPjGX77//XoFGopYCkwjs2eOhTRvnvzfC4BdtTVwZLM0xmM62YdMmmD8ffvtbuPhizYkkIiL+++GHhn1vjBvn5uGH4Z13YO/eph8/0gaat3C6gHB35GC6v0+bVGUw3cCBA/0aTGfbZpXrNWvgvfcOb5UrXHfpAuecE09MjOZEEhER/zRk3qeYGBdudzx//CN4PBATY+bj690bzjvP/HnOOfCzn/l37EB8N4Yadck1gb+DsI8cTLdvn5lFe/36w9uHH5rbRgE6doQ+fapu7dqZv/NnDJP6okXUJSdSqaHfGwcOwH//C2vXHt7Wrzd358XEmImNe/eGc8+FXr3MVvkdVakx340Oi+4xTMHoM/XnROx59c20iOvDWWctYP16+OQTMzAPoFu3wydc794mHHXsWPvxwvAkFHGEApOIEYjvjQMH4OOPq4eoH380f9++vfke69nTbM89m8H2zWtZ/5wzv9w34vs/OgNTcXExs2bOZNHixYdu1Rw7ZgxZ06cHNEQ0ZBD2bY/NpV+/7zn33NhDAenMMyEuruHH1ZxIIvVTYBI5rDm+N7xeM852/XrTIlXZY1JW5sEijodvDf5A8yZ8//sVmCJqDFNz9plWVMCnn5oWok8+gQ8+8H8wnW17WbjQTfv2TT8pJk+eTM+ePZk1aya/fWJulfk75sx7Xi1LIiJSRXN8b7hccPrpZhs37vDjmza5OfVU/wea33efm969YznjDNPrctxxDS4FCM6YqaAFpubuIisuLmbq1Kk1NjvecvkYMmeZhN2zZ88aTw6fD776CsrKTGretKnqfx859XynTnD66c4Nwk5NTSU1NTUcbtUUEZEQEKzvjY4dG7DAsOXiH/+I54EHDj9+0kkmOHXvbv6s3Lp3N/MJ1tDD1+Tvf381e5dcsLrI/BrY9qub6dCtD//v/y3gyy+rBqPNmw/3xwIkJR3+wLp3N9sZZ5g0XZmANQhbJDSpS07EOQ39bty9GzZuNN/FR26bNpmGjEqtWkHXrtUD1ROPZ1C+qUljppwfwxSs9WsaNJ7o0bnYfE+rVrF07Xo4DB0ZjE45BfwJ3hqELRJasrOzyc7Oxuv1snHjRgUmEQcE8rvR44Evvqgaoo4MVR5PQMZMOTuGKVBNZHv3wvbtZvvqq8P/feS2bVsDxhPh5b//dZOcHFtj015DDBgwgJycHKZMmcLr762rdTCdwpJIcEydOpWpU6ceamESkeAL5HdjbCz06GG2o9k2fPSRm169Gjapc2O7IpstMM2aOZMeXTtXC0sAMTExzMqczOvvfcidd87kxhtTawxC27fD0RNWt2pl+jErt9NPh3bt4rn/fv/HE3XvHt/ksFRJg7BFRESqCsZ3o2XBqaf6P2aqqeOJm6VLrjFdZHFxsVWCUG1bmzbmH+looTCeSIOwRUKDxjCJhI7m/m4MwPe/c11ybnfDusg2bXLTrVvT/hEzs7IYNGgQWY/OrrXPtHTzFubMe75Jx6lLbGysgpKIiMgRmvu7MVjf/80SmBqyfo3L5aJDh6b/BqjxRCIiItEnWN//zXaXnFNdZCUlJcyaNZP8/EVV+kwzM7MUlkSihLrkRKJPE77/nZ1WwOlb7jWeSCR6KTCJRK+wXEtO656JiBMUmESkAZwPTKAuMhEJPgUmEWmAoAUmv1iWFQvEA27btj1BOaiIRCXLsuKBCiDBtm13ffuLiNQnaIFJRCRYLMuygDjge1sXOREJAAUmERERkXoEaIEQERERkcilwCQiIiJSDwUmERERkXooMImIiIjUQ4FJREREpB4KTCIiIiL1UGASERERqYcCk4iIiEg9FJhERERE6qHAJCIiIlKPFk158hHrNYmIiIiEq3rXnWxSYMKEpYomvoaIiIiIkxIAd107NGnx3Qa2MMUB24CTge8bfdCG+Q9wfpCO5dQxI/09OnHeQOR/jjpvmoc+x/A/XjR8V+m8qa55W5gOvnidiaySyVaHivLrOU1lWZYvWMdy6piR/h6dOG8OHjeiP0edN812XH2O4X+8yv+M2O8qnTeNE+mDvrOj4JjR8B6dEOmfo86b5qHPMfyP54Ro+DcN+/fYpC65Bh3IsuIx450Sgp1sJXzpvJHG0HkjjaVzR2oTzBamfcB9B/8U8ZfOG2kMnTfSWDp3pEZBa2ESERERCVeRPoZJREREpMkUmERERETqocAkIiIiUg8FJhEREZF6NGtgsizrLsuy3rEsa69lWd/5+RzLsqx7Lcv6yrIsj2VZb1mWdWZz1imhxbKs4y3LetayrIqD27OWZbWp5znPWJZlH7X9O0gliwMsy5piWdZmy7J+tCxrrWVZA+vZ/8KD+/1oWVaZZVmTg1WrhI6GnDeWZV1Uw3XFtizr58GsWUJDc7cwtQReAXIb8JzfAdOBaUAKsANYYVmWFvmNHi8A5wDDD27nAM/68bwCoMMR28jmKU+cZlnWFcAs4C/AucAqYLllWZ1r2b8rsOzgfucCfwUesywrIygFS0ho6HlzhDOoem35rBnLlBAVlGkFLMu6Fphl23abevazgK8O7vvAwcdaATuB223bnt3MpYrDLMvqAWwALrBt+92Dj10ArAZ+btv2p7U87xmgjW3bY4NUqjjIsqx3gfdt2775iMdKgUW2bd9Rw/4PAJfZtt3jiMfygLNt2+4XjJrFeY04by4C3gSOt237uyCVKSEq1MYwdQUSgaLKB2zb3gesBPo7VZQEVT+gojIsAdi2/W/MzLv1nQMXWZa1y7KsjZZl/cOyrJOas1BxhmVZLYHeHHGdOKiI2s+RfjXsXwj0sSzrmMBWKKGokedNpQ8sy9puWdbrlmUNbpYCJeSFWmBKPPjnzqMe33nE30lkSwR21fD4Luo+B5YDVwNDgNsw3blvHGyhlMjSFnDRsOtEYi37tzj4ehL5GnPebAduBDKAXwCfAq9bljWouYqU0NWioU+wLOte4J56dkuxbfu9RlVkHN1PaNXwmIQRf8+bg3/W9FnXeQ7Ytj3/iP/9yLKs94AvgVHAQv8rlTDS0OtETfvX9LhENr/Pm4NDAI4cBrDasqxOwG+At5unPAlVDQ5MwBPAS/Xs80UjXhfMAG8waX/7EY+fRPXfCiS8+Hve9ALa1/B37WjAOWDb9nbLsr4ETvP3ORI2dgNeqrcK1HWd2FHL/j8BXwe0OglVjTlvavJv4FeBKkrCR4MDk23buzEnXnPYjLmwDQU+gEP9zhcCtzfTMSUI/D1vLMtaDSRYlnW+bdv/OfhYXyABeMff41mWdSLQiarBWyKAbdv7Lctai7lO5B/xV0OBxbU8bTUw+qjH0oD3bNs+EPgqJdQ08rypybnouhKVmnseps6WZZ0DdAZclmWdc3A77oh9PrEsKx3ANrfszQLutCwr3bKss4BngL2YW80lwtm2XYqZHuAflmVdcPAOuX8Arx15h9yR541lWcdZlvWQZVn9LMs65eCdLUswAS2/2kEkEjwCTLIs69eWZfWwLGsm5jqTB2BZ1gzLsuYdsX8e0MWyrEcO7v9r4HrgoaBXLk5q0HljWVamZVljLcs6zbKsMy3LmoEZz/SEI9WLoxrTJdcQ9wMTj/j/Dw7+ORh46+B/n4FpPaj0IBAL5ADHA+8CabZtf9+slUoouRp4jMN3s7yKmZfrSEeeN16gJzABaIP57e9N4AqdN5HJtu35B1sR78bMi/MRMNK27S8P7tIB80VYuf9my7JGAjOBqZjpS26xbfufwa1cnNTQ8wYzl+BDQBLgAT4GRtm2vSx4VUuoCMo8TCIiIiLhLNSmFRAREREJOQpMIiIiIvVQYBIRERGphwKTiIiISD0UmERERETqocAkIiIiUg8FJhEREZF6KDCJiIiI1EOBSURERKQeCkwiIiIi9VBgEhEREamHApOIiIhIPf4/cULtEGRU7vAAAAAASUVORK5CYII=\n",
1331 "text/plain": [
1332 "Graphics object consisting of 2 graphics primitives"
1333 ]
1334 },
1335 "metadata": {},
1336 "output_type": "display_data"
1337 }
1338 ],
1339 "source": [
1340 "show(plot(spline(points), -1, 1) + scatter_plot(points))"
1341 ]
1342 },
1343 {
1344 "cell_type": "markdown",
1345 "metadata": {},
1346 "source": [
1347 "A detailed explanation of splines is a good topic for a course of numerical analysis. For this course it is enough that you know that they exist and they can be plotted."
1348 ]
1349 }
1350 ],
1351 "metadata": {
1352 "kernelspec": {
1353 "display_name": "SageMath 9.2",
1354 "language": "sage",
1355 "name": "sagemath"
1356 },
1357 "language_info": {
1358 "codemirror_mode": {
1359 "name": "ipython",
1360 "version": 3
1361 },
1362 "file_extension": ".py",
1363 "mimetype": "text/x-python",
1364 "name": "python",
1365 "nbconvert_exporter": "python",
1366 "pygments_lexer": "ipython3",
1367 "version": "3.8.5"
1368 }
1369 },
1370 "nbformat": 4,
1371 "nbformat_minor": 4
1372}
diff --git a/src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-modified-checkpoint.ipynb b/src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-modified-checkpoint.ipynb
new file mode 100644
index 0000000..5933058
--- /dev/null
+++ b/src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-modified-checkpoint.ipynb
@@ -0,0 +1,1614 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "# Symbolic expressions\n",
8 "\n",
9 "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n",
10 "\n",
11 "Last time we saw the basics of symbolic expressions:\n",
12 "* How to define and manipulate symbolic expressions\n",
13 "* How to introduce new variables (in the Mathematical sense) with `var()`\n",
14 "* How to solve equations and inequalities\n",
15 "* Some of the Mathematical constants that are included in Sage, and how to approximate them using `n()`\n",
16 "\n",
17 "Here are some examples to remind you of these basic things:"
18 ]
19 },
20 {
21 "cell_type": "code",
22 "execution_count": 1,
23 "metadata": {},
24 "outputs": [
25 {
26 "name": "stdout",
27 "output_type": "stream",
28 "text": [
29 "[\n",
30 "x == -sqrt(-pi),\n",
31 "x == sqrt(-pi)\n",
32 "]\n",
33 "[\n",
34 "z == -sqrt(pi + x^2),\n",
35 "z == sqrt(pi + x^2)\n",
36 "]\n",
37 "[[y < -2], [y > 1]]\n",
38 "2*pi + e is approximately 9.00146713563863\n"
39 ]
40 }
41 ],
42 "source": [
43 "var('y', 'z') # Define new variables (x is already defined by Sage)\n",
44 "f = x^2 + pi\n",
45 "g = y^2 + y - 2 > 0\n",
46 "print( solve(f==0, x) )\n",
47 "print( solve(z^2 - f, z) )\n",
48 "print( solve(g, y) )\n",
49 "print( 2*pi + e, \"is approximately\", n(2*pi + e) )"
50 ]
51 },
52 {
53 "cell_type": "markdown",
54 "metadata": {},
55 "source": [
56 "Now we will see some more details about solving equations and manipulating their solutions."
57 ]
58 },
59 {
60 "cell_type": "markdown",
61 "metadata": {},
62 "source": [
63 "## Solving equations and inequalities\n",
64 "\n",
65 "**Reference** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)] for the details of `solve()` and `find_root()`, [[2](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/relation.html#solving)] for examples.\n",
66 "\n",
67 "Other than equations and inequalities, we can also solve systems: it is enough to give Sage a list of expressions and a list of variables with respect to which we want to solve. For example the system\n",
68 "\n",
69 "\\begin{align*}\n",
70 " \\begin{cases}\n",
71 " x + y = 2 \\\\\n",
72 " 2x - y = 6\n",
73 " \\end{cases}\n",
74 "\\end{align*}\n",
75 "\n",
76 "Can be solved as"
77 ]
78 },
79 {
80 "cell_type": "code",
81 "execution_count": 2,
82 "metadata": {},
83 "outputs": [
84 {
85 "data": {
86 "text/plain": [
87 "[[x == (8/3), y == (-2/3)]]"
88 ]
89 },
90 "execution_count": 2,
91 "metadata": {},
92 "output_type": "execute_result"
93 }
94 ],
95 "source": [
96 "solve([x+y == 2, 2*x - y == 6], [x,y])"
97 ]
98 },
99 {
100 "cell_type": "markdown",
101 "metadata": {},
102 "source": [
103 "**Exercise.** Find the intersection of the circle of radius $2$ centered in the origin and the parabula of equation $y=x^2-2x+1$."
104 ]
105 },
106 {
107 "cell_type": "markdown",
108 "metadata": {},
109 "source": [
110 "**Solution:** the system is\n",
111 "\\begin{align*}\n",
112 " \\begin{cases}\n",
113 " y^2 = x^2 - 2x +1\\\\\n",
114 " x^2 + y^2 = 4\n",
115 " \\end{cases}\n",
116 "\\end{align*}"
117 ]
118 },
119 {
120 "cell_type": "code",
121 "execution_count": 5,
122 "metadata": {},
123 "outputs": [
124 {
125 "data": {
126 "text/plain": [
127 "[[x == -1/2*sqrt(7) + 1/2, y == 1/2*sqrt(7) + 1/2], [x == 1/2*sqrt(7) + 1/2, y == -1/2*sqrt(7) + 1/2], [x == -1/2*sqrt(7) + 1/2, y == -1/2*sqrt(7) - 1/2], [x == 1/2*sqrt(7) + 1/2, y == 1/2*sqrt(7) - 1/2]]"
128 ]
129 },
130 "execution_count": 5,
131 "metadata": {},
132 "output_type": "execute_result"
133 }
134 ],
135 "source": [
136 "var('y')\n",
137 "eq1 = y^2 == x^2-2*x+1\n",
138 "eq2 = x^2 + y^2 == 4\n",
139 "solve([eq1, eq2], [x,y])"
140 ]
141 },
142 {
143 "cell_type": "markdown",
144 "metadata": {},
145 "source": [
146 "### The set of solutions\n",
147 "\n",
148 "One would expect the result of `solve()` to be a list of solutions, but it is actually a list of expressions (technically it is not a list but a different type of Python collection, but this is not so important)"
149 ]
150 },
151 {
152 "cell_type": "code",
153 "execution_count": 11,
154 "metadata": {},
155 "outputs": [
156 {
157 "name": "stdout",
158 "output_type": "stream",
159 "text": [
160 "-3\n"
161 ]
162 }
163 ],
164 "source": [
165 "solutions = solve(x^2-9 == 0, x)\n",
166 "solutions[0] # This is the expression 'x == -3'\n",
167 "\n",
168 "# Using rhs() explained below\n",
169 "print(solutions[0].rhs())"
170 ]
171 },
172 {
173 "cell_type": "markdown",
174 "metadata": {},
175 "source": [
176 "To read the actual solution without the `x ==` part you can use the `rhs()` or `lhs()` functions, which can be applied to any expression containing a relation operator (like `==`, `<`, `>=`...) and return the *right hand side* and *left hand side* of the expression, respectively"
177 ]
178 },
179 {
180 "cell_type": "code",
181 "execution_count": 10,
182 "metadata": {},
183 "outputs": [
184 {
185 "name": "stdout",
186 "output_type": "stream",
187 "text": [
188 "rhs: -y + 2\n",
189 "lhs: x^2 + y\n"
190 ]
191 }
192 ],
193 "source": [
194 "f = x^2+y <= 2-y\n",
195 "print(\"rhs:\", f.rhs())\n",
196 "print(\"lhs:\", f.lhs())"
197 ]
198 },
199 {
200 "cell_type": "markdown",
201 "metadata": {},
202 "source": [
203 "When you solve an inequality or a system, the set of solutions can be more complicated to describe. In this case the result is a list containing lists of expressions that have to be `True` at the same time. It is easier to explain with an example:"
204 ]
205 },
206 {
207 "cell_type": "code",
208 "execution_count": 12,
209 "metadata": {},
210 "outputs": [
211 {
212 "name": "stdout",
213 "output_type": "stream",
214 "text": [
215 "Simple inequality: [[x < -3], [x > 3]]\n",
216 "System of inequalities:\n",
217 " [\n",
218 "[3 < x, x < 6],\n",
219 "[x < -3]\n",
220 "]\n"
221 ]
222 }
223 ],
224 "source": [
225 "print(\"Simple inequality:\", solve(x^2-9 > 0, x))\n",
226 "print(\"System of inequalities:\\n\", solve([x^2-9 > 0, x < 6], x))"
227 ]
228 },
229 {
230 "cell_type": "markdown",
231 "metadata": {},
232 "source": [
233 "In the last example (system of inequalities), Sage is telling us that the system\n",
234 "\\begin{align*}\n",
235 " \\begin{cases}\n",
236 " x^2-9 > 9 \\\\\n",
237 " x < 6\n",
238 " \\end{cases}\n",
239 "\\end{align*}\n",
240 "has two solutions:\n",
241 "* $x$ is between $3$ and $6$;\n",
242 "* $x$ is less than $-3$.\n",
243 "\n",
244 "Since in Sage (and in Python) expressions can have at most on relational operator like `<`, the first solution requires two expressions to be described. Hence the \"list of lists\".\n"
245 ]
246 },
247 {
248 "cell_type": "markdown",
249 "metadata": {},
250 "source": [
251 "**Exercise.** In the first exercise you were asked to solve a system of equations, but some of its solutions were complex numbers. Select only the real solutions and print them as pairs $(x,y)$."
252 ]
253 },
254 {
255 "cell_type": "code",
256 "execution_count": 24,
257 "metadata": {},
258 "outputs": [
259 {
260 "name": "stdout",
261 "output_type": "stream",
262 "text": [
263 "All solutions:\n",
264 "[\n",
265 "[x == (-1/2*I + 1/2), y == -sqrt(1/2*I + 4)],\n",
266 "[x == (-1/2*I + 1/2), y == sqrt(1/2*I + 4)],\n",
267 "[x == (1/2*I + 1/2), y == -sqrt(-1/2*I + 4)],\n",
268 "[x == (1/2*I + 1/2), y == sqrt(-1/2*I + 4)]\n",
269 "]\n"
270 ]
271 }
272 ],
273 "source": [
274 "# We use a different equation because the first exercise only\n",
275 "# had real solutions.\n",
276 "var('y')\n",
277 "eq1 = y^2 == x^2-2*x+5\n",
278 "eq2 = x^2 + y^2 == 4\n",
279 "solutions = solve([eq1, eq2], [x,y])\n",
280 "\n",
281 "print(\"All solutions:\")\n",
282 "print(solutions)\n",
283 "\n",
284 "for s in solutions:\n",
285 " #print(\"One solutions is:\", s)\n",
286 " x0 = s[0].rhs()\n",
287 " y0 = s[1].rhs()\n",
288 " if x0 in RR and y0 in RR:\n",
289 " print((x0, y0))"
290 ]
291 },
292 {
293 "cell_type": "markdown",
294 "metadata": {},
295 "source": [
296 "When solving a system of equations (not inequalities), you can use the option `solution_dict=True` to have the solutions arranged as a *dictionary*, which is a type of Python collection that we did not treat in this course"
297 ]
298 },
299 {
300 "cell_type": "code",
301 "execution_count": 25,
302 "metadata": {},
303 "outputs": [
304 {
305 "data": {
306 "text/plain": [
307 "[{x: 8/3, y: -2/3}]"
308 ]
309 },
310 "execution_count": 25,
311 "metadata": {},
312 "output_type": "execute_result"
313 }
314 ],
315 "source": [
316 "solve([x+y == 2, 2*x - y == 6], [x,y], solution_dict=True)"
317 ]
318 },
319 {
320 "cell_type": "markdown",
321 "metadata": {},
322 "source": [
323 "### Alternative method for real roots: `find_root()`\n",
324 "\n",
325 "The `solve()` method is very useful when solving *symbolic* equations, for example when you have two variables and you want to solve for one of them in terms of the other. However, it does not always find explicit solutions.\n",
326 "\n",
327 "When you want to find an explicit, even if approximate, solution, it can be better to use `find_root()`. This function works *numerically*, which means that it finds an approximation of the root. It only works for real solutions and you need to specify an interval where you want the root to be searched:"
328 ]
329 },
330 {
331 "cell_type": "code",
332 "execution_count": 28,
333 "metadata": {},
334 "outputs": [
335 {
336 "name": "stdout",
337 "output_type": "stream",
338 "text": [
339 "Using solve():\n",
340 " [\n",
341 "x == -e^x + 10\n",
342 "]\n",
343 "Using find_root(): 2.070579904980303\n"
344 ]
345 }
346 ],
347 "source": [
348 "f = e^x + x - 10\n",
349 "print(\"Using solve():\\n\", solve(f, x))\n",
350 "print(\"Using find_root():\", f.find_root(0,10))"
351 ]
352 },
353 {
354 "cell_type": "markdown",
355 "metadata": {},
356 "source": [
357 "## Evaluating functions\n",
358 "\n",
359 "If an expression contains only one variable you can evaluate it easily, even if it is not a function."
360 ]
361 },
362 {
363 "cell_type": "code",
364 "execution_count": 29,
365 "metadata": {},
366 "outputs": [
367 {
368 "name": "stdout",
369 "output_type": "stream",
370 "text": [
371 "1\n",
372 "y + 3 > (y + 3)^2\n"
373 ]
374 }
375 ],
376 "source": [
377 "var('y')\n",
378 "f = x^2-3\n",
379 "g = x > x^2\n",
380 "\n",
381 "print(f(2))\n",
382 "print(g(3+y))"
383 ]
384 },
385 {
386 "cell_type": "markdown",
387 "metadata": {},
388 "source": [
389 "If an expression contains more than one variable, you can specify a value for each of them and they will be substituted in alphabetic order. You can also specify a value only for some of the variables."
390 ]
391 },
392 {
393 "cell_type": "code",
394 "execution_count": 32,
395 "metadata": {},
396 "outputs": [
397 {
398 "name": "stdout",
399 "output_type": "stream",
400 "text": [
401 "-2 == 0\n",
402 "3*y == 2\n"
403 ]
404 }
405 ],
406 "source": [
407 "var('y','z')\n",
408 "\n",
409 "f = y*z^2 - y == z\n",
410 "print(f(2, 0))\n",
411 "print(f(z = 2))"
412 ]
413 },
414 {
415 "cell_type": "markdown",
416 "metadata": {},
417 "source": [
418 "## Symbolic computations\n",
419 "\n",
420 "Sage can understand and simplify symbolic expressions such as sums (finite or infinite) and products. In the following cell, we compute the following sums using the [`sum()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.sum) function:\n",
421 "\n",
422 "\\begin{align*}\n",
423 " \\begin{array}{llcc}\n",
424 " (1) & \\sum_{k=0}^nk &=&\\frac{n^2+n}{2}\\\\\n",
425 " (2) & \\sum_{k=0}^nk^4 &=&\\frac{6n^5+15n^4+10n^3-n}{30}\\\\\n",
426 " (3) & \\sum_{k=0}^n\\binom nk &=& 2^n\\\\\n",
427 " (4) & \\sum_{k=0}^\\infty \\frac1{k^2} &=& \\frac{\\pi^2}{6}\n",
428 " \\end{array}\n",
429 "\\end{align*}\n",
430 "Recall that $\\binom nk=\\frac{n!}{k!(n-k)!}$"
431 ]
432 },
433 {
434 "cell_type": "code",
435 "execution_count": 41,
436 "metadata": {},
437 "outputs": [
438 {
439 "name": "stdout",
440 "output_type": "stream",
441 "text": [
442 "(1) 1/2*n^2 + 1/2*n\n",
443 "(2) 1/5*n^5 + 1/2*n^4 + 1/3*n^3 - 1/30*n\n",
444 "(3) 2^n\n",
445 "(4) 1/6*pi^2\n"
446 ]
447 }
448 ],
449 "source": [
450 "var('k', 'n') # Remember to declare all variables\n",
451 "\n",
452 "s = []\n",
453 "s.append( sum(k, k, 0, n) )\n",
454 "s.append( sum(k^4, k, 0, n) )\n",
455 "s.append( sum(binomial(n,k), k, 0, n) )\n",
456 "s.append( sum(1/k^2, k, 1, infinity) )\n",
457 "\n",
458 "for i in range(len(s)):\n",
459 " print(\"({}) {}\".format(i+1, s[i]))"
460 ]
461 },
462 {
463 "cell_type": "markdown",
464 "metadata": {},
465 "source": [
466 "An alternative notation is `expression.sum(k, a, b)`. There is an analogous [`prod()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.prod) for products."
467 ]
468 },
469 {
470 "cell_type": "code",
471 "execution_count": 43,
472 "metadata": {},
473 "outputs": [
474 {
475 "data": {
476 "text/plain": [
477 "factorial(n)^2"
478 ]
479 },
480 "execution_count": 43,
481 "metadata": {},
482 "output_type": "execute_result"
483 }
484 ],
485 "source": [
486 "(x^2).prod(x, 1, n)"
487 ]
488 },
489 {
490 "cell_type": "markdown",
491 "metadata": {},
492 "source": [
493 "Sometimes Sage tries to keep an expression in its original form without expanding out sums and products. To change this behavior you can use the [`expand()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.expand) function:"
494 ]
495 },
496 {
497 "cell_type": "code",
498 "execution_count": 44,
499 "metadata": {},
500 "outputs": [
501 {
502 "name": "stdout",
503 "output_type": "stream",
504 "text": [
505 "(x + 1)^2 - (x - 1)^2\n",
506 "4*x\n"
507 ]
508 }
509 ],
510 "source": [
511 "f = (x+1)^2 - (x-1)^2\n",
512 "print(f)\n",
513 "print(f.expand())"
514 ]
515 },
516 {
517 "cell_type": "markdown",
518 "metadata": {},
519 "source": [
520 "### The Symbolic Ring\n",
521 "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html)]\n",
522 "\n",
523 "The symbolic expressions that we have seen so far live in a ring called *symbolic ring* and denoted by `SR` in Sage. This ring works like the ring `ZZ` of integers or `RR` of reals numbers. In particular, you can define matrices and other objects using it as a \"basis\"."
524 ]
525 },
526 {
527 "cell_type": "code",
528 "execution_count": 50,
529 "metadata": {},
530 "outputs": [
531 {
532 "name": "stdout",
533 "output_type": "stream",
534 "text": [
535 "-b*c + a*d\n",
536 "[(-a, 2)]\n"
537 ]
538 }
539 ],
540 "source": [
541 "var('a', 'b', 'c', 'd')\n",
542 "\n",
543 "M = matrix([[a,b], [c,d]])\n",
544 "print(M.determinant())\n",
545 "\n",
546 "polring.<x> = SR[]\n",
547 "f = x^2 + 2*a*x + a^2\n",
548 "print(f.roots())"
549 ]
550 },
551 {
552 "cell_type": "markdown",
553 "metadata": {},
554 "source": [
555 "**Exercise.** Compute the eigenvalues of the matrix\n",
556 "\\begin{align*}\n",
557 "\\begin{pmatrix}\n",
558 "\\cos \\alpha & \\sin \\alpha\\\\\n",
559 "-\\sin\\alpha & \\cos \\alpha\n",
560 "\\end{pmatrix}\n",
561 "\\end{align*}"
562 ]
563 },
564 {
565 "cell_type": "code",
566 "execution_count": 55,
567 "metadata": {},
568 "outputs": [
569 {
570 "name": "stdout",
571 "output_type": "stream",
572 "text": [
573 "-I\n"
574 ]
575 }
576 ],
577 "source": [
578 "var('a')\n",
579 "M = matrix([[cos(a), sin(a)], [-sin(a), cos(a)]])\n",
580 "M.eigenvalues()\n",
581 "lam = M.eigenvalues()[0]\n",
582 "print(lam(pi/2))"
583 ]
584 },
585 {
586 "cell_type": "markdown",
587 "metadata": {},
588 "source": [
589 "# Calculus\n",
590 "**Reference:** [[4](https://doc.sagemath.org/html/en/reference/calculus/index.html)] for an overview, but most functions are described in [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]"
591 ]
592 },
593 {
594 "cell_type": "markdown",
595 "metadata": {},
596 "source": [
597 "## Limits and series\n",
598 "\n",
599 "**References:** [[5](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/calculus.html#sage.calculus.calculus.limit)] for limits, [[6](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.series)] for series\n",
600 "\n",
601 "You can compute limits"
602 ]
603 },
604 {
605 "cell_type": "code",
606 "execution_count": 59,
607 "metadata": {},
608 "outputs": [
609 {
610 "name": "stdout",
611 "output_type": "stream",
612 "text": [
613 "1\n",
614 "+Infinity\n"
615 ]
616 }
617 ],
618 "source": [
619 "var('x')\n",
620 "f = sin(x)/x\n",
621 "#print(f(0)) # This one gives an error\n",
622 "print( f.limit(x=0) )\n",
623 "\n",
624 "print( (e^(-x)).limit(x=-infinity) )"
625 ]
626 },
627 {
628 "cell_type": "markdown",
629 "metadata": {},
630 "source": [
631 "**Exercise.** Compute the constant $e$ using a limit."
632 ]
633 },
634 {
635 "cell_type": "code",
636 "execution_count": 62,
637 "metadata": {},
638 "outputs": [
639 {
640 "data": {
641 "text/plain": [
642 "e^x"
643 ]
644 },
645 "execution_count": 62,
646 "metadata": {},
647 "output_type": "execute_result"
648 }
649 ],
650 "source": [
651 "expression = (1+x/n)^n\n",
652 "expression.limit(n=infinity)"
653 ]
654 },
655 {
656 "cell_type": "markdown",
657 "metadata": {},
658 "source": [
659 "You can also specify a direction for the limit. If you don't, Sage assumes that you want to take a two-sided limit."
660 ]
661 },
662 {
663 "cell_type": "code",
664 "execution_count": 63,
665 "metadata": {},
666 "outputs": [
667 {
668 "name": "stdout",
669 "output_type": "stream",
670 "text": [
671 "und\n",
672 "1\n",
673 "-1\n"
674 ]
675 },
676 {
677 "data": {
678 "image/png": "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p6deUwKGsVKpVIyIF7Ks/3dEFg7y834VCoViRCglAOBIVMqyrN+/xmoNpUKlUnm1mrE9PT1xwgknxPbt26NYLB72Mav1oQ99KDo6Ogb9OI5VG48Lx3rdm88oXX75P2Lt2snx5JNPxjve8Y4BP96bDYf/h2+VYw3X543h+LsaymMd6uOiVCqVooozSjW99HawGz+QYrE4JA/sESNGDMlxHGtgeFw41puNHr0rIiLGjBnjseFYBzTcnjeG6+8qr4+Lg51Jet2wfTP3lVde6VhH0LGGynD9/zccjzXU6ygNx/+Hw/lYQ2mo7tdw/V0d6Y+Lml56+3+quoGenp4olUpRqVSGtCzJN48LUv71X3dFW9vxsX379njnO99Z7+mQI543OJDDeFwUqhk0ZGeUGhoa4pprromGhoahOiRHAI8LUt72thERER4b7MfzBgcyWI+LITujBHAoLr64J+6+21kDYNDk64wSAMCRRigBACQIJQCABKEE5NJQLw8AcCCDGkrf+MY3YtasWTF69Og49thjq9ony7JYtmxZjB8/Po455pg488wz44knnhjMaTLEnn/++Zg7d26USqUolUoxd+7c+Pvf/97vPvPnz49CodDnMmPGjKGZMDCkbr755pg0aVKMGjUqpk2bFg899FBy7MaNG/d7bigUCvHUU08N4YwZCg8++GDMmTMnxo8fH4VCIe69996D7rNp06aYNm1ajBo1Kt797nfHypUrD/m4gxpKe/fujQsvvDCuuOKKqvf59re/HTfccEOsWLEiOjo6oqmpKc4+++x44YUXBnGmDKVLLrkkOjs7Y926dbFu3bro7OyMuXPnHnS/c889N3bs2NF7Wbt27RDMFhhKd999dyxatCi++tWvxpYtW+L000+P2bNnR1dXV7/7bdu2rc/zw3vf+94hmjFD5cUXX4wPfOADsWLFiqrGP/PMM3HeeefF6aefHlu2bImvfOUrcfXVV0dbW9uhHTjLslovB3XbbbdlpVLpoONeffXVrKmpKfvWt77Vu+2ll17KSqVStnLlymoORc49+eSTWURkmzdv7t3W3t6eRUT21FNPJfebN29edv755w/BDMmLf/u3ShYRWaVSqfdUGEKnnnpqtnDhwj7bpkyZkn35y18+4PgNGzZkEZE9//zzQzA78iIistWrV/c75otf/GI2ZcqUPtsuv/zybMaMGb03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\n",
679 "text/plain": [
680 "Graphics object consisting of 1 graphics primitive"
681 ]
682 },
683 "execution_count": 63,
684 "metadata": {},
685 "output_type": "execute_result"
686 }
687 ],
688 "source": [
689 "f = abs(x)/x # 1 if x>0, -1 if x<0\n",
690 "print( f.limit(x=0) ) # undefined\n",
691 "print( f.limit(x=0, dir=\"+\") )\n",
692 "print( f.limit(x=0, dir=\"-\") )\n",
693 "plot(f)"
694 ]
695 },
696 {
697 "cell_type": "code",
698 "execution_count": 71,
699 "metadata": {},
700 "outputs": [
701 {
702 "name": "stdout",
703 "output_type": "stream",
704 "text": [
705 "+Infinity\n",
706 "+Infinity\n",
707 "+Infinity\n"
708 ]
709 },
710 {
711 "data": {
712 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkwAAAGECAYAAADEN3+HAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAjaElEQVR4nO3dfZBU1Z3G8efy1swMdMMwOi+8yLiiSQviW4uQGKAqQpBAdjGuhF0X/whl6bgGE8qSmCoGV6DUhLgbuiq70SxYWddU4q6b3WhENwTWBXFgYVVGS9ARRsKAyNANA/TAcPePsz0w0DO3p+e+dDffT9Wtfrv3nDPY9jzzO6fvtWzbFgAAALrXL+gBAAAA5DsCEwAAgAMCEwAAgAMCEwAAgAMCEwAAgAMCEwAAgAMCEwAAgAMCE4C8ZBlhy7KsoMcCAAP6cCxnvASQk127pPHjpc2bpcmTM++TSCQUiUSUSCQyvv7aa9LXviY1N0ujRnk4WADFLqs/yqgwAfBde7u5DYVyb2PQoK5tAYCXCEwAfJcOOenQkwsCEwA/EZgA+I7ABKDQEJgA9NqmTZs0Z84c1dTUyLIsvfzyy11et21b9fX1qqmpUUlJiaZNm6Zdu3Z1vu5mYEqlcm8DALJFYALQa21tbZo4caLWrFmT8fWnnnpKq1ev1po1a9TQ0KCqqirdfvvtOnbsmKRzIYcKE4BC0ZdvyQG4RM2aNUuzZs3K+Jpt23rmmWf02GOPad68eZKkdevWqbKyUi+88ILuu+++jBWmVCql1HnlomQy2eMYCEwA/ESFCYCrmpqa1NLSohkzZnQ+FwqFNHXqVG3evFlS5im5VatWKRKJdG6jR4/usZ/0N+wITAD8QGAC4KqWlhZJUmVlZZfnKysrO1/LdFqBpUuXKpFIdG7Nzc099kOFCYCfmJID4IkLT9Bt23bnc+mQM3DguddDoZBCvTgxE4u+AfiJChMAV1VVVUk6V2lKO3ToUGfVKZWSBgyQ+vXhE4gKEwA/EZgAuKq2tlZVVVV6/fXXO59rb2/Xxo0bNWXKlP9/3LdvyEkEJgD+YkoOQK8dP35ce/bs6Xzc1NSknTt3qry8XGPGjNHixYu1cuVKjRs3TuPGjdPKlStVWlqqBQsWSHInMPXvL1kWgQmAPwhMAHpt27Ztmj59eufj7373u5KkhQsXau3atXrkkUd08uRJPfDAA2ptbdWkSZO0fv16DR06VJI7gcmyzKJx1jAB8AOBCUCvTZs2TbZtd/u6ZVmqr69XfX19xtfdCEySaYMKEwA/sIYJgO8ITAAKDYEJgO9Sqa7nYMoVgQmAXwhMAHxHhQlAoSEwAfCdm4GJRd8A/EBgAuA7twJTKESFCYA/CEwAfMeUHIBCQ2AC4LtUisAEoLAQmAD47tQpqaSk7+0MGmTaAgCvEZgA+O7kSWnw4L63M3gwi74B+IPABMB3p065E5hKSqgwAfAHgQmA73oKTPF4XNFoVLFYzLGdwYMJTAD8QWAC4LueAlNdXZ0aGxvV0NDg2A6BCYBfCEwAfOfWom8CEwC/EJgA+M6tNUwEJgB+ITAB8B2BCUChITAB8J2bgenkyb63AwBOCEwAfGXbVJgAFB4CEwBfnT5tQhPnYQJQSAhMAHyVDjhuVphsu+9tAUBPCEwAfOV2YLJtU7UCAC8RmAD4yu3AdH6bAOAVAhMAXxGYABQiAhMAXxGYABQiAhMAXxGYABQiAhMAX6XDjRvXkku3QWAC4DUCEwBfUWECUIgITAB85UVg4vIoALxGYALgK6fAFI/HFY1GFYvFHNuiwgTALwQmAL5yCkx1dXVqbGxUQ0ODY1sEJgB+ITAB8NXJk1K/ftKAAX1vi8AEwC8EJgC+OnXKBB3L6ntbBCYAfiEwAfBVOjC5YcAAU60iMAHwGoEJgK/cDEyWZc7FRGAC4DUCEwBfuRmYJNPWiRPutQcAmRCYAPiqrU0qLXWvvdJSAhMA7xGYAPjqxAmprMy99srKCEwAvEdgAuArtytMZWWmTQDwEoEJgK/crjAxJQfADwQmAL6iwgSgEBGYAPjKiwoTgQmA1whMAHzlRYWJKTkAXiMwAfCVF9+So8IEwGsEJgC+4jxMAAoRgQmAr06cYNE3gMJDYALgq7Y2Fn0DKDwEJgC+OX1aOnOm5wpTPB5XNBpVLBbLqk0WfQPwA4EJgG/SlaCeKkx1dXVqbGxUQ0NDVm2WlZkL+nZ0uDBAAOgGgQmAb9KVILcXfUvSyZPutQkAFyIwAfBNNhWm3kq3xTomAF4iMAHwjZcVJgITAC8RmAD4xssKEwu/AXiJwATAN15UmJiSA+AHAhMA36RDjRdTclSYAHiJwATAN+lQw6JvAIWGwATAN8ePm1sWfQMoNAQmAL5JJqUhQ6R+Ln7yUGEC4AcCEwDfHDsmhcPuttm/v1RScq56BQBeIDAB8E0yKQ0d6n674bBpGwC8QmAC4BsvKkySCWEEJgBeIjAB8I2XFaZjx9xvFwDSCEwAfONVhYkpOQBeIzAB8M2xY95UmJiSA+A1AhMA3yST3lWYmJID4CUCEwDfZFNhisfjikajisViWbfLlBwArxGYAPgmmwpTXV2dGhsb1dDQkHW7TMkB8BqBCYBvvFrDxJQcAK8RmAD4IpWS2tv5lhyAwkRgAuCLdAXIq2/JnTolnT7tftsAIBGYAPgkXQHyqsIkMS0HwDsEJgC+8LLClA5MTMsB8AqBCYAvvKwwpUMYgQmAVwhMAHxBhQlAISMwAfDF0aPmNhJxv20CEwCvEZgA+KK1VRo4UCorc7/tdAhLJNxvGwAkAhMAn7S2SsOHS5blfttlZSaMHTniftsAIBGYAPgkHZi8YFmm7dZWb9oHAAITAF94GZgkqbycChMA7xCYALiuvr5elmV12V544VVPAxMVJgBeGhD0AAAUp2uvvVZvvPFG5+N588o9D0xUmAB4hcAEwBMDBgxQVVVV5+Pjx3uekkulUkqlUp2Pk708R0B5ubR3b6+HCQBZYUoOgCd2796tmpoa1dbWav78+frsszMqL+9+/1WrVikSiXRuo0eP7lV/VJgAeInABMB1kyZN0vPPP6/XXntNP/vZz9TS0qKDB1MaNKit22OWLl2qRCLRuTU3N/eqz/Jy1jAB8A5TcgBcN2vWrM77EyZM0E03TVZ5eZnee+93kr6W8ZhQKKRQKJRzn1SYAHiJChMAz7W3m9N7Hz3a5Fkf5eXSqVNmAwC3EZgAeO7gwXZJUk1NiWd9pBeUMy0HwAsEJgCuW7JkiTZu3KimpiZt3bpVDzzwfUnS3XfP8KzP9IJypuUAeIE1TABc9+mnn+pb3/qWDh8+rMsuu0xXXPGgJGnixBrP+kxXmAhMALxAYALguhdffLHL4+eek7ZskUaM8K7Pyy4zt5995l0fAC5dTMkB8NyhQ2bKbOBA7/ooL5f69zd9AYDbCEwAPPfZZ9Lll3vbR79+pspEYALgBQITAM8dOuR9YJJMHwQmAF4gMAHwHIEJQKEjMAHw3KFD5xZle4nABMArBCYAnvNjDZNEYALgHQITAE/ZNlNyAAofgQmAp44elc6c8S8wff656Q8A3ERgAuCpdMXHr8AkcfJKAO4jMAHwVDq8+LXoW2JaDoD7CEwAPHXggLmtrMxu/3g8rmg0qlgs1uu+0n0cPNjrQwGgRwQmAJ7av18qKTl3cVwndXV1amxsVENDQ6/7qqoyt+mQBgBuITAB8NT+/dLIkZJled/X4MHmAr+ffup9XwAuLQQmAJ5KBya/jBpl+gQANxGYAHjK78A0ciQVJgDuIzAB8BQVJgDFgMAEwDO2HUyFicAEwG0EJgCeOXJEOnXK/wrTwYNSe7t/fQIofgQmAJ5JV3r8rjBJnFoAgLsITAA8s3evuR0zxr8+R40yt83N/vUJoPgRmAB45pNPpFBIqq72r8+xY81tU5N/fQIofgQmAJ5papKuuELq5+MnTVmZuUTKxx/71yeA4kdgAuCZpiapttb/fmtrqTABcBeBCYBnggpMV15JhQmAuwhMADxh21SYABQPAhMAT7S2SslkcBWm/fulVMr/vgEUJwITAE989JG5vfJK//uurTUVrvRpDQCgrwhMADzxwQfm9ppr/O/7qqvM7Ycf+t83gOJEYALgiQ8+MCeRHDKkd8fF43FFo1HFYrGc+073+/77OTcBAF1Ytm3nemzOBwIoft/8pnT0qPTGG7kdn0wmFYlElEgkFA6He338LbdI48dLP/95bv0DuGRY2exEhQmAJz74QPrCF4Lr/4tflBobg+sfQHEhMAFwXUeHtHt3sIEpGjVTcrkX0QHgHAITANc1NUnt7cEs+E774hfNaQ3++MfgxgCgeBCYALjuf//X3F53XXBjiEbNLdNyANxAYALguh07pOpqcxHcoNTWSqGQtGtXcGMAUDwITABct2OHdMMNwY6hf39T4dqxI9hxACgOBCYArtuxQ7r++qBHId18s7RtW9CjAFAMCEwAXHXwoHTgQPAVJkm66SbzTbnjx4MeCYBCR2AC4Kr0FFg+BKabbzanFdi5M+iRACh0BCYArtq2TYpEzKLroEWj0uDBTMsB6DsCEwBX/dd/SV/6ktQvDz5dBg40a6kaGoIeCYBClwcfaQCKxZkz0ubN0pe/HPRIzpkyxYQ4zvgNoC8ITABc8847ZoH1bbcFPZJzpk2TmpulTz4JeiQAChmBCYBr3nxTGjTILLbOF7fdJlmW9Ic/BD0SAIWMwATANZs2SbGYWWidL4YNM+uYNm4MeiQAChmBCYArTp+W3nhDmjGjb+3E43FFo1HFYjF3BiYzLff737OOCUDuLDv3TxA+egB02rRJmjrVfCPNjSm5ZDKpSCSiRCKhcDjcp7bWr5dmzjRrrCZM6PvYABQVK5udqDABcMUrr0iXXy7deGPQI7nY1KnS0KHSb34T9EgAFCoCEwBXvPKKNGtWfpx/6UKhkKkwEZgA5CoPP9oAFJoPPpDefVeaOzfokXRv7lzp7bfNde4AoLcITAD67IUXzOVQ7rgj6JF07447zJm/f/WroEcCoBARmAD0iW1L//RP0p135tfpBC40YoQ0e7a0bl3QIwFQiAhMAPrk7beljz+WFiwIeiTOFi6U/ud/zPQhAPQGgQlAnzz7rDRypDnXUb674w5TaaLKBKC3CEwAcvb559IvfiHdf7/Uv3/Qo3E2aJD0V38l/eM/Sm1tQY8GQCEhMAHI2XPPSWfPSosWBT2S7P31X0tHj1JlAtA7BCYAOTl5Uvrxj6W//EtzwspCUVtrFqivXi2dORP0aAAUCgITgJz8/d9Ln30mff/7QY+k95YulT76SFq7NuiRACgUXEsOQK8lEtLVV5uv6f/859704ea15DJZsEDauFHavVsqLXW9eQCFg2vJAfDG3/yNdPy49PjjQY8kd088YSpkq1cHPRIAhYDABKBX3n1X+tu/lR57TBo1KujR5O7KK6XFi01w+vDDoEcDIN8xJQcga+3t0qRJZrH0tm3morZe8XpKTpJOnJAmTpSqq6UNGwrj1AgAXMeUHAB3Pfqo9N575iv5XoYlv5SWmhNvvvmmqTQBQHcITACy8otfmNMIrF4t3Xijd/3E43FFo1HFYjHvOjnP1KnS8uVme/VVX7oEUICYkgPgaNMmaeZM6e67zVmyrawK2H3jx5Rc2tmz0je+If3hD+ZnveEGT7sDkF+YkgPQd//93+YabFOmSD/9qT9hyW/9+kn//M/SF74gzZhhLtALAOcjMAHo1n/+p/S1r0k33yz9+79LgwcHPSLvDBkivfaa+fbc9OkmKAJAGoEJwEVs21STZs6UJk+W/uM/Lo2TO5aXS2+8YdZoffWr5lp5ua9aAFBMCEwAujh82KxVuv9+6YEHpFdeMdWXS8XQoeZnvuce6dvflhYuNCfpBHBpIzABkGQqKb/+tXTttWYq7pe/lP7u76QBA4Iemf9KSqR/+AfzzcB/+Rfzb/Lyy1SbgEsZgQmANm+Wvvxl6a67pFtvlXbtkv78z4MeVfD+4i+kd96Rxo+X/uzPzHquhoagRwUgCAQm4BLV0SH9279JX/mK9KUvSW1t0vr15rmqqqBHlz+uvNKs4frXf5X27ZNuucVcdPi118zpCABcGghMwCXmww+lZcukq6+W/vRPTXD69a+l7dul228PenT5ybLMv9V775lpuv37TbXpmmukp56S9u4NeoQAvMaJK4Eid/asCUO/+52pHm3fbhY233mndN99ZgouH/l54sresm0zjRmPm8rTqVPm24Rz55ogNXFicZ6vCihSWf3fSmACikwqJe3YYX6hb9lizl59+LAUDpsK0vz5ZkqppCTokfYsnwPT+Y4dk37zG+lXvzKnJGhrkyorzbmcpkwx23XXSQMHBj1SAN0gMAHF7OxZMxX03ntmkXb6trFRam83J5mMxaTbbjNVj1tvLaxf2oUSmM7X3m5OePm735kL+m7bdu6/xfjxJjhdd500YYKZEq2pMWcZBxAoAhNQyFIp6eBBqaXFLDb+5BMTkD75xGxNTaaaIZnq0bXXml/KEyaYcDRxojRoUIA/QB8VYmC6UCplLrOydav5tt0775hgm0qZ10MhqbbWLCz/kz8xt2PHStXVZuF9ZWVxn10dyBMEJiAf2LYJNkePZt6OHDHBKL0dOmRuE4mu7ZSVmV+uV1xhfqnW1p4LSSNHFt+amWIITJmcOSPt2WO2jz8220cfnbt/6lTX/YcNM+EpvVVWmjOSDxt2bhs+vOvjIUOK7/0AeIjABFzo7FkzRZJKme38+06P0/dPnjQBKNvt2DHzTbRMBg0yv+wqK812+eXn7p+/jRljfkleSr8EizUw9eTsWemzz85VFi/c0s+3tpqwffJk5nb69zdVx7Iys5WWZr7N9FxJiXlfhkLm9sL7Pb3Wv7+v/1yAW4IPTLYtnThx7uy4tp3d/b6+fqnva9vmg/fs2a73Mz32cp9sj+voMH91nznT/f2eXst2v1TK3ObKsswvh8GDz/2yyWYLh7v+9X/+xnRL9y7FwNRbqVTmqmVrq6lQnjhhQnv69vz7mW5PnOjbePr16xqgBgwwW//+XW97e7+75/r1M/9f9uvX8+bHPpZ18SZlfj7X19xuz62+0o/TLnzOy9e628eyenX9y6wCU04XPbAsy0pcOF+Qwdmz5q9nFKb0h8OFHxKZHjvtk17YmulDJv1B2K/fufvpD8T0h2NJSdcPygs/QM9/3F1bmf4yHjjQ3Gb6i/nC1/v3d7fC095uNhipVEqp9OIeSceOHZNkghO6V1Jiturqvrd19uy5aurp07ndP336XDW2o+PcHy3n32bzXHt71+cv3K+7P84y/VGWad9s9kPhKiuT/vjH7PaNRCJhScdshwpSThUmy7LCkpwTEwAAQP6L2Lbd419nuQYmK5FIZJW/k8mkRo8erebmZl/K6rFYTA0+XeyJvvqmmN8bfvdXDH1dWGE6cOCAbrnlFjU2NmrkyJGu93ehYvg3vJT6KubPD/rqm96+NyKRSERZVJhympJzajSTcDjsy5u6f//+vq13oC93FON7w+/+irUvSRo6dGjRvT/oyz3F+PlBX+7I9r3hVFlKK7pTptXV1dFXAfXlJ79/rmL9b8b7g77yoS+/Feu/Y7H25QXPTyvAN13QHd4b6Mmnn37aWVYfNWpU0MNBnuHzA93J4b2R1dd5PK8whUIhLVu2TKFQyOuuUGB4b6An6fcF7w9kwucHuuPVe4MTVwLIS1QQAPgkPypMAAAAhY7ABAAA4IDABAAA4IDABAAA4MDTwLRixQpNmTJFpaWlGjZsWMZ99u3bpzlz5qisrEwVFRV66KGH1M4Fti5JY8eOlWVZXbZHH3006GEByBP19fUXfUZUVVUFPSwEZNOmTZozZ45qampkWZZefvnlLq/btq36+nrV1NSopKRE06ZN065du3Luz9PA1N7errvuukv3339/xtc7Ojo0e/ZstbW16c0339SLL76ol156Sd/73ve8HBby2OOPP64DBw50bj/4wQ+CHhKAPHLttdd2+Yx49913gx4SAtLW1qaJEydqzZo1GV9/6qmntHr1aq1Zs0YNDQ2qqqrS7bff3nlh797K6dIo2Vq+fLkkae3atRlfX79+vRobG9Xc3KyamhpJ0o9+9CPde++9WrFiBV8lvgQNHTqUvxgBdGvAgAF8RkCSNGvWLM2aNSvja7Zt65lnntFjjz2mefPmSZLWrVunyspKvfDCC7rvvvt63V+ga5i2bNmi8ePHd4YlSZo5c6ZSqZS2b98e4MgQlCeffFIjRozQ9ddfrxUrVjA9C6CL3bt3q6amRrW1tZo/f74+/vjjoIeEPNTU1KSWlhbNmDGj87lQKKSpU6dq8+bNObXpaYXJSUtLiyorK7s8N3z4cA0aNEgtLS0BjQpB+c53vqMbb7xRw4cP19tvv62lS5eqqalJzz77bNBDA5AHJk2apOeff15XX321Dh48qCeeeEJTpkzRrl27NGLEiKCHhzySzhAXZozKykrt3bs3pzZ7XWGyLKvesiz7woV352/btm3rTXsXPWfbdsbnUXgyLdLs7v3y8MMPa+rUqbruuuv07W9/Wz/96U/13HPP6fPPPw/4pwCQD2bNmqU777xTEyZM0Fe/+lX99re/lWSmWoBMLswSfckXuVSY1kh68f3333+/ux3Gjh2bVUNVVVXaunVrl+daW1t1+vTpi1IhCtODDz6o+fPn97hPd++XW2+9VZK0Z88e/nq8hMTjccXjcXV0dAQ9FOS5srIyTZgwQbt37w56KMgz6XVuLS0tqq6u7nz+0KFDOeeLXgcm27YPSzqcU28XmDx5slasWKEDBw50/kDr169XKBTSTTfd5EYXCFhFRYUqKipyOnbHjh2S1OXNjuJXV1enurq6zmvJAd1JpVJ6//33ddtttwU9FOSZ2tpaVVVV6fXXX9cNN9wgyXxzf+PGjXryySdzatPTNUz79u3TkSNHtG/fPnV0dGjnzp2SpKuuukpDhgzRjBkzFI1Gdc899+jpp5/WkSNHtGTJEi1atIhvyF1itmzZorfeekvTp09XJBJRQ0ODHn74Yc2dO1djxowJengA8sCSJUs0Z84cjRkzRocOHdITTzyhZDKphQsXBj00BOD48ePas2dP5+Ompibt3LlT5eXlGjNmjBYvXqyVK1dq3LhxGjdunFauXKnS0lItWLAgtw5t2851c7Rw4UJb0kXbhg0bOvfZu3evPXv2bLukpMQuLy+3H3zwQfvUqVPZNI8isn37dnvSpEl2JBKxBw8ebF9zzTX2smXL7La2tqCHhoAkEglbkp1IJIIeCvLE3XffbVdXV9sDBw60a2pq7Hnz5tm7du0KelgIyIYNGzJmjIULF9q2bdtnz561ly1bZldVVdmhUMj+yle+Yr/77ruZmsoq91i2beca7nI+EACcpKfkEokEFWcAXspqFTjXkgMAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAKQV+LxuKLRqGKxWNBDAYBOlm3buR6b84EA4CSZTCoSiSiRSCgcDgc9HADFy8pmJypMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAPJKPB5XNBpVLBYLeigA0MmybTvXY3M+EACcJJNJRSIRJRIJhcPhoIcDoHhZ2exEhQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQlAXonH44pGo4rFYkEPBQA6WbZt53pszgcCgJNkMqlIJKJEIqFwOBz0cAAULyubnagwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAXDd2LFjZVlWl+3RRx8NelgAkLMBQQ8AQHF6/PHHtWjRos7HQ4YMCXA0ANA3BCYAnhg6dKiqqqqy3j+VSimVSnU+TiaTXgwLAHLClBwATzz55JMaMWKErr/+eq1YsULt7e097r9q1SpFIpHObfTo0T6NFACcWbZt53pszgcCKG4//vGPdeONN2r48OF6++23tXTpUn3jG9/Qs88+2+0xmSpMo0ePViKRUDgc9mPYAC5NVlY7EZgAZKO+vl7Lly/vcZ+GhgbdfPPNFz3/0ksv6Zvf/KYOHz6sESNGZNVfMplUJBIhMAHwGoEJgHsOHz6sw4cP97jP2LFjNXjw4Iue379/v0aNGqW33npLkyZNyqo/AhMAn2QVmFj0DSArFRUVqqioyOnYHTt2SJKqq6vdHBIA+IbABMBVW7Zs0VtvvaXp06crEomooaFBDz/8sObOnasxY8YEPTwAyAmBCYCrQqGQfvnLX2r58uVKpVK64oortGjRIj3yyCNBDw0AcsYaJgB5iTVMAHyS1RomzsMEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEIK/E43FFo1HFYrGghwIAnbiWHIC8xLXkAPiEa8kBAAC4gcAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEIK/E43FFo1HFYrGghwIAnSzbtnM9NucDAcBJMplUJBJRIpFQOBwOejgAipeVzU5UmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmADklXg8rmg0qlgsFvRQAKCTZdt2rsfmfCAAOEkmk4pEIkokEgqHw0EPB0DxsrLZiQoTAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITgLwSj8cVjUYVi8WCHgoAdLJs28712JwPBAAnyWRSkUhEiURC4XA46OEAKF5WNjtRYQIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYALQKytWrNCUKVNUWlqqYcOGZdxn3759mjNnjsrKylRRUaGHHnpI7e3t/g4UAFw0IOgBACgs7e3tuuuuuzR58mQ999xzF73e0dGh2bNn67LLLtObb76pzz//XAsXLpRt2/rJT34SwIgBoO8s27ZzPTbnAwEUvrVr12rx4sU6evRol+dfffVVff3rX1dzc7NqamokSS+++KLuvfdeHTp0SOFwOKv2k8mkIpGIEolE1scAQA6sbHZiSg6Aq7Zs2aLx48d3hiVJmjlzplKplLZv397tcalUSslksssGAPmCwATAVS0tLaqsrOzy3PDhwzVo0CC1tLR0e9yqVasUiUQ6t9GjR3s9VADIGoEJgOrr62VZVo/btm3bsm7Psi6ucNu2nfH5tKVLlyqRSHRuzc3NOf0sAOAFFn0D0IMPPqj58+f3uM/YsWOzaquqqkpbt27t8lxra6tOnz59UeXpfKFQSKFQKKs+AMBvBCYAqqioUEVFhSttTZ48WStWrNCBAwdUXV0tSVq/fr1CoZBuuukmV/oAAL8RmAD0yr59+3TkyBHt27dPHR0d2rlzpyTpqquu0pAhQzRjxgxFo1Hdc889evrpp3XkyBEtWbJEixYt4ttuAAoWpxUA0Cv33nuv1q1bd9HzGzZs0LRp0ySZUPXAAw/o97//vUpKSrRgwQL98Ic/7NWUG6cVAOCTrE4rQGACkJcITAB84nlgAgDPWJYVlpSQFLFtm5MyAQgUgQlAXrLMOQiGSjpm80EFIGAEJgAAAAecuBIAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMDB/wEYcmVlzttqbwAAAABJRU5ErkJggg==\n",
713 "text/plain": [
714 "Graphics object consisting of 1 graphics primitive"
715 ]
716 },
717 "execution_count": 71,
718 "metadata": {},
719 "output_type": "execute_result"
720 }
721 ],
722 "source": [
723 "f = 1/x^2\n",
724 "print( f.limit(x=0) )\n",
725 "print( f.limit(x=0, dir=\"+\") )\n",
726 "print( f.limit(x=0, dir=\"-\") )\n",
727 "plot(f, (x, -10, 10), ymax = 10, ymin = -10)"
728 ]
729 },
730 {
731 "cell_type": "markdown",
732 "metadata": {},
733 "source": [
734 "There is also the alternative notation `limit(f, x, dir)` which does the same as `f.limit(x, dir)`."
735 ]
736 },
737 {
738 "cell_type": "markdown",
739 "metadata": {},
740 "source": [
741 "You can also compute series expansions up to any order. **Watch out:** the notation uses `==` instead of `=` as `limit()` does."
742 ]
743 },
744 {
745 "cell_type": "code",
746 "execution_count": 81,
747 "metadata": {},
748 "outputs": [
749 {
750 "name": "stdout",
751 "output_type": "stream",
752 "text": [
753 "1*(x - 1) + (-1/2)*(x - 1)^2 + 1/3*(x - 1)^3 + Order((x - 1)^4)\n",
754 "1*x^2 + (-5/6)*x^4 + Order(x^6)\n"
755 ]
756 }
757 ],
758 "source": [
759 "f = e^x\n",
760 "g = sin(x) - 2*cos(x)\n",
761 "h = log(x)\n",
762 "\n",
763 "#print(f.series(x==0, 5))\n",
764 "#print(g.series(x==0, 7))\n",
765 "print(h.series(x==1, 4))\n",
766 "\n",
767 "print((sin(x)^2*cos(x)).series(x==0, 6))"
768 ]
769 },
770 {
771 "cell_type": "markdown",
772 "metadata": {},
773 "source": [
774 "## Derivatives\n",
775 "**References:** [[7](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.derivative)] and [[8](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functional.html#sage.calculus.functional.derivative)] for derivatives, [[9](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functions.html#sage.calculus.functions.jacobian)] for the Jacobian matrix and [[10](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.hessian)] for the Hessian."
776 ]
777 },
778 {
779 "cell_type": "markdown",
780 "metadata": {},
781 "source": [
782 "When computing derivatives, you need to specify with respect to which variables you want to derive, except in case there is only one."
783 ]
784 },
785 {
786 "cell_type": "code",
787 "execution_count": 84,
788 "metadata": {},
789 "outputs": [
790 {
791 "name": "stdout",
792 "output_type": "stream",
793 "text": [
794 "8*y^3\n",
795 "6*x^2 - 1\n"
796 ]
797 }
798 ],
799 "source": [
800 "var('y')\n",
801 "print( (x^2+2*y^4).derivative(y) ) # Alternative: derivative(f, y)\n",
802 "print( (2*x^3-x+2).derivative() )"
803 ]
804 },
805 {
806 "cell_type": "markdown",
807 "metadata": {},
808 "source": [
809 "You can also compute higher order derivatives:"
810 ]
811 },
812 {
813 "cell_type": "code",
814 "execution_count": 85,
815 "metadata": {},
816 "outputs": [
817 {
818 "name": "stdout",
819 "output_type": "stream",
820 "text": [
821 "6*x\n",
822 "84*x^5*y + 10*y^4 + 24*x^2*y\n",
823 "1680*x^3 + 48\n"
824 ]
825 }
826 ],
827 "source": [
828 "print( (x^3).derivative(x, x) ) # Same as (x^3).derivative(x, 2)\n",
829 "\n",
830 "f = x^7*y^2 + x^4*y^2 - 2*x^3 + x^2*y^5 + y + 2\n",
831 "print( f.derivative(x, x, y) ) # Twice in x, once in y\n",
832 "print( f.derivative(x, 4, y, 2) ) # 4 times in x, twice in y"
833 ]
834 },
835 {
836 "cell_type": "markdown",
837 "metadata": {},
838 "source": [
839 "Jacobian and Hessian matrices are also easy to compute:"
840 ]
841 },
842 {
843 "cell_type": "code",
844 "execution_count": 86,
845 "metadata": {},
846 "outputs": [
847 {
848 "name": "stdout",
849 "output_type": "stream",
850 "text": [
851 "[-2*x + 2*y 2*x]\n",
852 "[ 0 3*y^2]\n",
853 "[ y + 1 x + 1] \n",
854 "\n",
855 "[ 2 -4*y + 1]\n",
856 "[ -4*y + 1 -4*x + 6*y]\n"
857 ]
858 }
859 ],
860 "source": [
861 "f = (-x^2 + 2*x*y, y^3, x+y+x*y)\n",
862 "print( jacobian(f, [x,y]), \"\\n\" )\n",
863 "\n",
864 "g = x^2 + x*y + y^3 -2*x*y^2 -3\n",
865 "print( g.hessian() )"
866 ]
867 },
868 {
869 "cell_type": "markdown",
870 "metadata": {},
871 "source": [
872 "*Note:* the notation `f.jacobian([x,y])` is also valid, but only if you specify that `f` is vector by declaring it as `f = vector([...])`."
873 ]
874 },
875 {
876 "cell_type": "markdown",
877 "metadata": {},
878 "source": [
879 "## Integrals\n",
880 "**References:** [[11](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/integration/integral.html)] for symbolic integration and [[12](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html)] for numerical methods.\n",
881 "\n",
882 "You should remember from high school or from your first calculus/analysis course that derivatives are easy, but integrals are hard.\n",
883 "When using a computer software to solve your integrals, you have two choices:\n",
884 "\n",
885 "1. You can try to compute a primitive function exactly, and then (if you are computing a definite integral) substitute the endpoints of your integration interval to get the result. We can call this *symbolic integration*.\n",
886 "2. You can get an *approximated* result with a *numerical method*. This method always gives some kind of result, but it cannot be used to compute indefinite integrals.\n",
887 "\n",
888 "Sage can do both of these things, although people that work in numerical analysis and use often the second method tend to prefer other programs, such as Matlab (or its open-source clone Octave)."
889 ]
890 },
891 {
892 "cell_type": "markdown",
893 "metadata": {},
894 "source": [
895 "### Symbolic integration\n",
896 "\n",
897 "Symbolic integrals work more or less like derivatives. You must specify an integration variable, but the endpoints of the integration interval are optional. If they are not given you get an indefinite integral."
898 ]
899 },
900 {
901 "cell_type": "code",
902 "execution_count": 88,
903 "metadata": {},
904 "outputs": [
905 {
906 "name": "stdout",
907 "output_type": "stream",
908 "text": [
909 "1/2*x^2 - cos(x)\n",
910 "0\n",
911 "1/2*pi^2 + 2\n"
912 ]
913 }
914 ],
915 "source": [
916 "var('a', 'b')\n",
917 "f = x + sin(x)\n",
918 "print( f.integral(x) ) # Alternative: integral(f, x)\n",
919 "print( f.integral(x, -10, 10) )\n",
920 "print( f.integral(x, 0, pi) )"
921 ]
922 },
923 {
924 "cell_type": "markdown",
925 "metadata": {},
926 "source": [
927 "Your endpoints can also be $\\pm\\infty$:"
928 ]
929 },
930 {
931 "cell_type": "code",
932 "execution_count": 89,
933 "metadata": {},
934 "outputs": [
935 {
936 "name": "stdout",
937 "output_type": "stream",
938 "text": [
939 "1\n",
940 "sqrt(pi)\n"
941 ]
942 }
943 ],
944 "source": [
945 "print( integral(e^(-x), x, 0, infinity) )\n",
946 "print( integral(e^(-x^2), x, -infinity, infinity) )"
947 ]
948 },
949 {
950 "cell_type": "markdown",
951 "metadata": {},
952 "source": [
953 "The last function is also an example of an integral that perhaps you might want to compute numerically. In fact:"
954 ]
955 },
956 {
957 "cell_type": "code",
958 "execution_count": 92,
959 "metadata": {},
960 "outputs": [
961 {
962 "name": "stdout",
963 "output_type": "stream",
964 "text": [
965 "1/2*sqrt(pi)*erf(x)\n",
966 "1/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1)\n"
967 ]
968 }
969 ],
970 "source": [
971 "print( integral(e^(-x^2), x) )\n",
972 "print( integral(e^(-x^2), x, 1, 2) )"
973 ]
974 },
975 {
976 "cell_type": "markdown",
977 "metadata": {},
978 "source": [
979 "Here `erf(x)` denotes the [error function](https://en.wikipedia.org/wiki/Error_function)."
980 ]
981 },
982 {
983 "cell_type": "markdown",
984 "metadata": {},
985 "source": [
986 "### Numerical integration\n",
987 "\n",
988 "In order to get an explicit value for the computations above, we can use a *numerical* method.\n",
989 "\n",
990 "The word \"numerical\" does not have much to do with numbers, but it refers to the fact that we are trying to compute explicit results rather than symbolic or algebraic ones. [Numerical analysis](https://en.wikipedia.org/wiki/Numerical_analysis) is the branch of mathematics that studies methods to approximate computations over the real or complex numbers. With these methods there is usually a trade-off between speed and precision.\n",
991 "\n",
992 "The Sage function [`numerical_integral()`](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html#sage.calculus.integration.numerical_integral) takes as a parameter a real-valued one-variable function and the integration endpoints, and it returns both an approximate value for the integral and an error estimate."
993 ]
994 },
995 {
996 "cell_type": "code",
997 "execution_count": 93,
998 "metadata": {},
999 "outputs": [
1000 {
1001 "data": {
1002 "text/plain": [
1003 "(0.13525725794999466, 1.5016572202374808e-15)"
1004 ]
1005 },
1006 "execution_count": 93,
1007 "metadata": {},
1008 "output_type": "execute_result"
1009 }
1010 ],
1011 "source": [
1012 "numerical_integral(e^(-x^2), 1, 2)"
1013 ]
1014 },
1015 {
1016 "cell_type": "markdown",
1017 "metadata": {},
1018 "source": [
1019 "The result above means, in symbols\n",
1020 "\\begin{align*}\n",
1021 "\\int_1^2 e^{-x^2}\\mathrm dx = 0.13525725794999466 \\pm 1.5016572202374808\\times 10^{-15}\n",
1022 "\\end{align*}\n",
1023 "\n",
1024 "There is also a [`monte_carlo_integral()`](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html#sage.calculus.integration.monte_carlo_integral) method for functions with more than one variable."
1025 ]
1026 },
1027 {
1028 "cell_type": "markdown",
1029 "metadata": {},
1030 "source": [
1031 "**Exercise.** Compute the area of the ellipse of equation $y^2+\\left(\\frac x3\\right)^2=1$."
1032 ]
1033 },
1034 {
1035 "cell_type": "markdown",
1036 "metadata": {},
1037 "source": [
1038 "**Solution:** First, rewrite the equation as:\n",
1039 "\\begin{align*}\n",
1040 "y = \\sqrt{1- \\left(\\frac{x}{3}\\right)^2}\n",
1041 "\\end{align*}"
1042 ]
1043 },
1044 {
1045 "cell_type": "code",
1046 "execution_count": 104,
1047 "metadata": {},
1048 "outputs": [
1049 {
1050 "data": {
1051 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkwAAAGECAYAAADEN3+HAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA7hUlEQVR4nO3deXxTVf7/8XdopSDQsFQqS1lkk7KIlrKURUGsoqIoKIgDqMhQxAUYHQVn1NFRxvGnolgWFxYVARVZVAQqIzsoBSoIyI4FaUFQUtZC2/z+OF9AoCUtTXJvktfz8biPQkhuPom1feeccz/H4Xa7BQAAgIKVsLoAAAAAuyMwAQAAeEBgAgAA8IDABAAA4AGBCQAAwAMCEwAAgAcEJgAAAA8ITABsx2FEOhwOh9W1AIAkhV/CY+h0CcCnXC6XnE6nXC6X1aUACA0eP5wxwgQAAOABgQkAAMADAhMAAIAHBCYAAAAPCEwAAAAeEJgAAAA8IDABsI3k5GTFxsYqPj7e6lIA4BwOt7vIbZXowwTAp7Kyss70YYqMjLS6HADBjz5MAAAAxUVgAgAA8IDABAAA4AGBCQAAwAMCEwAAgAcEJgAAAA8ITAAAAB4QmAAAADwgMAEAAHhAYAIAAPCAwAQAAOABgQkAAMADAhMA20hOTlZsbKzi4+OtLgUAzuFwu91FfUyRHwAARZGVlSWn0ymXy6XIyEirywEQ/Bye7sAIEwAAgAcEJgAAAA8ITAAAAB4QmAAAADwgMAEAAHhAYAIAAPCAwAQAAOABgQkAAMADAhOAi1q8eLG6dOmiqlWryuFwaObMmR4fs2jRIsXFxalUqVK66qqrNHbsWN8XCgA+RGACcFFHjx7VNddco3feeadQ99+5c6duvfVWtWvXTmvXrtXw4cP1+OOPa/r06T6uFAB8J9zqAgDYW+fOndW5c+dC33/s2LGqUaOGRo4cKUmqX7+hli37Sa+8MkmNGnXTsWPSyZPmyM42X48cOaXs7FOSJIdDOnHimCTpyy+lMmXMbZIUFiaVKiWVLm2OP//59FGypFdfPgBIYi85AIWUlyeFhUXp7ben6pprOum333Tm2L//7J+//36LwsMrKCLiCh05Ih07dinPliXJKcklqWh7yZUqJZUvLzmd536tWFGqXFmKjj779fSfnc6zoQxASPL4E4DABEBut/T779K2bdIvv0i7d5977Nkj7dtnQtOfhYVJUVHSFVecPebNm6ymTa9SYmJrlSsnlS0r7d27Wc89N1gzZnykmJgoRUSYkaDTX93ubOXkZOv0j6OsrCw1bRqjnTtdKls28sztubnSiRPS8eNnjz///dgxyeUyx6FDZ78eOiQdPGiC3f79Uk7Oua8jIsKEp5gYqUaNc4+aNc1Xp9PH/xEAWInABMBwu03o2bYt/8PlOnvfMmVMePjzUaWKlJR0t15+eYjuvrudrrhCqlBBKnHeSsj69evrwQcf1LBhw87ctmzZMrVt21YZGRm68sorPdaalZUlp9Mpl8ulyMiijTB54nZLf/xhgtO+febYv1/KzDTh8JdfpPR08+c/ByunU6pbV6pX78KjUiWvlgjA/zwGJtYwAUFo/37pp58uPA4fPnuf6tWlOnWkZs2k7t1NGKhTR6pVy0xh5TdFlZQ0Q7GxfXT11QU/95VXXqnMzMzz6tmv8PBwVbJBsnA4zPRcxYq66OvIzTUhKj3dHDt3mmC5ZYu0cKH5t9OioqTGjaUmTc5+bdRI8nLWA2AhAhMQwPLypK1bpVWrpNRUad06E4x++838e0SE1LCh+SV+550mINStK111lVkg7QutW7fWl19+ec5t8+fPV/PmzXXZZZf55kl9ICxMqlbNHK1bX/jvhw+bALV1q7Rpk3nf58+XkpPPTl3WrHk2QF13nRQfb25jvRQQeJiSAwKE2y3t2mWC0emAtHq1lJVl/v30aNGfRzrq1JHCi/mx6MiRI9q2bZsk6dprr9Ubb7yhDh06qGLFiqpRo4aGDRumX3/9VR9++KEk01agcePGGjBggPr3768VK1YoKSlJU6ZMUbdu3Qr1nL6ckvO1EyfOBqj1683XdeukX381/x4VJTVvbsLT6aMQs5QAfIs1TECgOn5c+uEHackSadkyE5IOHjT/FhNjftGe/sUbF2fWE/nCwoUL1aFDhwtu79u3ryZOnKgHHnhAu3bt0sKFC8/826JFizRkyBBt2LBBVatW1dNPP62kpKRCP2cgB6aC7Ntn/hv++ThwwPxb9epSy5ZS27ZS+/bSNdeYES4AfkNgAgLF77+bYLR0qQlJqanSqVNmsXFCgvmFejocRUdbXa1vBWNgOp/bbdZGnQ5PK1dK339velOVKye1aSO1a2cCVHy8mV4F4DMEJsCujh0z4ejbb82RlmZ+iVatan5RtmtnRhwaNw690YZQCEz5yc424WnJEmnxYhOgDx82YallS+mGG6TERPPn4k61AjgHgQmwi9xcac0aE45SUswvw5MnzeX6nTpJHTua0YTatVkUHKqB6Xy5udKPP54NUAsXmpHIyEjpxhtNeLr5ZvM9A6BYCEyAlVwuad48s8XHnDnml13ZslKHDiYkdepkrmIL9YB0PgJT/nJzzUL/+fPNsWKF6RVVt+7Z8NSxo/keA1AkBCbA33bsMAHpyy+lRYvML7SmTaUuXaRbbjHTKQF0db0lCEyFk5UlffedCeXz50vbt5vpuxtvlLp2Nd9zXIEHFAqBCfC13FyzWPfLL6XZs6WNG812Hx06mF9Yt99ueu+g8AhMl2bbNumrr6SZM800ntsttWplwlPXrlL9+hYXCNgXgQnwhbw8aflyado06fPPTdfnqCjptttMSEpMNFc64dIQmIrvwAHp669NeJo3z7SpuPpqE5y6dzeNNJkKBs4gMAHe4nabvkjTpkmffWY2pK1WTbrnHvMLqFWr0LuazduSk5OVnJys3NxcbdmyhcDkJceOmYsNZs40o6AHD5p1Tz16SD17misxgRBHYAKKw+2W1q41IenTT02n7ehoE5B69DC9cs7ffBbFxwiT7+TkmHVPU6dKX3whHTokxcaa4PSXv3DFHUIWgQm4FHv3Sh9/LE2caLa5qFRJ6tbNhKTrr2ckydcITP5x8qRZLD5tmhl9OnLEfH/37Ws+FDCtjBBCYAIK68QJadYsE5LmzzcLt++6S+rTx1x1xJVt/kNg8r+jR82I06RJ0v/+ZzZnvvtu8/3fsSMfEhD0CEyAJ2vXSu++K02ZYvomJSRIDzwg3Xuv2ZYE/kdgstbu3dJHH5nwtGWL2euuTx/p4YeZskPQIjAB+Tl61KzhGDfObEVRrZoJSX36cOm1HRCY7MHtNi0zJk0yHyiyskxzzKQkc0Uo27MgiBCYgD9bt86EpI8/Nnt03XKL+eF/66388LcTApP9HD1q1jqNHXv2Q0b//mbUqVo1q6sDio3ABOTmmgWtI0eazW6rVJH69TM/6GkoaU8EJntbs8Z88Jg82az9u/126dFHzVo/ejshQHn8zuWCaAQtl0t64w3Tb6Z7d3P5/+efS7/8Ir30EmEJuFTXXWcC09690qhRZjugm26SmjSR3n/fNMkEgg0jTAg627ZJb78tTZggZWdL990nPfGE+SGPwMAIU2Bxu82+iSNHmsaYFStKAwZIjzzCdB0CBlNyCA1ut7RwofmB/eWXpm/SwIHmqFLF6upQVASmwLV9uxl1Gj/ejDT17Cn9/e9m9AmwMabkENzy8qTp06XmzU2vmB07pPfek9LTpRdfJCwB/lanjvngsmeP9Npr0uLFUtOm5qq60xsCA4GIwISAlJNjrnRr3NisTypf3jSbXLfOLOguXdrqCoHQFhkpDR5spsg//NB8iGnf3mwnNGuW+bADBBICEwJKdrYZQWrQQOrdW7rqKmn5cmnBArPolCt0AHu57DLz/+q6ddJXX5mO4V27mlGnzz4jOCFwEJgQEI4dMwu569Qxi0nj4kyH7q++klq3tro6eEtycrJiY2MVHx9vdSnwMofj7LTc0qVmMfi990rNmplpdYIT7I5F37C148elMWOkV1+VDh6U7r9feuYZqWFDqyuDL7HoOzQsWya98IL07bdmxOmFF6Q77zQtQAA/Y9E3AtPJkyYo1a1rrrC54w6zp9WkSYQlIFi0aSOlpJhRpyuuMJv9xsWZRrMsDofdEJhgKzk5JhQ1aCANGiR16CD9/LNZt3TVVVZXB8AX2rY1o0yLFkkVKkh33WWC05w5BCfYB4EJtuB2m3UMTZqYTXCvu05av95cCVe3rtXVAfCH9u2l//3P9FQrW9aseerY0exdB1iNwATLLV9uhua7d5dq1DA/HKdPlxo1sroyAFa4/noz2vTVV9KBA1KLFmaB+NatVleGUEZggmW2bJG6dTNh6fhxs5Zh3jzThBJAaDt9VV1amtnmaMUKKTbWTNXv3291dQhFBCb43aFD0pAhZgQpNVX66CNp9WqpUyerKwNgN2FhZpp+yxbplVekTz6R6teX3nxTOnXK6uoQSghM8JvcXLN4u3598/XFF6XNm6W//IXLiAFcXOnS0lNPmWm5++6TnnzStCKYN8/qyhAq+DUFv1i6VIqPl/76V+nmm01QGjZMKlXK6soABJKoKNNyZM0aqXJl6ZZbTNuRbdusrgzBjsAEn9qzR+rVS2rXzgytL19upuCqVbO6MgCB7JprzNV006aZdU6NGpmmtocPW10ZghWBCT5x8qRZb9Cggdnn7YMPpO+/ZxsTAN7jcJir537+WRo+XHrrLfMz56OP6N8E7yMwweuWLjX7Qz33nJSUZBZrPvQQ65QA+Mbll0vPP2+m+tu1k/r0Mf2btmyxujIEE36FwWv++MOsUWrXToqMNGsMXn9dcjqtrgyBgs13URw1apgpuvnzpd27zaLwl14yI95AcbH5LorN7ZamTpUGD5ZOnJBGjJAGDDBrloBLwea7KK7jx01Yeu01qV496d13zRYsQAHYfBe+tWOH1LmzWdh9/fXSpk3SI48QlgBYq3Rps45yzRozyt2unfkgd+iQ1ZUhUBGYcElycqT//ldq3NiEpC+/lD79VKpa1erKAOCsJk3MusrkZGnKFOnqq83PKhaFo6gITCiyjRulhATTR2ngQPP322+3uioAyF9YmBn53rTJbMXUo4fZloktVlAUBCYUWk6OWZ907bWm18myZWZRd5kyVlcGAJ5Vq2Y29v78c2nJEtO76fPPra4KgYLAhELZvNmMKv3jH2Zx99q1UqtWVlcFAEXXrZu0YYPUvr10zz1Sz57SwYNWVwW7IzDhotxusw3BtddKLpfp1P3qq2xpAiCwVa5sRpc++cS0IWjUSJo92+qqYGcEJhRo3z6zNumRR6S+fc3VJi1bWl0VAHiHw2E28t2wwex1eeed0oMPsr0K8kdgQr5mzzZXl6SmSl99ZUaZWKsEIBhVqWJ+5o0fb0adrr3WbOUE/BmBCec4csR0677zTrNGaf166bbbrK4KVhs9erRq166tUqVKKS4uTkuWLLno/SdPnqxrrrlGl19+uapUqaIHH3xQB1kkAhtzOMzo0tq1UqVK5mq6f/9bys21ujLYBYEJZ6Smmk9WkyebrrizZpl5foS2adOmafDgwXr22We1du1atWvXTp07d1Z6enq+91+6dKn69Omjfv36acOGDfrss8+0atUqPfzww36uHCi6unVN36Zhw8z+dDfcIBXwrY4QQ2CC3G7T1K1NG6l8eSktTerf33ziAt544w3169dPDz/8sBo2bKiRI0cqJiZGY8aMyff+K1euVK1atfT444+rdu3aatu2rQYMGKDU1FQ/Vw5cmssuM9uqLFxowlKzZqY5L0IbgSnEZWWZS2offdRsG7B0qdl3CZCkkydPavXq1UpMTDzn9sTERC1fvjzfxyQkJGjPnj2aM2eO3G639u3bp88//1y3XWRuNzs7W1lZWeccgNXatTMfINu3l+64Q/rb39jIN5QRmELYjz9KzZtL33wjffaZ9PbbUkSE1VXBTg4cOKDc3FxFR0efc3t0dLQyMzPzfUxCQoImT56sHj16qGTJkrryyitVvnx5jRo1qsDnGTFihJxO55kjJibGq68DuFQVKkgzZkhvvimNGmVC1K5dVlcFKxCYQpDbLb33nmkRUKaMaRfQvbvVVcHOHOfNz7rd7gtuO23jxo16/PHH9dxzz2n16tWaO3eudu7cqaSkpALPP2zYMLlcrjPH7t27vVo/UBwOh2nYu3Sp2U7l2mvNGk+EFgJTiDlyROrTx1wJ17evaURZt67VVcGuoqKiFBYWdsFo0v79+y8YdTptxIgRatOmjZ566ik1bdpUN998s0aPHq3x48crIyMj38dEREQoMjLynAOwmxYtzAfMG26QunaVhg/nKrpQQmAKIRs3mv/hZ8yQPv5YGjdOKl3a6qpgZyVLllRcXJxSUlLOuT0lJUUJCQn5PubYsWMqUeLcHy1hYWGSzMgUEMgqVJC++MLsePDqq1KXLtIff1hdFfyBwBQiZs0yU3AlSkirVkn33291RQgUQ4cO1fvvv6/x48dr06ZNGjJkiNLT089MsQ0bNkx9+vQ5c/8uXbroiy++0JgxY7Rjxw4tW7ZMjz/+uFq0aKGqVata9TIAr3E4pL//3az/XLnSdAn/6Serq4KvhVtdAHzL7ZZeecVsmnv33dKkSVLZslZXhUDSo0cPHTx4UC+++KIyMjLUuHFjzZkzRzVr1pQkZWRknNOT6YEHHtDhw4f1zjvv6G9/+5vKly+vjh076tVXX7XqJQA+kZhoPoDedZdp9DtpktnYF8HJcQlD5IypB4hjx6SHHpKmTZNeeEH65z/NCBNgd1lZWXI6nXK5XKxngu0dPWp+1n76qWl4+dJL0v/NQiNweOw8yAhTkNq92yxK/PlnszcSn3oAwDfKlJGmTpXi4kxgSkszOyZUqGB1ZfAmxhuC0PLlpr/SgQPmz4QlAPCt/NY1bdxodVXwJgJTkBk/3lzy2qCBmVu/5hqrKwKA0JGYaPblLF1aat1a+vZbqyuCtxCYgkROjjRkiNSvn9lx+9tv2TgXAKxw1VXSsmVSQoLUubP0/vtWVwRvIDAFgSNHzHqlUaPMJrpjx0olS1pdFQCErshIs2Fv//7mePppKS/P6qpQHCz6DnCZmdJtt0lbt0pz5pjhYACA9cLDzYfYevXMxr3bt0sffihdfrnVleFSMMIUwDZuNL0/9u2TliwhLCHwJScnKzY2VvHx8VaXAniFw2GWS8yYYRaEd+hg9qND4KEPU4BatMhMw8XEmJGl6tWtrgjwHvowIRitXm1mBCIjpfnzpVq1rK4If+KxDxMjTAFo5kwzmtS8uRlZIiwBgP3FxZlWL3l5ZkH4+vVWV4SiIDAFmAkTTF+lrl2lr7+WnE6rKwIAFNZVV0lLl0rR0VL79uZqOgQGAlMAef11036/f3/pk0+4Eg4AAtGVV0oLF5o+eZ06mQ+/sD8CUwBwu027/SeflJ59Vhozhn2KACCQOZ3S3LnSLbdId95prp6DvdFWwOZyc6WBA6X33pPeeMNcbQEACHylSkmffSYlJUl9+5rtrIYOtboqFITAZGPZ2dJf/mIuR5040fwPBQAIHuHh5gNx5cqmV9Nvv0mvvGLaEcBeCEw2dfy4dNddZp77iy+kO+6wuiIAgC84HCYkRUWZ0HTihJlRIDTZC4HJho4dMwFpxYqzjc4AAMFt6FAzTTdokNkf9O23CU12QmCymaNHpdtvl1atMmGpfXurKwIA+Msjj5hpugEDzBrWd96RSnB5li0QmGzkyBHTBXbNGnP1RNu2VlcEAPC3v/7VhKaHH5ZOnZLGjSM02QGBySYOH5Y6d5bWrZPmzTNdYAEAoemhh0z7mAcfNNNz779POxmrEZhswOUyYWnDBrO/UKtWVlcEALBa375mpKlPHzM9N2ECoclKBCaLHT0q3XqrtHGjlJIitWhhdUWAdZKTk5WcnKzc3FyrSwFs4f77TWi6/34zLTd+PNNzVnG43e6iPqbID0D+TpwwC7y//15asICwBJyWlZUlp9Mpl8ulyMhIq8sBLDdliglNAweaheBcPed1Ht9RRpgscuqU1KOH2Xjxm28ISwCAgt13n2k58/DDUpky0quvEpr8jcBkgdxc6YEHpDlzpFmzpBtusLoiAIDd9etnlnE88YRUtqz03HNWVxRaCEx+5nabPhtTp5rj1lutrggAECgef9yEpuHDzUjT3/5mdUWhg8DkR2639NRT0rvvmoV799xjdUUAgEAzbJjp2/fkkyY0JSVZXVFoIDD50UsvSa+/Lr31lumtAQDApfj3v81I08CBUoUKZk0sfIvA5CcjR0rPP2++yR9/3OpqAACBzOGQ3nxTOnjQ9GmKjmY9rK/RzcEPpk6Vhgwx03HDh1tdDQAgGDgc0gcfmD1Hu3aV1q+3uqLgRh8mH1u4ULr5ZjNcOmkSl4EChUEfJqDwsrKk66+XfvtNWrFCiomxuqKA5PG3MyNMPrRhg0n97dubfYAISwAAb4uMNG1qwsPNNlt//GF1RcGJwOQjv/5qvnFr1pSmT5dKlrS6IgBAsKpSRZo7V8rIMB/UT5ywuqLgQ2Dygayss/2VvvnGpH8AAHzp6qul2bOlH34wC8Hz8qyuKLgQmLzs1CmpWzcpPd2EpapVra4ICBzJycmKjY1VfHy81aUAAalNG7Pv3PTp0tChpv8fvINF3142cKC5aiElxSzCA1B0LPoGimf0aGnQIGnUKOnRR62uJiCw+a4/jR4tjR1rAhNhCQBglUcekbZulQYPlho0kG66yeqKAh8jTF6yYIFpH/DYY6aZGIBLxwgTUHw5OVKXLqbVwPffm+CEAnkcYSIwecG2bVKLFub46itzaSeAS0dgArzD5ZJatTILwFeuNNuoIF/0YfI1l0u64w7piitMR2/CEgDALpxO6csvTVPLe+81o064NASmYsjNlXr1kvbuNZdyli9vdUUAAJyrbl3p88/NzhNDhlhdTeAiMBXDsGGmUdinnzI3DACwr44dzRVz77wjvfuu1dUEJiaQLtGkSdJrr0kjR0qJiVZXAwDAxSUlST/+aC5OatbMrLtF4bHo+xKsWSMlJEh/+Yv03nvsEQd4G4u+Ad/IzpZuuEHas0davVqqXNnqimyDRd/eduiQ1L271LixlJxMWEJoGD16tGrXrq1SpUopLi5OS5Ysuej9s7Oz9eyzz6pmzZqKiIhQnTp1NH78eD9VC6AgERFmPdPJk1KPHiwCLwqm5IrA7ZYefNDsBL1ggfnGA4LdtGnTNHjwYI0ePVpt2rTRuHHj1LlzZ23cuFE1atTI9zH33nuv9u3bpw8++EB169bV/v37lcNPZsAWqlUza29vvNGsxX3tNasrCgxMyRXB669LTz5projr0sXqagD/aNmypa677jqNGTPmzG0NGzZU165dNWLEiAvuP3fuXPXs2VM7duxQxYoVL+k5mZIDfO/NN81+c9OnS3ffbXU1lmNKzluWLZOeflr6+98JSwgdJ0+e1OrVq5V43pUNiYmJWr58eb6PmT17tpo3b67//ve/qlatmurXr68nn3xSx48fL/B5srOzlZWVdc4BwLcGDzZBqV8/adcuq6uxPwJTIezfb+Z6ExKkl1+2uhrAfw4cOKDc3FxFR0efc3t0dLQyMzPzfcyOHTu0dOlS/fTTT5oxY4ZGjhypzz//XIMGDSrweUaMGCGn03nmiImJ8errAHAhh8Psfep0SvfdJ506ZXVF9kZg8iA3V7r/fvONRCdvhCrHeVc3uN3uC247LS8vTw6HQ5MnT1aLFi1066236o033tDEiRMLHGUaNmyYXC7XmWP37t1efw0ALlS+vPndlpoq/fOfVldjbwQmD156ySzw/uQTqWpVq6sB/CsqKkphYWEXjCbt37//glGn06pUqaJq1arJ6XSeua1hw4Zyu93as2dPvo+JiIhQZGTkOQcA/2jVysyevPqqNG+e1dXYF4HpIhYtkl58UfrXv8zVBECoKVmypOLi4pSSknLO7SkpKUpISMj3MW3atNHevXt15MiRM7dt2bJFJUqUUPXq1X1aL4BL8+ST0s03S717SxkZVldjTwSmAvzxh2lM2b69NHy41dUA1hk6dKjef/99jR8/Xps2bdKQIUOUnp6upKQkSWY6rU+fPmfu36tXL1WqVEkPPvigNm7cqMWLF+upp57SQw89pNKlS1v1MgBcRIkS0ocfmmUnvXub5Sg4Fyty8uF2SwMGSEeOSB99JIWFWV0RYJ0ePXro4MGDevHFF5WRkaHGjRtrzpw5qlmzpiQpIyND6enpZ+5ftmxZpaSk6LHHHlPz5s1VqVIl3Xvvvfr3v/9t1UsAUAiVK0sffyx16iT95z/Ss89aXZG90IcpH5MmSQ88YBp73XOP1dUAoYc+TIB1nnvOrGlatEhq29bqavzGYx8mAtN5tm83mxJ27y5NmGB1NUBoIjAB1snJkTp0kHbvNpv1/un6jWBG48qiOHXKtBCIjpbeftvqagAA8L/wcLMc5fffpb/9zepq7IPA9Ccvv2x6UUyeLJUrZ3U1AABYo1Ytsx3YBx9Ic+ZYXY09MCX3f9LSpPh4c0Xcv/5ldTVAaGNKDrCe2y117iytXy/99JNUoYLVFfkUa5gK49QpE5bcbmnVKqlkSasrAkIbgQmwhz17pMaNpTvuMG0HghhrmApjxAiTnidOJCwBAHBa9erSW2+ZNU2zZlldjbVCfoTpxx+l5s2lYcNMV28A1mOECbAPt9uMMK1aJW3YIFWqZHVFPsGU3MWcOiW1aGE6mqamMroEWC05OVnJycnKzc3Vli1bCEyATWRkSI0ame1TpkyxuhqfIDBdzEsvmQXe338vxcVZXQ2A0xhhAuznk09M653PPjO9CoMMgakg69aZqbi//11ixwbAXghMgP243VK3btKSJdLPPwfd1ByBKT85OVKrVlJ2tpmKi4iwuiIAf0ZgAuxp3z6pQQMzwvT++1ZX41VcJZefMWOkNWtMQy7CEgAAhRMdbTbm/eADM9IUSkJuhCkz06Tj++6Txo61uhoA+WGECbCvvDwpIUE6csQMPgTJBVOMMJ3vqafMf9xXXrG6EgAAAk+JEtK4cWYd0xtvWF2N/4RUYFq0SPr4Y+nVV6WKFa2uBgCAwHTNNdITT5j+hTt3Wl2Nf4TMlNypU1KzZpLTKS1dahIyAHtiSg6wvyNHpIYNpSZNpK+/lhweJ7VsjSm500aONMOHo0cTlgAAKK6yZaVRo6RvvpGmT7e6Gt8LiRGmPXukq6+W+vUze+IAsDdGmIDAceedpkXPpk1SAP/vygiTJA0ZIpUrx15xAAB429tvS4cOmZ0zglnQB6b586XPP5def92sXwIAAN5Ts6Y0fLgJTlu2WF2N7wT1lNyJE2YxWkyMtGBBwC9IA4Iem+8Cgen4cbMAvGlTafZsq6u5JKG9NcrLL0svvCD9+KMUG2t1NQAKizVMQOD59FOpRw8zs3PTTVZXU2ShG5gyMqR69aQBA8x0HIDAQWACAo/bLbVvL/3xh5SWJoWHW11RkYTuou/nnzf7xP3jH1ZXAgBA8HM4TAufjRuld9+1uhrvC8rA9NNPZmPA556TKlSwuhoAAEJDXJz0wAPm9+8ff1hdjXcFZWB66impdm1p4ECrKwEAILS8/LKUnS299JLVlXhX0AWm+fOluXPNfnFBsoMyAAABo0oV6e9/l5KTpfR0q6vxnqBa9J2bK113nWnXvnQpbQSAQMWibyCwHT4s1aljuoC/957V1RRKaC36njxZWrfOXBVHWAIAwBrlyplmlhMmBE8zy6AZYTp5UmrQQGrWTJoxw+pqABQHI0xA4DtxQqpfX0pIkKZOtboaj0JnhOmDD6Rffgm+RWYAAASiUqVMi59p06S1a62upviCYoTp+HGpbl2pQwfp44+trgZAcTHCBASHnBypUSPzO/rrr62u5qJCY4Rp9Ghp3z6zDQoAALCH8HAz8zNnjrkYK5AF/AhTVpZ01VVSt27SuHFWVwPAGxhhAoJHXp5paFmunLRokW0vygr+Eaa335aOHJH++U+rKwFQXMnJyYqNjVV8fLzVpQDwkhIlpFdekZYskebNs7qaSxfQI0xHjkg1a0q9ekmjRlldDQBvYYQJCC6nN+Y9elRavdqWo0zBPcI0bpyZknvqKasrAQAABXE4zFqmtWvNeqZAFLAjTCdOmP3ibr3VtBQAEDwYYQKCj9sttWtnrpxbscJ2o0zBO8I0YYK0f7/0zDNWVwIAADxxOKRnn5W+/1763/+srqboAnKE6dQpqV49qXVracoUq6sB4G2MMAHBye2WmjeXnE7bhabgHGH65BPT1Xv4cKsrAQAAhXV6lOm776Rly6yupmgCboQpN9d0DW3QQJo1y8pKAPgKI0xA8MrLk5o0MVe522gBePCNMH3xhbR5s0moAAAgsJQoIT39tPTNN9LGjVZXU3gBNcLkdkvXXSdFRUkpKVZVAcDXGGECgtvJk1KtWtLtt0vvvmt1NZKCbYRpwQIpLU0aNszqSoDQMnr0aNWuXVulSpVSXFyclixZUqjHLVu2TOHh4WrWrJlvCwQQUEqWlAYNkj76SDpwwOpqCiegAtPbb0tNm0odOlhdCRA6pk2bpsGDB+vZZ5/V2rVr1a5dO3Xu3Fnp6ekXfZzL5VKfPn104403+qlSAIFkwADzdexYa+sorICZktu+3bQSeO89qV8/KyoAQlPLli113XXXacyYMWdua9iwobp27aoRI0YU+LiePXuqXr16CgsL08yZM5WWllbgfbOzs5WdnX3m71lZWYqJiWFKDghyAwZIs2dLu3ZJERGWlhI8U3LvvCNVrGj2jQPgHydPntTq1auVmJh4zu2JiYlavnx5gY+bMGGCtm/frueff75QzzNixAg5nc4zR0xMTLHqBhAYBg+WMjOladOsrsSzgAhMhw9L48dLf/2rVLq01dUAoePAgQPKzc1VdHT0ObdHR0crMzMz38ds3bpVzzzzjCZPnqzw8PBCPc+wYcPkcrnOHLt37y527QDsr2FDqXNn6Y03zIVddhYQgWnSJLPD8SOPWF0JEJoc52365Ha7L7hNknJzc9WrVy/961//Uv369Qt9/oiICEVGRp5zAAgNQ4ZIP/4oLVxodSUXV7iPfxbKy5NGjZK6dZOqV7e6GiC0REVFKSws7ILRpP37918w6iRJhw8fVmpqqtauXatHH31UkpSXlye3263w8HDNnz9fHTt29EvtAAJDp05S48bSm2/a+6Iu248wzZsnbdkiPf641ZUAoadkyZKKi4tTynmNz1JSUpSQkHDB/SMjI7V+/XqlpaWdOZKSktSgQQOlpaWpZcuW/iodQIBwOMxapq++krZutbqagtl+hOntt6W4OCmfn80A/GDo0KHq3bu3mjdvrtatW+vdd99Venq6kpKSJJn1R7/++qs+/PBDlShRQo0bNz7n8ZUrV1apUqUuuB0ATrv/ftNj8Z13pLfesrqa/Nk6MP38szR3rlnDlM9yCQB+0KNHDx08eFAvvviiMjIy1LhxY82ZM0c1a9aUJGVkZHjsyQQAF1OqlPTgg6Z10Kuvmr/bja37MD3xhDR1qpSebnl/BgB+xNYoQOjZulWqX1/6+GMz4uRngduH6cQJ0zL9wQcJSwAABLt69cyib5vsLXcB2wammTOlP/4wgQkAAAS//v2lxYulzZutruRCtg1M48dLbdtKDRpYXQkAAPCHu+6SKlUya5nsxpaB6ZdfpG+/lR56yOpKAACAv5QqJfXpYy72+tP2krZgy8A0YYJUpox0zz1WVwIAAPypf3/pwAFp1iyrKzmX7QJTXp4JTD17SmXLWl0NAADwp4YNzZIcuy3+tl1gWrDAtBFgOg4IPcnJyYqNjVV8fLzVpQCwUP/+Jg/s3Gl1JWfZrg9Tz57SunXShg00qwRCFX2YgNB29KgUHS0984z0j3/45SkDqw/T779LM2ZI/foRlgAACFVlykjdukkffigVfVzHN2wVmKZPl3JyLOnwCQAAbKR3b9P9+4cfrK7EsFVgmjpV6thRuvJKqysBAABW6tBBqlrV7PphB7YJTBkZ0nffmTVMAAAgtIWFSb16mcGUU6esrsZGgemzz6TwcOnuu62uBAAA2EGvXtLBg2ZAxWq2CUxTp0q33CJVqGB1JQAAwA6aNZPq1DGDKlazRWDatUtasYLpOAAAcJbDIXXvbq6gz8mxthZbBKZp06TSpaU77rC6EgAAYCfdu5tpuUWLrK3DFoFp6lSpSxe2QgEAAOeKi5Nq1bJ+Ws7ywLR5s5SWJvXoYXUlAADAbk5Py33xhZSba10dlgemWbPMdFznzlZXAgAA7Oiee6TffpOWLLGuBssD0+zZUmKiCU0AAADni4+XYmKsnZazNDDt3y8tX85ibwBGcnKyYmNjFR8fb3UpAGzEDtNyDnfRd7Xz2jZ4EyaYjXYzM6XKlb11VgCBLisrS06nUy6XS5GRkVaXA8AGVqyQEhKkxYuldu28fnqHpztYOsI0e7bUujVhCQAAXFzLlmav2dmzrXl+ywLT8ePS/PlMxwEAAM9KlJBuu0366iuLnt+ap5UWLJCOHZPuvNOqCgAAQCC5/Xbp55+lbdv8/9yWBabZs6V69aQGDayqAAAABJJOnaSSJaWvv/b/c1sSmPLypC+/NNNxDo/LrAAAAMyOIB07WjMtZ0lgSkszV8bdfrsVzw4AAALVzTebBpbHj/v3eS0JTPPnS2XKmMsDAQAACqtTJyk7W1q61L/Pa1lg6tDBzEMCAAAUVqNGpr3At9/693n9HpiOHjWpMDHR388MAAACncNhRplSUvz7vH4PTIsWSadOEZgAAMCluekmae1a6cAB/z2n3wPT/PlSjRpS/fr+fmYAABAMbrzRfF2wwH/P6ffAtGCBGUqjnQCA87H5LoDCqFZNio317zomv26++/vvUqVK0qRJUp8+l3oWAMGOzXcBePLEE9KsWdLOnV4ZhLHX5runLwH0wS7DAAAghNx0k/TLL9L27f55Pr8GpiVLzDBarVr+fFYAABBsrr9eCgvz3zomvwem9u1ZvwQAAIqnXDnp2mv918DSb4Hp6FFp9Wqm4wAAgHe0bRuEgWnlSiknh8AEAAC8o21badcu6ddfff9cfgtMixdLFSuaywABAACKq00b83XZMt8/l98C05IlJgmWsGT3OgAAEGyuvFKqW9c/03J+iS8nT5opOabjAACAN/lrHZNfAtPatdLx4+ZFAQg8o0ePVu3atVWqVCnFxcVpyZIlBd73iy++0E033aQrrrhCkZGRat26tebNm+fHagGEkjZtpB9/NBeX+ZJfAlNqqnTZZebyPwCBZdq0aRo8eLCeffZZrV27Vu3atVPnzp2Vnp6e7/0XL16sm266SXPmzNHq1avVoUMHdenSRWvXrvVz5QBCQXy8lJcnpaX59nn8sjXKQw+ZF7JmTVEfCcBqLVu21HXXXacxY8acua1hw4bq2rWrRowYUahzNGrUSD169NBzzz1XqPuzNQqAwjp1SoqMlP7zH7NdyiWyx9YoqalS8+b+eCYA3nTy5EmtXr1aiYmJ59yemJio5cuXF+oceXl5Onz4sCpWrFjgfbKzs5WVlXXOAQCFcdllUrNmJmv4ks8D07Fj0saNBCYgEB04cEC5ubmKjo4+5/bo6GhlZmYW6hyvv/66jh49qnvvvbfA+4wYMUJOp/PMERMTU6y6AYSW5s2lVat8+xw+D0w//ijl5kpxcb5+JgC+4jhvPyO3233BbfmZMmWKXnjhBU2bNk2VK1cu8H7Dhg2Ty+U6c+zevbvYNQMIHc2bS5s3S74cnA733amN1aulkiWlxo19/UwAvC0qKkphYWEXjCbt37//glGn802bNk39+vXTZ599pk6dOl30vhEREYqIiCh2vQBC0+lBmTVrpBtu8M1z+HyEKTVVatJE4mchEHhKliypuLg4paSknHN7SkqKEhISCnzclClT9MADD+iTTz7Rbbfd5usyAYS4q6+WLr/ct+uYfD7ClJpK/yUgkA0dOlS9e/dW8+bN1bp1a7377rtKT09XUlKSJDOd9uuvv+rDDz+UZMJSnz599NZbb6lVq1ZnRqdKly4tp9Np2esAELzCw03rIl8GJp+OMB0/Lm3axPolIJD16NFDI0eO1IsvvqhmzZpp8eLFmjNnjmrWrClJysjIOKcn07hx45STk6NBgwapSpUqZ44ninG9LwB40qyZtH69787v0z5Ma9aYsLRihdSqVVGfBkCoog8TgKIaO1Z67DHpyJFLWgZkbR+mDRvM19hYXz4LAAAIdY0aSTk50pYtvjm/zwNTTIzpwAkAAOArjRqZr6cHa7zN54Hp9AsAAADwlYoVpapVpZ9+8s35CUwAACAoNG4cgIHp6FFp504CEwAA8I/GjQNwSm7TJvOVwAQAAPyhUSNp+3azj623+SwwcYUcgKJKTk5WbGys4uPjrS4FQABq0EByu01o8jaf9WHKypI2bqT/EoCiow8TgEuxf78UHS1Nny7dfXeRHmpdH6bISMISAADwnyuuMPlj61bvn9vnm+8CAAD4g8Mh1asnbdvm/XMTmAAAQNCoV48RJgAAgIuqW5fABAAAcFF160p790rHj3v3vAQmAAAQNGrVMl/T0717XgITAAAIGjVrmq+7dnn3vAQmAAAQNKpXl8LCvB+Ywr17OgAAAOuEh0sTJ0re3jDAZ52+AeBS0ekbgJ9Z1+kbAAAgWBCYAAAAPCAwAbCN5ORkxcbGKt7biw8AoJhYwwTAdljDBMDPWMMEAABQXAQmAAAADwhMAAAAHhCYAAAAPCAwAQAAeEBgAgAA8IDABAAA4AGBCQAAwAMCEwAAgAcEJgAAAA8ITAAAAB4QmAAAADwgMAGwjeTkZMXGxio+Pt7qUgDgHA63213UxxT5AQBQFFlZWXI6nXK5XIqMjLS6HADBz+HpDowwAQAAeEBgAgAA8IDABAAA4AGBCQAAwAMCEwAAgAcEJgAAAA8ITAAAAB4QmAAAADwgMAEAAHhAYAIAAPAgvCh3djgcDpfL5ataAISo7OxsZWdnn/n74cOHJZktUgDA15xOZ6Skw+6L7BdXpL3kHA5HpCQSEwAACDZOt9td4Ke0ogYmh8vlyivo37OyshQTE6Pdu3d7ZcPM+Ph4rVq1ivMUwJvvt91emzfP5Y3z8L3t23OdP8KUkZGhFi1aaOPGjapWrZrf6/H1uex0Hr63/XsuO/7c9ua57Haewr7fTqfTKQ8jTEWakrvYif4sMjLSK//jhYWFcZ5C8Mb7bcfXZsea+N7277nKlStnm+9tb57LbueR+N7297ns9HPbm+ey23lO8/R+X2xk6TRbL/oeNGgQ5/ETO742O9bkLXZ7bXb87+YtdnxtdjuPN9nttdnxv7+32PG12e083lSkKbn/U+ADsrKy5HQ65XK5vJoMkT/eb//hvfavPXv2nBlGr169utXlBDW+t/2L99u/ivB+Ozydy6sjTBEREXr++ecVERHhzdOiALzf/sN77V+n32feb9/je9u/eL/9y5vvt1dHmADAG/gUDsDP/DvCBAAAEIwITAAAAB4QmAAAADwgMAEAAHhAYAIAAPDAp4HpjjvuUI0aNVSqVClVqVJFvXv31t69e335lCFp165d6tevn2rXrq3SpUurTp06ev7553Xy5EmrSwtaL7/8shISEnT55ZerfPnyVpcDXJLFixerS5cuqlq1qhwOh2bOnGl1SUFrxIgRio+PV7ly5VS5cmV17dpVmzdvtrqsoDRmzBg1bdr0THfv1q1b65tvvin2eX0amDp06KBPP/1Umzdv1vTp07V9+3Z1797dl08Zkn7++Wfl5eVp3Lhx2rBhg958802NHTtWw4cPt7q0oHXy5Endc889GjhwoNWlAJfs6NGjuuaaa/TOO+9YXUrQW7RokQYNGqSVK1cqJSVFOTk5SkxM1NGjR60uLehUr15d//nPf5SamqrU1FR17NhRd955pzZs2FCs8/q1D9Ps2bPVtWtXZWdn67LLLrvU06AQXnvtNY0ZM0Y7duywupSgNnHiRA0ePFiHDh2yupSgkJycrOTkZOXm5mrLli30YfIjh8OhGTNmqGvXrlaXEhJ+++03Va5cWYsWLVL79u2tLifoVaxYUa+99pr69etX0F3s04fp999/1+TJk5WQkEBY8gOXy6WKFStaXQZQJIMGDdLGjRu9tgM7YFcul0uS+DntY7m5uZo6daqOHj2q1q1bF+tcPg9MTz/9tMqUKaNKlSopPT1ds2bN8vVThrzt27dr1KhRSkpKsroUAMB53G63hg4dqrZt26px48ZWlxOU1q9fr7JlyyoiIkJJSUmaMWOGYmNji3XOIgemF154QQ6H46JHamrqmfs/9dRTWrt2rebPn6+wsDD16dNHlzANGJKK+l5L0t69e3XLLbfonnvu0cMPP2xR5YHpUt5vACiqRx99VOvWrdOUKVOsLiVoNWjQQGlpaVq5cqUGDhyovn37auPGjcU6Z5HXMB04cMB94MCBi96nVq1aKlWq1AW3n96BfPny5cUeGgsFBw4cUFHe671796pDhw5q2bKlJk6cqBIl6BpRFEV9vyXWMPkKe8n5H2uY/OOxxx7TzJkztXjxYtWuXdvqckJGp06dVKdOHY0bN66gu3hcwxRe1CeNiopSVFRUUR8mSWdGlrKzsy/p8aGmKO/1r7/+qg4dOiguLk4TJkwgLF2C4nxvA8DFuN1uPfbYY5oxY4YWLlxIWPIzt9td7OxR5MBUWD/88IN++OEHtW3bVhUqVNCOHTv03HPPqU6dOowuednevXt1ww03qEaNGvp//+//6bfffjvzb1deeaWFlQWv9PR0/f7770pPT1dubq7S0tIkSXXr1lXZsmWtLQ4opCNHjmjbtm1n/r5z506lpaWpYsWKqlGjhoWVBZ9Bgwbpk08+0axZs1SuXDllZmZKkpxOp0qXLm1xdcFl+PDh6ty5s2JiYnT48GFNnTpVCxcu1Ny5c4t3YrfbXdSjUNatW+fu0KGDu2LFiu6IiAh3rVq13ElJSe49e/YU9hQopAkTJrhl2j1ccMA3+vbtm+/7/d1331ldWlBwuVxuSW6Xy2V1KUHtu+++y/f7uG/fvlaXFnQK+hk9YcIEq0sLOg899JC7Zs2a7pIlS7qvuOIK94033uieP3++p4d5zD9+7cMEAIXBGiYAfmafPkwAAACBisAEAADgAYEJAADAAwITAACABwQmALaRnJys2NhYxcfHW10KAJyDq+QA2A5XyQHwM66SAwAAKC4CEwAAgAcEJgAAAA8ITAAAAB4QmAAAADwgMAEAAHhAYAIAAPCAwAQAAOABgQkAAMADAhMAAIAHBCYAAAAPCEwAAAAeEJgA2EZycrJiY2MVHx9vdSkAcA6H2+0u6mOK/AAAKIqsrCw5nU65XC5FRkZaXQ6A4OfwdAdGmAAAADwgMAEAAHhAYAIAAPCAwAQAAOABgQkAAMADAhMAAIAHBCYAAAAPCEwAAAAeEJgAFOiPP/5Q79695XQ65XQ61bt3bx06dKjA+586dUpPP/20mjRpojJlyqhq1arq06eP9u7d67+iAcAHCEwACtSrVy+lpaVp7ty5mjt3rtLS0tS7d+8C73/s2DGtWbNG//znP7VmzRp98cUX2rJli+644w4/Vg0A3sfWKADytWnTJsXGxmrlypVq2bKlJGnlypVq3bq1fv75ZzVo0KBQ51m1apVatGihX375RTVq1CjUY9gaBYCfsTUKgEuzYsUKOZ3OM2FJklq1aiWn06nly5cX+jwul0sOh0Ply5cv8D7Z2dnKyso65wAAOyEwAchXZmamKleufMHtlStXVmZmZqHOceLECT3zzDPq1avXRUeKRowYcWadlNPpVExMzCXXDQC+QGACQswLL7wgh8Nx0SM1NVWS5HBcOErtdrvzvf18p06dUs+ePZWXl6fRo0df9L7Dhg2Ty+U6c+zevfvSXhwA+Ei41QUA8K9HH31UPXv2vOh9atWqpXXr1mnfvn0X/Ntvv/2m6Ojoiz7+1KlTuvfee7Vz507973//87gOKSIiQhEREZ6LBwCLEJiAEBMVFaWoqCiP92vdurVcLpd++OEHtWjRQpL0/fffy+VyKSEhocDHnQ5LW7du1XfffadKlSp5rXYAsApTcgDy1bBhQ91yyy3q37+/Vq5cqZUrV6p///66/fbbz7lC7uqrr9aMGTMkSTk5OerevbtSU1M1efJk5ebmKjMzU5mZmTp58qRVLwUAio3ABKBAkydPVpMmTZSYmKjExEQ1bdpUH3300Tn32bx5s1wulyRpz549mj17tvbs2aNmzZqpSpUqZ46iXFkHAHZDHyYAtkMfJgB+5vFKlksJTADgUw6HI1KSS5LT7XbTlAmA5QhMAGzHYfoWlJN02M0PKQA2QGACAADwgEXfAAAAHhCYAAAAPCAwAQAAeEBgAgAA8IDABAAA4AGBCQAAwAMCEwAAgAcEJgAAAA/+P/tusZU0EWheAAAAAElFTkSuQmCC\n",
1052 "text/plain": [
1053 "Graphics object consisting of 1 graphics primitive"
1054 ]
1055 },
1056 "metadata": {},
1057 "output_type": "display_data"
1058 },
1059 {
1060 "data": {
1061 "text/plain": [
1062 "3/2*pi"
1063 ]
1064 },
1065 "execution_count": 104,
1066 "metadata": {},
1067 "output_type": "execute_result"
1068 }
1069 ],
1070 "source": [
1071 "y = sqrt(1-(x/3)^2)\n",
1072 "show(plot(y, xmin=-3.1, xmax=3.1, ymin=-0.2, ymax=1.1))\n",
1073 "integral(y, x, -3, 3)"
1074 ]
1075 },
1076 {
1077 "cell_type": "markdown",
1078 "metadata": {},
1079 "source": [
1080 "## Differential equations\n",
1081 "**Reference:** [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]\n",
1082 "\n",
1083 "A [differential equation](https://en.wikipedia.org/wiki/Differential_equation) is an equation involving an unknwon function and its derivatives. They can be of two kinds: *ordinary* differential equations ([ODE](https://en.wikipedia.org/wiki/Ordinary_differential_equation)) and *partial* differential equations ([PDE](https://en.wikipedia.org/wiki/Partial_differential_equation)). The latter involve multivariate functions and their partial derivatives.\n",
1084 "\n",
1085 "Differential equations are in general hard to solve *exactly* (or *symbolically*): even a simple equation of the form $f'(x)=g(x)$, where $g(x)$ is someknown function, requires solving the integral $\\int g(x)\\mathrm{d}x$ in order to find $f$, which as we know is not always easy!\n",
1086 "\n",
1087 "Theoretical results on differential equations usually ensure the existence and/or uniquess of a solution under certain conditions, but in general they do not give a way to solve them. There exits many methods to find approximate solutions, and some of them are implemented in Sage as well (see [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]). However we will focus on the simple ODEs that can be solved exactly.\n",
1088 "\n",
1089 "Let's start with a simple example. Let's find all functions $f(x)$ such that $f'(x)=f(x)$. In order to do so, we need to use the `function()` construct, which allows us to define an \"unknwon\" function inside Sage, like we define variables with `var()`."
1090 ]
1091 },
1092 {
1093 "cell_type": "code",
1094 "execution_count": 108,
1095 "metadata": {},
1096 "outputs": [
1097 {
1098 "data": {
1099 "text/plain": [
1100 "_C*e^x"
1101 ]
1102 },
1103 "execution_count": 108,
1104 "metadata": {},
1105 "output_type": "execute_result"
1106 }
1107 ],
1108 "source": [
1109 "var('x')\n",
1110 "function('f')\n",
1111 "equation = derivative(f(x)) == f(x)\n",
1112 "desolve(equation, f(x)) # f(x) is the unknown function"
1113 ]
1114 },
1115 {
1116 "cell_type": "markdown",
1117 "metadata": {},
1118 "source": [
1119 "As you can expect, they are all the functions $Ce^x$ for some constant $C$. The constant $C$ plays the same role as the constant in the solution of an integral, but in this case Sage writes it explicitly.\n",
1120 "\n",
1121 "We can also specify *initial conditions* for our function. For example we can impose that $f(0)=3$ as follows:"
1122 ]
1123 },
1124 {
1125 "cell_type": "code",
1126 "execution_count": 109,
1127 "metadata": {},
1128 "outputs": [
1129 {
1130 "data": {
1131 "text/plain": [
1132 "3*e^x"
1133 ]
1134 },
1135 "execution_count": 109,
1136 "metadata": {},
1137 "output_type": "execute_result"
1138 }
1139 ],
1140 "source": [
1141 "desolve(equation, f(x), (0,3))"
1142 ]
1143 },
1144 {
1145 "cell_type": "markdown",
1146 "metadata": {},
1147 "source": [
1148 "You can also solve *second order* equations, that is equations where the second derivative also appears. In this case if you want to specify an initial condition you should write the triple of values $(x_0, f(x_0), f'(x_0))$."
1149 ]
1150 },
1151 {
1152 "cell_type": "code",
1153 "execution_count": 112,
1154 "metadata": {},
1155 "outputs": [
1156 {
1157 "data": {
1158 "text/plain": [
1159 "-1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e^(-1/2*x^2), x)"
1160 ]
1161 },
1162 "execution_count": 112,
1163 "metadata": {},
1164 "output_type": "execute_result"
1165 }
1166 ],
1167 "source": [
1168 "equation = derivative(f(x), x, 2) + x*derivative(f(x)) == 1\n",
1169 "desolve(equation, f(x), (0, 0, 0))"
1170 ]
1171 },
1172 {
1173 "cell_type": "markdown",
1174 "metadata": {},
1175 "source": [
1176 "**Exercise.** Use Sage to find out the functions $f(x)$ that satisfy\n",
1177 "\\begin{align*}\n",
1178 " \\begin{array}{rlcrl}\n",
1179 " (A) &\n",
1180 " \\begin{cases}\n",
1181 " f(0) &= 1\\\\\n",
1182 " f'(0) &= 0\\\\\n",
1183 " f''(x) &= -f(x)\n",
1184 " \\end{cases}\n",
1185 " & \\qquad \\qquad &\n",
1186 " (B) &\n",
1187 " \\begin{cases}\n",
1188 " f(0) &= 0\\\\\n",
1189 " f'(0) &= 1\\\\\n",
1190 " f''(x) &= -f(x)\n",
1191 " \\end{cases}\n",
1192 " \\end{array}\n",
1193 "\\end{align*}"
1194 ]
1195 },
1196 {
1197 "cell_type": "code",
1198 "execution_count": 116,
1199 "metadata": {},
1200 "outputs": [
1201 {
1202 "name": "stdout",
1203 "output_type": "stream",
1204 "text": [
1205 "cos(x)\n",
1206 "sin(x)\n",
1207 "_K2*cos(x) + _K1*sin(x)\n"
1208 ]
1209 }
1210 ],
1211 "source": [
1212 "eq = derivative(f(x), x, 2) == -f(x)\n",
1213 "conditions1 = (0,1,0)\n",
1214 "conditions2 = (0,0,1)\n",
1215 "print( desolve(eq, f(x), conditions1) )\n",
1216 "print( desolve(eq, f(x), conditions2) )\n",
1217 "print( desolve(eq, f(x)) )"
1218 ]
1219 },
1220 {
1221 "cell_type": "markdown",
1222 "metadata": {},
1223 "source": [
1224 "### A real-world example\n",
1225 "\n",
1226 "Differential equations have countless applications in Science, so it would be a shame not to see at least a simple one.\n",
1227 "\n",
1228 "Consider an object moving with constant acceleration $a$. Its velocity at time $t$ is described by the formula $v(t) = v(0) + at$. For example an object falling from the sky has acceleration $g\\sim 9.8 m/s^2$ towards the ground, so its velocity is $v(t) = -gt$.\n",
1229 "\n",
1230 "However in the real world you need to take into account the air's resistance, which depends (among other things) on the velocity of the object. In this case the acceleration $a(t)$ is not constant anymore, and it satisfies an equation of the form $a(t)=-g -kv(t)$, where $k$ is some constant that may depend on the shape and mass of the object (in practice it may be more complicated than this).\n",
1231 "\n",
1232 "Since the acceleration is the derivative of the velocity, we have a differential equation\n",
1233 "\\begin{align*}\n",
1234 " v'(t) = -g -kv(t)\n",
1235 "\\end{align*}\n",
1236 "and we can try to solve it with Sage!"
1237 ]
1238 },
1239 {
1240 "cell_type": "code",
1241 "execution_count": 120,
1242 "metadata": {},
1243 "outputs": [],
1244 "source": [
1245 "var('t')\n",
1246 "function('v')\n",
1247 "g = 9.8\n",
1248 "k = 1.5\n",
1249 "conditions = (0, 0) # Start with velocity 0\n",
1250 "sol = desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions)\n",
1251 "#plot(sol, xmin=0, xmax = 100)"
1252 ]
1253 },
1254 {
1255 "cell_type": "markdown",
1256 "metadata": {},
1257 "source": [
1258 "If you want to solve this equation symbolically (that is, keeping $g$ and $k$ in symbols) you need to specify that $t$ is the *independent variable* of the equation:"
1259 ]
1260 },
1261 {
1262 "cell_type": "code",
1263 "execution_count": 121,
1264 "metadata": {},
1265 "outputs": [
1266 {
1267 "data": {
1268 "text/plain": [
1269 "-(g*e^(k*t) - g)*e^(-k*t)/k"
1270 ]
1271 },
1272 "execution_count": 121,
1273 "metadata": {},
1274 "output_type": "execute_result"
1275 }
1276 ],
1277 "source": [
1278 "var('t', 'g', 'k')\n",
1279 "function('v')\n",
1280 "conditions = (0, 0) # Start with velocity 0\n",
1281 "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions, ivar=t)"
1282 ]
1283 },
1284 {
1285 "cell_type": "markdown",
1286 "metadata": {},
1287 "source": [
1288 "# Basic data analysis and visualization\n",
1289 "\n",
1290 "## Statistics\n",
1291 "**References:** [[14](https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html)]\n",
1292 "\n",
1293 "Sage includes the most basic functions for statistical analysis."
1294 ]
1295 },
1296 {
1297 "cell_type": "code",
1298 "execution_count": 122,
1299 "metadata": {},
1300 "outputs": [
1301 {
1302 "name": "stdout",
1303 "output_type": "stream",
1304 "text": [
1305 "Values:\t [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n",
1306 "Mean:\t\t\t 5/13\n",
1307 "Median:\t\t\t 1\n",
1308 "Mode:\t\t\t [3]\n",
1309 "Standard deviation:\t 2*sqrt(29/13)\n",
1310 "Variance:\t\t 116/13\n",
1311 "Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5]\n"
1312 ]
1313 }
1314 ],
1315 "source": [
1316 "L = [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n",
1317 "\n",
1318 "print(\"Values:\\t\", L)\n",
1319 "\n",
1320 "print(\"Mean:\\t\\t\\t\", mean(L))\n",
1321 "print(\"Median:\\t\\t\\t\", median(L))\n",
1322 "print(\"Mode:\\t\\t\\t\", mode(L))\n",
1323 "\n",
1324 "print(\"Standard deviation:\\t\", std(L))\n",
1325 "print(\"Variance:\\t\\t\", variance(L))\n",
1326 "\n",
1327 "print(\"Moving average (5):\", moving_average(L,5))"
1328 ]
1329 },
1330 {
1331 "cell_type": "markdown",
1332 "metadata": {},
1333 "source": [
1334 "You can also compare your data to a probability distribution, see [this page](https://doc.sagemath.org/html/en/reference/probability/sage/probability/probability_distribution.html). If you need to do more advanced statistics you should consider using [R](https://www.r-project.org/); you can also use it inside Sage."
1335 ]
1336 },
1337 {
1338 "cell_type": "markdown",
1339 "metadata": {},
1340 "source": [
1341 "## Plotting\n",
1342 "**Reference:** [[15](https://doc.sagemath.org/html/en/reference/plotting/index.html)], more specifically the subsection [[16](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html)].\n",
1343 "\n",
1344 "Some Sage objects can be plotted:"
1345 ]
1346 },
1347 {
1348 "cell_type": "code",
1349 "execution_count": 123,
1350 "metadata": {},
1351 "outputs": [
1352 {
1353 "data": {
1354 "image/png": "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iYyMdPl5hw8fZs+ePXkSavGcY8fggQfMPm2PPQbPPANl1L5WiqlcuXKEhYURHx9P9+7dc8/Hx8fTtWtXl18nNTVVPxuEiIgIPv300zznVq1aRfPmzSlbtqzrL+TqrO9CjgL98ssvVmpqqvXkk09alStXtlJTU63U1FTr2LFjudc0aNDA+uijj3K/njZtmuVwOKyPPvrI2rJli3XfffdZtWvXtjIzMwud3S6+o3379laTJk2sxMREKzEx0br++uutTp065bnmz5+LY8eOWY888oiVkJBg7d6921q9erUVERFhXX755fpc2GDbNstq2NCyqlSxrKVL3fccrXoLTO+9955VtmxZa+HChda2bdus0aNHW5UqVbJ+/vlny7Isa/z48VZ0dHTu9c8//7y1bNkya9euXdZ3331njR8/3gKspe78cIotjh07lptHANasWbOs1NRU65dffrEs6/zPxk8//WRVrFjRGjNmjLVt2zZr4cKFVtmyZa0PP/zwj0tcynPcmij179/fAs47Vq9enXsNYL3++uu5X+fk5FhTpkyxatWqZQUHB1s333yztWXLlgv86xRvdvjwYatv375WlSpVrCpVqlh9+/Y9b2nvnz8XJ0+etKKioqxLL73UKlu2rHXllVda/fv3t9LT0z0ffID74APLqlzZskJDLauQbg4lQolS4IqLi7Pq1q1rlStXzmrWrJm1du3a3D/r37+/dcstt+R+PX36dOvqq6+2ypcvb/3tb3+zWrdubX322Wc2RC3u9kcriL8e/fv3tyzr/M+GZVnWmjVrrBtvvNEqV66cVa9ePWvevHl//mOX8pwg678Tm4qh2C8gIt7t3DkYPx6ee85M3H71Vahc2T3PiouLIy4ujuzsbHbt2oXT6aRq1arueZiIBDKXZnQrURKRQh04YJKjr76CmTNh1CjwxCLUzMxMHA6HEiURcReXfpJp+qWIFCgx0TSPzMmB1auhTRu7IxIR8SyvajgpIt7BsmDOHLjlFqhfH775RkmSiAQmJUoikseJExAdbbYjGTbMVJK00lpEApWG3kQk1w8/QI8e8OOP8M47cN99dkckImIvVZREBIBPPoHmzeH0adiwQUmSiAgoURIJeNnZ8Pjj0LUr3HYbbNoEjRvbHZWIiHfQ0JtIADt0CPr0gS++gGnT4NFHPbP0X0TEVyhREglQyclw991w8iSs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\n",
1355 "text/plain": [
1356 "Graphics object consisting of 1 graphics primitive"
1357 ]
1358 },
1359 "execution_count": 123,
1360 "metadata": {},
1361 "output_type": "execute_result"
1362 }
1363 ],
1364 "source": [
1365 "f = sin(x)\n",
1366 "plot(f)"
1367 ]
1368 },
1369 {
1370 "cell_type": "markdown",
1371 "metadata": {},
1372 "source": [
1373 "Sage's plotting functions are based on Python's [matplotlib](https://matplotlib.org/).\n",
1374 "\n",
1375 "You can give a number of options to adjust the aspect of your plot, see [here](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html#sage.plot.plot.plot). Let's see some of them:"
1376 ]
1377 },
1378 {
1379 "cell_type": "code",
1380 "execution_count": 129,
1381 "metadata": {},
1382 "outputs": [
1383 {
1384 "name": "stdout",
1385 "output_type": "stream",
1386 "text": [
1387 "hello\n"
1388 ]
1389 },
1390 {
1391 "data": {
1392 "image/png": "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\n",
1393 "text/plain": [
1394 "Graphics object consisting of 1 graphics primitive"
1395 ]
1396 },
1397 "metadata": {},
1398 "output_type": "display_data"
1399 }
1400 ],
1401 "source": [
1402 "f = sin(x)\n",
1403 "p = plot(f,\n",
1404 " -2*pi, 2*pi, # bounds for x\n",
1405 " ymin = -1.1, ymax = 1.1, # bounds for y\n",
1406 " color = \"red\",\n",
1407 " title = \"The sin function\",\n",
1408 " )\n",
1409 "print(\"hello\")\n",
1410 "show(p)"
1411 ]
1412 },
1413 {
1414 "cell_type": "markdown",
1415 "metadata": {},
1416 "source": [
1417 "Some of the options are not described precisely in Sage's documentation, but you can find them on [matplotlib's documentation](https://matplotlib.org/stable/contents.html). You can find many examples online for adjusting your plot as you like!"
1418 ]
1419 },
1420 {
1421 "cell_type": "markdown",
1422 "metadata": {},
1423 "source": [
1424 "If you need to plot more than one object at the time, you can sum two plots and show them together with `show()`:"
1425 ]
1426 },
1427 {
1428 "cell_type": "code",
1429 "execution_count": 134,
1430 "metadata": {},
1431 "outputs": [
1432 {
1433 "data": {
1434 "image/png": "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\n",
1435 "text/plain": [
1436 "Graphics object consisting of 2 graphics primitives"
1437 ]
1438 },
1439 "metadata": {},
1440 "output_type": "display_data"
1441 }
1442 ],
1443 "source": [
1444 "cosine = plot(cos(x), (x,-pi/2,pi/2), color=\"red\")\n",
1445 "exponential = plot(exp(x), (x,-2,0.5))\n",
1446 "\n",
1447 "show(cosine + exponential) # works like print()"
1448 ]
1449 },
1450 {
1451 "cell_type": "markdown",
1452 "metadata": {},
1453 "source": [
1454 "Finally, there are other types of plots that you can use, like [scatter plots](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/scatter_plot.html#sage.plot.scatter_plot.scatter_plot) and [bar charts](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/bar_chart.html#sage.plot.bar_chart.bar_chart). You can also add [text](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/text.html#sage.plot.text.text) to your plot:"
1455 ]
1456 },
1457 {
1458 "cell_type": "code",
1459 "execution_count": 138,
1460 "metadata": {},
1461 "outputs": [
1462 {
1463 "data": {
1464 "image/png": "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ceJETjvtNHbeeWdWrFjB9ddfz/e//32ampo48MADue+++5gyZUrncxcvXsyyZcvYf//9Afja177GIYcc0uX13/GOd6zDnkvSENlhDtSugslz4aWp5a5m5BtoikrFkZlaoJniX73f7LZuFMXAkigGmgTcUOI1FrWvm1di3X3t61YD+5VYP541o0OtwKRu6z/Zvi499thjXaLiT3/6084Ro/e85z0JSFdddVWXkaOFCxd2/kV//fXXD2lUTSmlpUuX9jky1KGtrS298cYbPZZ3PHddRo4WLFiQampqEpC22Wab9MILL/T6OqXWddQApAMOOCC1tLT02OZrX/ta5zb/9V//1WetvcmOHAHpmmuu6bFNc3NzmjJlSgJSTU1Nevjhh3ts09dn8fDDD3d+FpMnT05//etfe2zz29/+tnOb6dOn91j/zDPPdNZ4xRVXDGjfHDmStC4GP3LUlupOeXeq+Q9S3Sn/lKDNkaN+boOac5RSagXuan84s9vq6cDY9vD03fZle2TnHUXEeGCH9od3ZJ8cEdOBjklAP0op3VLi/f8KnND+sAa4KiKeiYiVEfE0sEvHtnfc0eXlmT+/OOg1c+bMzlGhP/zhDyW3qampYc899+z+9uvspZde6vx5r7326nW7iGD8+PFD/v4AF1xwAW1tbUQEc+fOZauttup1277WjRkzhiuuuKLkqNApp5zSubxjJG5dHHjggRx11FE9lm+00UZcfvnlALS1tXHppZcO6nUvueQS2traAPjhD3/Ixhtv3GObj370o/zLv/wLAPfddx/333//IKvvqb6+vuTPkrRebL6I1Zs8z6n3wOpNnoPNHyp3RSPe2lytdkf7/S4RsWFm+cz2+98DdwMrgQLF02Ed9sq853y62ifz8497e/OU0l1Ax2zfnYAvANsD/xc4CXgZeoajjsd9haOObaZMmVLyF+W62mKLLTp/LkfDwLa2Nn73u+KZ0BkzZjB16toPre677769njLaaKONeP/73w/A008/vdbv0eG4447rdd306dOZNGkSALfeeuugXrdj+4aGBnbfffdetzv++ON7PGddZL/Hb6ONNlrn15OkTps9DpOu7Xr74LfZaGUt594OG62shQ9+u+c2mz1e7spHlMHOOYLe5x3NbL+/I6X0VvsVbR+h67yjjm3eABZ3e93J7fdvAQv7qeFeioGoFvjvlNJb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\n",
1465 "text/plain": [
1466 "Graphics object consisting of 3 graphics primitives"
1467 ]
1468 },
1469 "metadata": {},
1470 "output_type": "display_data"
1471 }
1472 ],
1473 "source": [
1474 "b = bar_chart(range(1,10))\n",
1475 "s = scatter_plot([(1,5), (4,2), (8,8), (4,7)],\n",
1476 " marker = \"*\", # symbol\n",
1477 " markersize = 100,\n",
1478 " edgecolor = \"green\",\n",
1479 " facecolor = \"red\"\n",
1480 " )\n",
1481 "t = text(\"wow, such plot!\", (1, 8), color=\"black\", fontsize=20)\n",
1482 "show(b + s + t)"
1483 ]
1484 },
1485 {
1486 "cell_type": "markdown",
1487 "metadata": {},
1488 "source": [
1489 "## Interpolation\n",
1490 "**References:** [[17](https://doc.sagemath.org/html/en/reference/polynomial_rings/sage/rings/polynomial/polynomial_ring.html#sage.rings.polynomial.polynomial_ring.PolynomialRing_field.lagrange_polynomial)] and [[18](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/interpolation.html)].\n",
1491 "\n",
1492 "When you need to work with a discrete set of data, like measurements of real-world quantities, it can be useful to visualize a \"smoothed out\" version of this data, for example by plotting a function that approximates it.\n",
1493 "\n",
1494 "One way to do so is finding the lowest-degree polynomial that passes through all your points. This is called [Lagrange Polynomial](https://en.wikipedia.org/wiki/Lagrange_polynomial)."
1495 ]
1496 },
1497 {
1498 "cell_type": "code",
1499 "execution_count": 139,
1500 "metadata": {},
1501 "outputs": [
1502 {
1503 "data": {
1504 "image/png": "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U4mKigrI75hgsX8/jB9vZ+CuXdt1msj0z39CVpZd0iQU+LxQ8jwvxvO8xz3P+8nzvHTP8zZ7nveI53llOtbff/9NmzZtePLJJwvd5osvvqBLly507tyZr7/+mmXLljFw4ECiovIe+qOPPqJevXo0btyYypUrM3DgQD777DPWrVvHQw89xEMPPcTkyZMB2LhxIzNmzMjz/BUrVjCvBBdYMzIy6N69O8cccwwffvghDz/8MOPGjePyyy9n2bJlBT5n2bJlTJ48mTPOOKPYx8kxYsQIbizBPPzz58/nmmuuoV+/fqxevZrk5GTGjh3L888/n2/bDRs2sH379tzbySefnG+bd955h+7duwPQokULpk6dyrp16/jwww8xxtC5c2eysrIAmDRpEr///nvucw8cOMCYMWPyFTlH8/7779OvXz9mzpzJoEGD+Oyzz/j111+5/vrryc7Ozt0uKiqK7t27884777Bx40amTZvGxx9/TD8fDHmpW7cuTz75JMuXL2f58uVccMEFdO/enTVr1uTbds6cOXz11VfULuC3dFHvV47Dz2GAq666ik8++YSXXnqJDRs28Oabb+Z+L9Dn8OLFixkwYABffvklH330EZmZmXTu3Jm///672Mcr6TmclZVFbGwsgwcPplOnTgVuM3HiRIYNG8aIESNYs2YNI0eOZMCAAXneh3379tGwYUOefPJJatWqVejxsrOzee+993LP81mzZnHddddx0003sWrVKpYuXUrv3r1ztx83bhx79uzJ/XrPnj2MHTu22K+vKDfeeGOJPmhkZGRQvXp1HnzwQZo1a+azHKFg+nTbkfuee1wniVz16kFCAixY4DpJMRljfHoDHgR2AhcDDYArgD3AHaYYUlNTDWBSU1ML/P5PP/1kAPPtt9/m+17Lli3NQw89VOQxbr75ZnPPPfcU+v0ePXqYa6+91hhjzJ9//mluu+02c+WVV5pmzZqZRx55xHTp0sWsW7fOpKenm4SEBNOnT5/c527evNnExcWZyZMnG2OMyczMND169DDdunUz+/fvz3OcV155xdSsWdOsXbs2z+N79uwxJ598svnoo49M+/btzR133FHkazrc8OHDzQ033FDs7Xv16mWuuOKKPI+NGzfO1K1b12RnZxtjjPn0008NYHbv3n3Uff3yyy+mXLlyhW63atUqA5gffvjBGGPMu+++a1q2bGkGDx5srrjiCnPeeeeZcePGmczMTPPKK6+YypUrm40bN+Y+f+DAgebkk082e/fuNcYYk5KSYqpVq2YWLFiQ5zi7du0y55xzjunfv/9R8z777LOmbt26R92mtI455hjz4osv5nls69atpk6dOmb16tWmfv36Zty4cUfdx5HvV47Dz+H58+eb+Ph48+effxa4Dxfn8OF+//13A5jFixcf9bUerqTn8OFuuOEG071793yPt27dOt//+zvuuMO0adOmwP0c7efz2WefmRo1apisrCxz8OBBU6dOnXw/68NNnTrVtGzZ0txyyy3mlltuMS1btjSvvvqqMcaYkSNHmuOPP97s3Lkzd/tu3bqZ8847z2RlZRXxaq0bbrjBDB8+vFjbHqk0v2NCVVaWMY0bG9Ojh+skMmSIMXXrGnPoT4wrxatrirthsXcI7wIvHfHYLOC14qQubaG0Y8cOA5gJEyaY1q1bmxo1aph27dqZJUuW5NkuKyvL1KhRI9/jOVasWGFq1qxppkyZkufxF154wQCmd+/eeR7/9ttvTfny5c3s2bNNZmamadOmTYG/pEvi+uuvN0OGDDHGlO6XWEn/yPTs2TO3MMwxadIkA5iffvrJGPP/hVKDBg1MrVq1zAUXXGAWLlyYb1/PP/+86dixY4HH2bt3rxkyZIg58cQTTUZGRu7jf/31l2ncuLGpVKmSWbFiRZ7nXHnllSYxMdEcPHjQzJ8/35QrV858/fXXxX5tR7Nt2zbTvn17c8011/hkfzkyMzPNm2++acqXL2/WrFmT+3hWVpY5//zzzfjx440xR/9DbEzh79eR5/Dtt99uOnbsaO677z5Tu3Ztc/LJJ5u7777b7Nu3L8/+AnkOH27Tpk0GMN9//32xn+OPQumss87K90Hq/vvvN+XKlTMHDhzIt/3Rfj733HOPueWWW4wxxnz11VcGMC+//LJp3ry5qVWrlunSpYtZvXp1nuf873//MzVr1jQ1a9Y0v/zyS+7jmZmZpnXr1uayyy4zxhgzceJEEx8fb37++ecSvWYVSkWbN8/+1Vu61HUSmT/f/iyO8hkrEIpV1/ijj1IK0NHzvFMAPM9rBrQF3i9o44yMDNLS0vLcSmPz5s2AbbLv06cPH3zwAWeddRYdO3Zk06ZNudt9+eWXZGdnc+655+Z5ft26dalQoQJnn302AwYM4NZbbwVg9+7d9O/fn48//phmzZrRqFEjunbtmtvnonnz5jz++OP06dOHO++8kx9//JEXX3yxVK8BYMaMGaxYsYJRo0aVeh8lddFFF/H222/zySefkJ2dzcaNG3P7Zmzfvh2A448/nsmTJzNr1izefvttTj31VDp27Mhnn32WZ19z587NvRyRIzk5mSpVqlClShU++OADPvroI8qXLw/ABx98kHu59J///CeDBw/m2Wefzb3U9MILL7B9+3YGDx7MjTfeyPDhw0lMTCzT6+3VqxeVKlWiTp06xMXFlenndbjvv/+eKlWqUKFCBfr168fs2bNJSEjI/f7o0aOJiYlhcBHjkY/2fkH+c3jz5s2kpKSwevVqZs+ezfjx43nrrbcYMGAAEPhz+HDGGO666y7atm3L6aef7pN9ltZFF13Eiy++yDfffIMxhuXLl/Pyyy9z8OBBdu7cWaJ9HX55+fDfPQ899BDvvvsuxxxzDO3bt2fXrl0ATJ8+nauuuoqLL76Yiy++mCuvvJLp06cDEB0dzfTp0/nkk0+4//77ufvuu0lKSqJ+/fo+fPUCdoLJ1q3hiF//4kC7dlC+fIhcfituRVXcG+ABo4Bs4OCh+2GHvp/P8OHDDZDvVrlyZVO5cmXz2Wef5dm+sBalpUuXGsAMGzYsz+NNmzY1999/f+7XQ4cONTfeeGO+HJs3bzbfffedmTx5sjn22GPNG2+8YYwxZv369bn/bt++vTHGmG+++ca88847uc/Nysoybdq0MYCZP39+QS+zWH755RdTo0YNs3LlytzHivNp77PPPst9vypXrmzKlStnYmJi8jz2xBNPFPr87OxsM3ToUFOxYkUTHR1tjjnmGDNixAgDmK+++qrQ511yySWmW7duuV+npqaa8uXL5/sk/Ndff5mNGzeaxYsXm27dupmzzjrLpKenG2OMSU5ONjt27DCffvqpGT58uMnIyDBPP/10nk/4H374oQHMueeeazIzM4/6XhTH9u3bzbp168ycOXNMQkKCuf322wvdtm/fvnnex6PJyMgwmzZtMsuWLTP333+/qVatWm6L0vLly03NmjXNtm3bcrcvrMXiaO+XMfnP4QsvvNBUrFjR/PXXX7mPzZo1y3ieZ/bt2xfQc/hI/fv3N/Xr1zdbtmw56nZlPYcPV1iL0r59+8xNN91kYmJiTHR0tKldu7YZOnSoAcyOHTvybV/Yz2ft2rWmUqVKuS12r7/+ugHMCy+8kLvN/v37TbVq1cykSZOMMcaMGTPGpKWlmalTp5qpU6eatLQ0M2bMmDz7zWnxu/rqq4t8jdOnT8/z3sTExJhy5crleWz69OlF7seYyGlR+vpr24Ixa5brJJKjY0djunZ1GsHZpbd/AVsO3TcFrgP+BG4oKOX+/ftNampq7m3dunUGMCtWrDCbNm3Kd/mgsEJp8+bNBjCvvZb3Ct9VV12V51JD48aNzezZs4/6zj322GPmlFNOyfd4zh+ZI23fvt1Uq1bNREdHmwkTJhx130cze/ZsA5jo6OjcG2A8zzPR0dGFFgn79u0zmzZtyr0NGjTI9OzZM89jhfVfOVxmZqbZunWrycjIMO+//36hf0ByPP7446Zx48a5X8+YMcM0a9bsqMfIyMgwlSpVyv3DnSOnUCrIgw8+aKKjo02DBg0KvSRbWkuWLDGA+fXXXwv8/o4dO/K8jyXRsWNHc9tttxljbJ+vnJ/j4T/bqKgoU79+/UL3UdD7deQ5fP3115tGjRrled7atWsNkKd/lzH+P4cPN3DgQFO3bl2zefPmIrf11TlsTOGFUo4DBw6YLVu2mMzMTJOcnGyqVq1aYF+gwgqlJ598Ms/+Fy5caIB8l/PPOecc88ADD+R5LKdQKsg111xjoqOjTcuWLc3BgwcLzW+MMWlpaXnem549e5pBgwbleSwtLe2o+8gRKYXSVVcZ06iRMT74rCU+8tRTxsTGGnNE18dAKlZdE+OHRqqngSeNMTnDbL73PK8+MKygjStUqECFChXyPd6oUSPiSjCvfIMGDahdu3a+YcgbN26ka9euAGzatImff/6Zzp07H3VfxhgyMjLyPb5o0aICt7/55ps5/fTT6dOnD7fccgsdO3bMc8mluDp27Mj333+f57GbbrqJxo0bc9999xEdHV3g82JjYznppJNyvz722GNJS0vL81hxREdHU6dOHQDefPNNWrduTY0aNQrd/ttvv+X444/P/Xru3LlceumlRR6noPe3Q4cOBQ5d//zzz3nqqaeYN28e999/P4MGDeKVV14p5isqmrHFfYE/b4AaNWoc9T0oat85+73uuuvyjca66KKLckdKFXc/BZ3Dbdq0YebMmezdu5cqVaoA9ryPioqibt26efbl73M4J++gQYOYPXs2ixYt4sQTTyzyOb46h4ujXLlyue/LjBkzuOSSS/KNjD2auXPn5l6aBztSsUKFCmzYsIG2bdsCcPDgQX7++ed8l88KG8n3n//8h7fffptFixZx9dVX89hjjzFy5MhCM1StWpWqVavm+frYY4/1y/sVDn76Cd56C557Dgr5NSoOdO4MQ4fC0qVwwQWu0xTOH4VSJezltsNlUcapCHbt2sUvv/zCr7/+CpBbENWqVYtatWrheR733nsvw4cPp1mzZjRv3pxXXnmF9evX89ZbbwH2F1ynTp2oVKlS7n6TkpI44YQTcodSp6Sk8MwzzzBo0KBi5UpKSuKLL77gu+++o169erlD7b/66qs8/UqKo2rVqvn6cVSuXJnjjjvOr/07du7cyVtvvUWHDh3Yv38/U6dOZebMmSxevDh3m/Hjx9OgQQOaNGnCgQMHmD59OrNmzcqddDAzM5P58+fnmVdn8+bN/Oc//6Fz585Ur16dbdu2MXr0aGJjY/nnP/9ZZK49e/Zw3XXXMWjQILp27coJJ5zA2WefzSWXXMKVV15Z4tf5/vvvs2PHDhITE6lSpQpr165l6NChtGnThgYNGpR4f4d74IEH6Nq1K/Xq1WPPnj3MmDGDRYsW8cEHHwBw3HHHcdwRUwCXK1eOWrVqceqppwLFe78KOod79+7NY489xk033cTIkSPZuXMn9957LzfffDOxxVgS3ZfnMMCAAQN44403mDt3LlWrVuW3334DID4+vlh5Smvt2rUcOHCAXbt2sWfPnty51po3bw7Y4vHrr7+mZcuW7N69m7Fjx7J69eo8hfeBAwdYu3Zt7r+3bdvGypUrqVKlCieddBK///47y5YtY86cObnPiYuLo1+/fgwfPpx69erlmYesOOfp1q1buf322xk9ejRt27Zl2rRpXHzxxXTt2pVWrVr55s0pQM77s3fvXv744w9WrlxJ+fLlS10gB7Px4+GYY+zcSRI8mjaFmjXhww+Du1Dyx6W3acBW/n96gB7AH8Do4rSDFTbqberUqQX2ZTrycs2oUaNM3bp1TaVKlUzr1q3zNIe3bds232i2CRMmmCZNmphKlSqZuLg4c+aZZ5rk5ORiDctdt26diY2NzXNZJDU11TRo0MAMHTq0OC+3SIEY9fbHH3+YVq1amcqVK5tKlSqZjh07mi+//DLPNqNHjzaNGjUyFStWNMccc4xp27atee+993K///HHH+cbZr9t2zbTtWtXU6NGDVOuXDlTt25d07t3b7N+/fpi5brppptM06ZN8wxJf/bZZ82xxx5rtm7dWuzXl2PhwoWmdevWJj4+3lSsWNGcfPLJ5r777ityyoPiuPnmm039+vVN+fLlTfXq1U3Hjh3zTVlwpCMv7RTn/SroHDbGnoudOnUysbGxpm7duuauu+7Kd9m6IP44hwv6fwoUesmpIKUZ9Va/fv0Cj5tj7dq1pnnz5iY2NtbExcWZ7t275zsXcy7tH3nLuWT54osvFjidwIEDB8zdd99tatSoYapWrWo6deqUb9RbQbKzs03Hjh3NRRddlDsVhzHG3HnnnaZRo0Zmz549xXrtpRn1VtDrPNpl4FD155/GVK5szCOPuE4iBbnuOmOaN3d2+GLVNZ45dOnBVzzPqwo8dqhAqgH8CrwJPGqMKfj6xmHS0tKIj48nNTW1RJfeirJz506OP/54tmzZctSJ5KR0Bg8eTGZmJsnJya6jhC2dw+5deumltG3blqFDh7qOIsU0ahSMHAm//AKlvIoufvTaa3D99fD771C9esAP7xVnI59fejPG7AGGHLoFjV27djF27Fj9gfGT008/ndatW7uOEdZ0DrvXtm1bevXq5TqGFFNGBkyYADfcoCIpWOVcclu0CErRoyIgfN6iVIQiD+avFiUREYksL78Mt9wC69fDoa6AEoROOQU6dbKLFQdYsVqUQmZRXBERkeIyBsaMgW7dVCQFu/PPh08/dZ2icCqUREQk7Hz8MaxdC3ff7TqJFOX8822r36GFIIKOCiUREQk7zz4LzZrZpTIkuOVMoVfING/OqVASEZGwsmkTvPce3HEHeMXqhSIu1aoFp50WvJffVCiJiEhYmTDBDjXXAMXQEcz9lFQoiYhI2EhNhWnToF8/qFjRdRoprvPPhx9+gK1bXSfJT4WSiIiEjZdftvMn3X676yRSEjn9lIKxVUmFkoiIhIWsLLvw7VVXwWHrdUsIqFbNrv0WjIWSPxbFFRERCbh58+Cnn+A//3GdREqjQwd4/33XKfILmhalpKQkEhISSExMdB1FRERC0LPPwrnngv6MhKbzzoMffwy++ZS0hImIiIS8776z8yb95z/20puEnl9/hTp1YOZMuOKKgBxSS5iIiEhkePZZqFsXevRwnURKq3ZtaNgQUlJcJ8lLhZKIiIS0P/6A11+HAQOgXDnXaaQs2rZVoSQiIuJTL7wAUVHQp4/rJFJWbdvCt9/Cnj2uk/w/FUoiIhKyDh6EiRPh2mvhuONcp5GyatsWsrPhyy9dJ/l/KpRERCRkzZ1rOwEPHOg6ifhC48a24A2my28qlEREJGQlJdlWiDPOcJ1EfMHzgq+fkgolEREJSatXw6JFak0KN23b2ktvBw+6TmKpUBIRkZCUnAy1amlKgHDTti3s2wcrV7pOYqlQEhGRkJOWBq+9BrfdBuXLu04jvnTWWVCxIixZ4jqJpUJJRERCzquvQnq6LZQkvJQvDy1bqlASEREpFWNsJ+6ePe2SFxJ+2rSBL76wP2vXVCiJiEhIWbgQ1q+3M3FLeGrVCnbsgF9+cZ1EhZKIiISYpCRo0gTatXOdRPylZUt7HwwTT6pQEhGRkPHLL3aSyYED7Zw7Ep5q1IATT4SvvnKdJIgKpaSkJBISEkhMTHQdRUREgtQLL0CVKnbJEglvrVoFR4uSZwLbU6rIg6WlpREfH09qaipxcXGByCQiIiEgIwPq1YN//QsmTHCdRvzt2WfhvvvsVBB+mgKiWG2SQdOiJCIicjRvvQV//AH9+7tOIoHQqpUtjletcptDhZKIiISEpCTo1MkunCrhr3lz25Lk+vKbCiUREQl6K1bYeXU0JUDkqFABzjxThZKIiEiRkpJs/6RLLnGdRAKpVSv3I99UKImISFDbtQveeAP69YOYGNdpJJBatYIff7R901xRoSQiIkFt6lTIzoZbb3WdRAItZ+JJl61KKpRERCRoZWdDcjJcdZWdhFAiS4MG9ufuslBSI6aIiAStDz6AzZvh9dddJxEXPM/9xJNqURIRkaA1aZId+ZRzCUYizznnwLJlENj5sf+fCiUREQlKv/wC770Ht9+udd0i2dlnQ2qq7dTtggolEREJSi++CJUrQ69erpOISy1a2PtvvnFzfBVKIiISdA4etIXSddfZRXAlclWrBvXrw/Llbo6vQklERILOvHmwfTv07es6iQSDs89WoSQiIpJr0iQ491w44wzXSSQYtGhhl7HJzg78sVUohQBjID3ddmZLS3PX819EJBA2bYKPPrIzcYuAbVFKS4Mffgj8sYNmHqWkpCSSkpLIyspyHcW57dvhww9h0SJYtcrOIZKW9v/fL18ejj/eftJq0QIuvNAOnY2OdhZZRMRnJk+GY4+FK65wnUSCRU6H7uXL4ZRTAntszwS2eaLIg6WlpREfH09qaipxcXGByBQUsrJg9myYMgU+/ti2GjVvDomJ0KgR1K4NFSva7f74A7ZsgZUr7dwSu3fDccfBv/5lp/hv3tzxixERKaX9+6FuXbjhBhgzxnUaCSYNG0KPHj49L4o16UTQtChFKmNg5kwYPhzWr4c2bey1+csvt5+oipKVBV9/DXPmwGuv2RW2O3aEBx6A88/X3CMiElpmzYI//4TbbnOdRIKNqw7d6qPk0IYN9rLZ1VfbVqMvv4SUFOjTp3hFEtjLba1bw+jRdnK2mTPtStsdO9rb6tX+fQ0iIr40aRJccAGceqrrJBJszj7bdugOdA8dFUoOGAMvvWQvkf30E7z/Prz7btmn6I+Jsdf0v/kG3nkHtm61x7jjDti71xfJRUT8Z/Vq+2FRnbilIC1a2L9lGzcG9rgqlAIsPR2uv972JbruOvj+e+ja1bfH8Dzo1s3+0nnySTtpW/PmsHSpb48jIuJLL7wANWtC9+6uk0gwOussex/oGbpVKAXQrl3QubO9Bj99uh3ZUamS/45Xvjzcc48dOVezJpx3HowY4WYeChGRo/n7b3j1Vfshsnx512kkGB1zDJx0UuD7KalQCpCtW6FtW1i3DhYuhGuuCdyxTzoJPvsMRo6ERx+FSy+1I+VERILFjBmwZ4/toylSGBcdulUoBcD27bZz4t9/w+efQ6tWgc8QHQ0PP2z7Q33+uZ12YO3awOcQESnIpEnwz3/aNb1ECtOihZ0aJ5AdulUo+dnOndCpky2SFi4M/ERZR+rSxVbjsbG2hUv9lkTEteXL7U2duKUozZvbv6c//hi4Y6pQ8qOMDNspcedO+OQTOwVAMGjYEJYssTN7d+pkR8iJiLgyaRLUq+f7gS0Sfpo1s/crVwbumCqU/MQYO2FazlD9xo1dJ8rrH/+ADz6ASy6xM52++qrrRCISif76C9580/6+1DJMUpTq1aFOHRVKYeGpp2zx8fLLZZ8fyV8qVrQdKG+5BW680Y7EExEJpOnTbev7Lbe4TiKhonnzMCiUPM+r43nedM/z/vQ8b5/neSs9z2vhj2MFo08/hWHD7DIivXu7TnN00dG22fvmm+3aSm++6TqRiEQKY+zvn8suswt9ixRHoAsln6/15nneMcBS4FOgK/A70Aj4y9fHCkY7d8K110KHDnYofiiIirJzOmVl2ezR0XDVVa5TiUi4W7oU1qyB8eNdJ5FQ0ry5HU2+Y4edI9Df/LEo7n3AFmPMTYc99nNhG2dkZJCRkZH7dVpamh8iBYYxtvk4I8MuUBtK19ujouwM3pmZthUsPh4uush1KhEJZ5Mm2XneLrjAdRIJJc2b2/tVq+wkzv7mj0tvlwLLPc+b6Xne757nfet5XqFTiI0aNYr4+PjcW7169fwQKTAmTrQdt196yXY2CzXR0TB1qh15cvnlgZ8mXkQix86ddhHvvn3tBzWR4mrYEKpUCdzlN88Y49sdet7+Q/8cC8wEzgHGA32NMa8cuX1BLUr16tUjNTWVuLg4n2bzp//9D5o0sZeuJk1ynaZs/v7bfsL7+Wf44gt7UoqI+NIzz8CDD8K2bVCtmus0EmratoUTToA33ijTbrxibeSHQukAsNwYc+5hj00AEo0xRc5JnZaWRnx8fEgVSsbAxRfDd9/Z2a5DJPZR/fEHnHuuXWD388/1i0xEfCc7G0491Y4I1mhbKY1Bg+z8hGVcYaJYhZI/Gjy3A0dGXwec4IdjBYUZM2D+fEhODo8iCexcFR98YOc4ufJKOHjQdSIRCRcLF8IPP2gmbim95s1hwwbYt8//x/JHobQUOPWIx04B/ueHYzm3ezfccQdccYVdbDacNGoEs2bZkSlDhrhOIyLhYuJEOP10aNPGdRIJVc2b25bJ77/3/7H8USiNA1p5nveA53kneZ7XG7gNSPLDsZx77DFb0T77rOsk/nHeefD887a17IUXXKcRkVD3668wd65tTfKKdeFDJL8mTewApEB06PZ5oWSMWQb0AHoBq4GHgSHGmNd9fSzXNmyA556zE0vWru06jf/cdhv07w8DB8Jnn7lOIyKh7KWXoEIFO/BFpLQqVoTTTgtMoeTzztxFKPJgodSZu1s32+y3fr39oYWzgwftfBXr1tkTs1Yt14lEJNRkZsKJJ0KXLjBlius0Euquu872dfvii1Lvwlln7ojw0Ufw7rvw9NPhXyQBlCtnO617np2QMivLdSIRCTXz58PWrerELb7RvLkdbe7vv0cqlErBGLuW27nn2k7ckaJmTbsW3OLFMHKk6zQiEmomTYKzz4YWEbPyp/hTs2a2j/Dmzf49jgqlUpg7185a/cQTkdcZsUMHWyQ9/jgsWOA6jYiEip9/ti1Kffu6TiLh4vTT7b2/R76pUCqh7Gx45BE7c3WHDq7TuPHAA3DhhXDNNXZWXRGRokyZAlWrQq9erpNIuKhZ006GrEIpyLz1lv2hPPaY6yTuREXZ2XQrVLC/9NRfSUSO5sABO9rt+uuhcmXXaSRceB40bQqrV/v3OCqUSiArC0aMsCM2zj23yM3DWvXqdo2dlBTboV1EpDBz58KOHbrsJr53+ulqUQoqM2fa4fGPPuo6SXBo1w7uvddeivz2W9dpRCRYTZpkFzHN6VMi4itNm8KmTZCe7r9jqFAqJmPgqads35zERNdpgsejj9oZUq+5xr8nqoiEpg0b7NpumhJA/KFpU9t3eP16/x1DhVIxffKJbTUZOtR1kuBSoYLtr7R5M9x3n+s0IhJsJk+G446Dyy93nUTCUZMm9t6fl9+CplBKSkoiISGBxCBtrnnqKTjrLOjY0XWS4NOkCYwebZdz0ZQBIpIjPR2mTYObboqMiXkl8KpWhQYN/FsoaQmTYlixwk6QNmMGXH216zTBKTsbLroI1qyxJ+xxx7lOJCKuvfaaHem2cSOcfLLrNBKuLr3ULrM1f36Jn6olTHzl6aft+kRqOi5cVJT95JieDkOGuE4jIsFg0iTo1ElFkvhX06YRcuktWG3bZudOuvNOiIlxnSa41akD48fbPkvvvus6jYi49N138Pnn6sQt/nf66fZv9e7d/tm/CqUiTJ5sr63fcIPrJKHh+uvtPFP9+kFqqus0IuLKCy9ArVr2soiIPzVtau/9NfGkCqWjOHDA/me//noIku5SQc/z7HuWmmrnWBKRyLN3r+2fdOutUK6c6zQS7k491Z5n/rr8pkLpKGbNsrPJDhjgOkloOeEE269ryhT4+GPXaUQk0N58E/7+G/r0cZ1EIkG5ctC4sf8KJY16O4o2bexlt08+cRojJGVn26kUfv7ZnrxVqrhOJCKBYIwdJVynDsyb5zqNRIreveGXX+yyWiWgUW9lsXKl7Yg4cKDrJKEpKgpefNG2yD34oOs0IhIoy5fbyXnViVsCKWdxXH+0/ahQKsSLL8Lxx0O3bq6ThK5GjeCJJ+xElF9+6TqNiATCpEn28nuXLq6TSCRp2tT2jd261ff7VqFUgP374fXX7Ug3TQlQNoMH2xnN+/WDzEzXaUTEn/76y/ZPuu02iI52nUYiSc6Cy/7op6RCqQBz5tj/8Dfd5DpJ6IuOtp8wv/8eJkxwnUZE/Om11+wMyTff7DqJRJr69W1f2JUr09mxYwfpPlylXYVSAV56Cc47D045xXWS8HD22Xbk4COPwJYtrtOIiD8YYz8UXXaZ7bYgEkhLl6ZQvlxPHn6oCrVq1aJqlSpc0bMnS5cuLfO+VSgd4eef7Sg3fSLyrcces3NRDR7sOomI+MPSpbB2rTpxS+BNnDiRdu3aUf2veYwx2bwDPJOdzbp58zjvvPOYNGlSmfav6QGOMGIEjBkDv/0GlSsH/PBh7b//tYsKz52r2XpFws2118LXX8P69XbUq0ggpKSk0K5dOwYZwzjytv5kA0OA5z2PJUuW0KZNmyOfrukBSio7G6ZOhX/9S0WSP1x5pR0JM2iQnYxORMLDzp0wc6btxK0iSQJp/NixnBYdna9I4tDX44HToqMZP25cqY+hU/owS5bYCavUids/PA+SkuD332HkSNdpRMRXpk2z9zfe6DKFRJr09HTmzJ1Ln8zMQouZKKBPZiazZ88udQfvoCmUkpKSSEhIIDEx0VmG11+HBg2gdWtnEcJew4bw8MMwdqz/ppsXkcDJzrbrO155JVSr5jqNRJK0tDSysrNpVMR2DYGs7GzS0tJKdZygKZQGDBjA2rVrWbZsmZPjZ2TAW2/ZadC9Yl21lNK65x47GeXgwf6ZRVVEAmfhQvjhB3XilsCLi4sjOiqKH4vYbjMQHRVV6n7PQVMoufbhh7B7N1xzjesk4a98eRg/HhYtssWpiISuSZOgSRO7NqZIIMXGxnJZ9+5MiYkhu5BtsoEpMTH06NGD2NjYUh1HhdIhb7wBzZpBQoLrJJGha1e7PMzdd6tjt0io+vVXO0Fvv35qiRc3htx1F+uysrgT8hVLOaPe1mVlMeTOO0t9DBVKwJ498M479rKbBM64cXbR3NGjXScRkdJ4+WWoUAGuu851EolUbdu2JTk5mec8j6YxMYwH3sGOdmsaE8PznkdycnJBUwMUmwol7Cei9HQ7LYAETqNGtr/SU0/B5s2u04hISWRlweTJ0KsXxMe7TiORrF+/fixZsoSE7t25JyqK7sA9UVEkdO/OkiVL6FfGDnSacBK4+GLbqvTZZwE5nBzm77+hcWNo0cIWrCISGt59114+X7bMLlMkEgzS09NJS0sjLi6uOH2SNOFkcaSmwkcf2aGtEniVK8Mzz9jZuj/80HUaESmuSZPsBxwVSRJMYmNjqVmzZqk7bhck4gulefPsatc9e7pOErmuugrat4c77oADB1ynEZGi/O9/8P77mhJAIkPEF0qzZkGrVlCnjuskkcvzYMIE2LQJnnvOdRoRKcoLL0DVqurXKZEhogulvXvhgw/g8stdJ5EzzoD+/e3SJtu3u04jIoXJyIAXX7TLlVSp4jqNiP9FdKE0fz7s369CKViMHGkno3zwQddJRKQws2bBH3/A7be7TiISGBFdKL31Fpx1Fpx4ouskAnDssbZYmjYNvv3WdRoRKUhSElxwgR2tKhIJIrZQSk+H995Ta1Kwue02OPVUO2O31oETCS4rV8Lnn9vL5CKRImILpY8+snP4qFAKLuXKwZgx8OmndrZ0EQkeEydC7drQvbvrJCKBE7GF0rx5tun41FNdJ5Ejde0KF14I996r6QJEgsVff8H06dC3L8TEuE4jEjhBUyglJSWRkJBAYmKi34+VnW1nlb3kEr8fSkrB82yr0o8/QnKy6zQiAvDqq/aDS58+rpOIBFZELmGyfDkkJsKiRXaiQwlOffvCzJnwww+2o7eIuGEMnHYaNGsG//mP6zQiPqMlTAozbx784x9QhsWEJQAefRQyM+29iLjz6aewYYM6cUtkishC6d13bT8YXWcPbjVrwgMP2OHIGza4TiMSuZKSoEkTaNfOdRKRwIu4QmnbNlixwq56LcFvyBC7vMzQoa6TiESmrVvtotX9+9v+gyKRJuIKpffeg+houOgi10mkOCpWhNGj7VQBCxe6TiMSeaZMgdhYuPZa10lE3Ii4ztzdukFaGixe7PNdi58YA+eeaycJ/eYbW+iKiP8dOAD160OPHhqBKmFJnbmPtG8ffPyxLruFGs+DceNg1Sp45RXXaUQix5w58Ntv6sQtkS2iCqWFC+0iuJo/KfS0agVXXw0PP2wLXhHxv+Rk24H79NNdJxFxJ6IKpQ8+sAvgajbu0PTvf9tVy8ePd51EJPytXm27KKg1SSJdRBVKCxbYTtwauRGaGjaEAQPgySdtwSQi/jNxop2io0cP10lE3IqYQumnn2DTJujc2XUSKYuHHoKoKE1CKeIv6enpbNq0g2nT0rntNihf3nUiEbciplD66CM7Wur8810nkbI47jgYNgwmTbKFr4j4RkpKClf07EnVKlU45ZRapO+rwjfLe7J06VLX0USc8nuh5HneMM/zjOd54/19rKNZsABatrRLl0hoGzwYatWys3aLSNlNnDiRdu3asW7ePJ7JzuYdYCzZ/PzRPM477zwmTZrkOqKIM34tlDzPSwRuA77z53GKkpkJn3yiy27hIjYWHn8c3noLvvzSdRqR0JaSksKAAQMYZAzfZ2YyBOgGDAG+z8xkoDH0799fLUsSsfxWKHmeVwV4HegD7PbXcYpj+XL46y8VSuHk2mvtSub33msnpBSR0hk/diynRUczjvx/EKKA8cBp0dGMHzcu4NlEgoE/W5SSgPeMMR8fbaOMjAzS0tLy3HxtwQKIj4fERJ/vWhyJjoannoKUFLsOlYiUXHp6OnPmzqVPZmahfwyigD6ZmcyePZv09PRAxhMJCn4plDzP+xdwFjCsqG1HjRpFfHx87q1evXo+z7NgAXTqBDExPt+1ONS5M1x4Idx3Hxw86DqNSOhJS0sjKzubRkVs1xDIys72ywdZkWDn80LJ87x6wLPAtcaY/UVtP2zYMFJTU3NvW7Zs8Wme1FTbj0WX3cLT6NF29NtLL7lOIhJ64uLiiI6K4scittsMREdF+WX9TZFg548WpRZADeAbz/MyPc/LBNoDg2NiYsjKysqzcYUKFYiLi8tz86VPP4WsLNvyIOHnzDNtf6Xhw2HPHtdpREJLbGwsl3XvzpSYGLIL2SYbmBITQ48ePYiNjQ1kPJGg4I9C6ROgKdD8sNty4PWVK1cSHeCl3xcsgJNOskuXSHh6/HHbcjhmjOskIqFnyF13sS4rizshX7GUjR39ti4riyF33hnwbCLBwOeFkjFmjzFm9eE34G/gz9MdrKz46afQsWPADysBdMIJcMcd8PTTsH276zQioaVt27YMHJjMBDxOj45hPPAOdrRb05gYnvc8kpOTadOmjdOcIq6E9czcv/0G69dDhw6uk4i/DRsGFSvCiBGuk4iEns2b+3HSSUto0r0790RF0R24JyqKhO7dWbJkCf369XMdUcQZzwR2EpoiD5aWlkZ8fDypqall7q80Ywb06mVbGWrVKtOuJASMGwf33APffw8JCa7TiISGH3+Ek0+GF1+Em2+2UwakpaURFxenPkkS7rzibBTWLUqLFkHjxiqSIkX//lC/vm1dEpHiSUqCY4+1HyrBdvCuWbOmiiSRQ8K+UNIiuJGjQgV44gl45x1YssR1GpHgt3evnVrj1lvt0kAikl/YFkq//gobNqh/UqS5+mpo0QKGDtXSJiJFee01WyzdfrvrJCLBK2wLpcWL7b0KpcgSFWUnofzyS3j7bddpRIJXdjaMHw89e9pL1iJSsLAtlBYtsh16a9RwnUQCrWNH6NLF9lXS0iYiBZs/HzZuBE2PJHJ0YVsoffqpWpMi2ejR8MMPMGWK6yQiwWnsWDjnHGjd2nUSkeAWloXStm12/S915I5cZ5wB118PI0dqaRORI61aBQsX2tYkr1gDpEUiV1gWSosW2fv27Z3GEMcefdQubfLMM66TiASX8eOhbl24/HLXSUSCX9gWSqefDtWru04iLp1wAgwebNeA++0312lEgsNvv8Ebb8CgQVCunOs0IsEvaAqlpKQkEhISSExMLPO+Fi9Wa5JYw4ZB+fL2EpyIwMSJEBMDffq4TiISGsJuCZMdO+xM3DNm2Dl1RMaMgfvugzVr4NRTXacRcSc93U4FcPXV8NxzrtOIOBeZS5h8/rm910LXkmPAANsfQ0ubSKR7/XXYuRPuuMN1EpHQEXaFUkqK/cRUt67rJBIsKlaExx+H2bNh6VLXaUTcMMZ24u7WDU46yXUakdARdoXS0qVqTZL8eveG5s21tIlEro8+spefNcGkSMmEVaG0bx988w20bes6iQSbqCh46il7aXbuXNdpRAJv3Dj7YUEDXURKJqwKpWXLIDNTLUpSsAsvtLf777fniUikWLcOPvhAE0yKlEZYFUopKRAXB02auE4iwWr0aLu+1UsvuU4iEjjjx9vRwP/6l+skIqEnrAqlpUvh3HMhOtp1EglWZ54J11wDI0bA3r2u04j4386d8OqrMHCgnVNMREombAql7Gzb/0SX3aQojz0Gu3bZRUFFwl1Skr3c1rev6yQioSlsCqU1a+y6XurILUVp0MAu3/D003aCUpFwtW+fnVjy1luhWjXXaURCU9gUSikpdlr+c85xnURCwQMP2PPl0UddJxHxn6lT4a+/4K67XCcRCV1hUygtXQpnnQWVKrlOIqHg2GNtsTR5Mmza5DqNiO9lZtrle666yraiikjphE2hlJKi/klSMoMGwfHH24JJJNzMmgU//QT33us6iUhoC4tCaft2+N//7Ig3keKqWNF27H7rLfjyS9dpRHzHGDvB6oUX2pGeIlJ6YVEoffWVvW/Vym0OCT3XXgtnnKGlTSS8LFwIK1bY81pEyiZsCqXatbUQrpRcdLSdhHLJEpg3z3UaEd946inbktSxo+skIqEvaAqlpKQkEhISSExMLPFzv/wSWrb0QyiJCBddZP+gaGkTCQcrV8KCBbY1ScuViJSdZwJ7vaHIg6WlpREfH09qaipxcXFF7jArC/7xD3joIbjvPl9ElEj0zTdw9tkwZYqdc0YkVF1zjZ18d9MmOwWGiBSqWB8lgqZFqbTWrrVLUahFScqiRQvo1QseeQT+/tt1GpHS+fln+M9/4O67VSSJ+ErIF0pffQVRUbY1QKQsnnjCros1frzrJCKlM26cbWG/6SbXSUTCR1gUSk2aQJUqrpNIqDvxRBgwwHbu/uMP12lESubPP+HFF+3it5Uru04jEj7ColDSZTfxlYcesi2Ujz3mOolIyUyYYKe4GDDAdRKR8BLShdLevXYxXBVK4ivHHWdHv02cCD/84DqNSPGkpdlCqW9fqF7ddRqR8BLShdLy5ZCdrUJJfOuOO6BmTS1tIqFj4kTYtw/uucd1EpHwE9KF0ldf2b5JCQmuk0g4iY2Ff/8bZs60iy2LBLP0dBg7Fm68EerUcZ1GJPyEfKF09tl2dmURX7r2WjjrLLjrLttqKRKsXnzRduTWPHIi/hGyhZIxmpFb/Ccqyn5K//prmDHDdRqRgh04YJcr6dULGjZ0nUYkPIVsobRtG2zfrkJJ/Kd9e+jRw3buTk93nUYkv1dfha1bYdgw10lEwlfIFkrLl9v7UiwNJ1Jso0fDb7/Z1iWRYJKZCU8+CT17qp+miD+FdKFUo4Y6L4p/nXyyncBv1ChbMIkEi//+F378UaMzRfwtZAulb76x63NpdWzxt4cfhgoV7L1IMMjOtiMzu3a1vwdFxH9CslAy5v9Xexfxt2OOgREj4KWXYNUq12lEYM4cO9nugw+6TiIS/oKmUEpKSiIhIYHEYnQ62rrVrsWlT1ISKP362ctwd99tC3URV7KzbeHesSO0aeM6jUj480xgf+sXebC0tDTi4+NJTU0lLi6uwG3mzLGjkbZsgbp1fR1RpGDz5sGll9r7Sy5xnUYi1axZcMUVsGQJtG3rOo1ISCtW552gaVEqiW++UUduCbxLLoELLrDLRBw86DqNRKKc1qROnVQkiQRKyBZK6sgtgeZ5MGYMbNwIL7zgOo1EolmzYPVqGDnSdRKRyBFyhVJOR271TxIXmjeHm26C4cNh1y7XaSSSZGfbAqlzZzj3XNdpRCJHyBVK27bB779rxJu488QT9tLbI4+4TiKRZOZMO9JNrUkigRVyhVLOjNxqURJXatWy/UQmToTvvnOdRiJBVpYtkLp0gVatXKcRiSwhVyipI7cEg4ED4ZRTYPBgTRcg/vff/8K6dWpNEnEhJAsldeQW18qXh2efhcWL7SUREX/JyoJHH4V//hPOOcd1GpHIE1KFkjpySzDp3Bm6d7eTUP79t+s0Eq5mzID16+3lXhEJvJAqlHI6cqtQkmAxdqydJf7JJ10nkXB04IAdNHDppVCMRQtExA9CqlD65ht7rxFvEiwaNoR774Wnn4bNm+1j6enp7Nixg/T0dLfhJOS99BL89JMdaSkiboRUobRiBVSvro7cElzuv9+elzfemMIVPXtStUoVatWqRdUqVbiiZ0+WLl3qOqKEoH37bN+ka6+F0093nUYkcvm8UPI8b5jnecs8z9vjed7vnufN8TzvVF/se+VKOPNMdeSW4FK5MnTuPJElS9qx9p15PJOdzTvAM9nZrJs3j/POO49Jkya5jikhZsIE+PNPjXQTcc0fLUrtgSSgFXAhEAMs8Dyvcll3vHKlnRlZJJikpKQwdeoABmNYnZXJEKAbMAT4PjOTgcbQv39/tSxJse3eDaNHQ9++cOKJrtOIRDafF0rGmC7GmGnGmDXGmFXATcAJQJm6YO/eDb/8As2a+SSmiM+MHzuW06KjGUf+/1BRwHjgtOhoxo8bF/BsEpqeesp25H7oIddJRCQmAMeIP3Rf4MpYGRkZZGRk5H6dlpZW4E5WrbL3alGSYJKens6cuXN5Jju70E8dUUCfzEzumT2b9PR0YmNjAxlRQsz27XaOrjvvhJo1XacREb925vY8zwPGAinGmNUFbTNq1Cji4+Nzb/Xq1StwX6tWQYUKdjZkkWCRlpZGVnY2jYrYriGQlZ1d6AcBkRyPPw4VK9rRlCLinr9HvT0PnAH0KmyDYcOGkZqamnvbsmVLgdutXAlNm0JMINrARIopLi6O6Kgofixiu81AdFQUcXFxgYglIWrTJpg82Y6k/Mc/XKcREfBjoeR53nPApcD5xpithW1XoUIF4uLi8twKsmqV+idJ8ImNjeWy7t2ZEhNDdiHbZANTYmLo0aOHLrvJUd13H9SuDYMGuU4iIjn8MT2A53ne80BP4AJjzE9l3efBg7BmjfonSXAactddrMvK4k7IVyxlY0e/rcvKYsiddwY8m4SOJUtg9mz4979B9bRI8PBHi1IScC3QG9jjeV6tQ7dS/9dfv96OAFGLkgSjtm3bkpyczHOeR9OYGMYD73BotBsxPO95JCcn06ZNG6c5JXhlZ9s1A88+G3oV2lFBRFzwR4+f2w/dLzri8ZtKu8OVK+39GWeUdg8i/tWvXz+aNm3K+HHjuGf2bLKys4mOiqJihe4kNr2Tvn1VJEnh/vMfWLYMFi2CqJBaL0Ek/HnGmEAer8iDpaWlER8fT2pqam5/pbvvtk3SOWtpiQSz9PR00tLSiIuL45NPYunWDf77X7jyStfJJBjt3w+NG9uuBXPmuE4jElGKtc5HSIwhW7VK/ZMkdMTGxuZ22r7kErjsMrjjDrjoItCgNznSs8/Ctm2wYIHrJCJSkKBv5DXGXnpT/yQJVc8+C2lp8PDDrpNIsPnjD9t5u18/zREnEqyCvlD69Ve7MKRalCRUnXCCXdj0+efh669dp5FgMnx43nsRCT5BXyjldORWi5KEsjvugDPPhFtusSM4RVauhBdegBEjoFo112lEpDBBXyitWgXx8VC/vuskIqUXEwMvvgjr1tlV4SWyGQODB8Opp8LAga7TiMjRBH2hlNM/yStW33SR4NW8OQwdatfyWrvWdRpxacYMO8Hks89CuXKu04jI0QR9ofTdd7rsJuHjkUegQQO49VbIynKdRlzYu9cueNujB1x4oes0IlKUoC6U9u+3i0Q2beo6iYhvVKxoL8F98QUkJ7tOIy6MGgU7d8KYMa6TiEhxBHWhtH69ndr/9NNdJxHxnfPOg9tvh2HD4H//c51GAunHH+GZZ+wl2BNPdJ1GRIojqAul77+3902auM0h4mtPPgnHHAO33WY79kr4M8Z23K5VC+6/33UaESmuoCmUkpKSSEhIIDExMfex1avtaDfNZizhJi4OJk+2szFPmeI6jQTCW2/BBx/Ac89BpUqu04hIcQX1Wm+9esXhefDuu4GIJhJ4t90Gb7xhBy00bOg6jfhLaiqcdhqcc47WcxMJIsUaTx80LUoFWb1a/ZMkvI0ZA9Wrw403ahRcOHvoIbuMzXPPuU4iIiUVtIVSair88osKJQlvVavCtGn/P6eOhJ/lyyEpCR59FOrVc51GREoqaAul9evtvaYGkHDXvj0MGQIPPKCJKMNNZib07Wvnghs82HUaESmNoC2U1q6F6Gg7xb9IuPv3v+1ElDfcAAcPuk4jvvL88/Dtt3ZNt5gY12lEpDSCtlBatw5OPtlO0CcS7mJj4dVX7R/VUaNcpxFf+OEH20o4cKDtxC0ioSloC6U1a9Q/SSLLOefYSSgfewy++sp1GimL7Gy45RY7Z5IKX5HQpkJJJIg88gicdRb06mUHNEhoSk6Gzz6Dl16CypVdpxGRsgjaQmn3bnXklshTrhy8+aZdC+z22zVrdyj66Sc78/btt8P557tOIyJlFXSFUnp6es6/1KIkEalhQ9v59803bb8lCR3GwK23QrVqMHq06zQi4gtBUyilpKRwRc+e1KldGwCP2gy7rydLly51nEwk8Hr1spNQDhgAGze6TiPFNXkyLFxol6WpWtV1GhHxhaBYwmTixIkMGDCA06Kj6ZOZSSPgR2BKTAzrsrJITk6mX79+gcwp4tzevdCihe3j8sUXUKGC60RyNJs2wZln2iJX6/eJhIRiLWHivFBKSUmhXbt2DDKGceRt4soGhgDPex5LliyhTZs2AYopEhy+/RZatbItS2PHuk4jhTl4ENq2hV277M+sShXXiUSkGEJjrbfxY8dyWnR0viKJQ1+PB06Ljmb8uHEBzybi2pln2r4u48ZpMdVg9uij8M03MH26iiSRcOO0RSk9PZ2qVarwTHY2Q47ypPHAPVFR7Nm7l9jYWH/mEwk6xsAVV8DHH9t1w04+2XUiOVxKil2GZsQIePhh12lEpASCv0UpLS2NrOxsGhWxXUMgKzubtLS0QMQSCSqeB1On2skLL78c/v7bdSLJkZoK111nL48OG+Y6jYj4g9NCKS4ujuioKH4sYrvNQHRUFHFxcYGIJRJ04uLg7bfhxx+hXz/NrxQMjLF9x/78015y01puIuHJaaEUGxvLZd27MyUmhuxCtsnGjn7r0aOHLrtJRGvSxI6mmj4dJk50nUamTIHXX4dJk+DEE12nERF/cd6Ze8hdd7EuK4s7IV+xlDPqbV1WFkPuvDPg2USCTe/edpHVIUNAU4y5s2IFDBpkZ9/u3dt1GhHxJ+fTAwBMmjSJ/v37586j1BB7uU3zKInkd+AAXHghrFsHy5ZB/fquE0WW3bvt/FbHHmuLVc1vJRKyQmMepRxLly5l/LhxzJ49m6zsbKKjoujRowdD7rxT8yeJHGHnTjjnHDv789KlGpIeKMZAjx6weLFtVdIlN5GQFlqFUo4dO3ZQq1YtfvvtN2rWrBmITCIhac0aO9qqUyeYNQuinF9ID39PPw1Dh8I770C3bq7TiEgZBf/0AAXJ6bCtjtsiR9ekiV04d+5ceOgh12nC34cfwv33w333qUgSiSRBVyiJSPFdcomduXvUKHjxRddpwteGDXD11dClCzzxhOs0IhJImvlDJMTdcw/8/LOdX6lWLVs8ie/s3g2XXgq1a8Mbb0B0tOtEIhJIKpREQpznwYQJsH07XHUVLFxo+y5J2WVm2pakP/6Ar7+G+HjXiUQk0HTpTSQMREfbyQ/POsu2KG3Y4DpR6MuZeXvhQpg5E046yXUiEXFBhZJImIiNtaOxatSwfWl+/dV1otD22GMwebKdgbtjR9dpRMQVFUoiYeTYY+3orMxM+8d9xw7XiULTlCkwfLjtuH3TTa7TiIhLKpREwky9evZyUWqqnWNp507XiULLO+/YjvH9+8OwYa7TiIhrKpREwtDJJ8Mnn8Dvv9vlTnbvdp0oNCxaZDtvX3aZ7SDvFWs6OhEJZyqURMLUaafZYmnLFrjoIhVLRVmyBC6+GM47z3aM1zQAIgJBVCglJSWRkJBAYmKi6ygiYeP00+Hjj2HzZujQQX2WCvPFF/DPf0LLljBnDlSs6DqRiASLoFvrLS0tjfj4eFJTU4mLiwtEJpGwt3at7a9UpYotnE44wXWi4PHll7bFrVkzmD8fKld2nUhEAiQ013oTEd9LSICUFDsarm1b2LjRdaLg8NFHdnTgGWfAe++pSBKR/FQoiUSIhg1tP5yqVaF1a/vvSDZrlu2T1L69nVKhalXXiUQkGKlQEokgderYAumMM+yluOnTXSdyY8oUu9zL5ZfbPkmVKrlOJCLBSoWSSITJmZSyd2+47jo7sWJguyq6k5UFd98Nt90Gt99uC8Xy5V2nEpFgpkVxRSJQ+fLw8stwyinwwAPw/fcwdWp4L/q6Z48tDt9/386RNHCg5kkSkaKpRUkkQnmenXl6zhw7k3eLFrBypetU/rFhA5x7LixebDttDxqkIklEikeFkkiE694dVqyAuDjbyfuFF8LrUtzrr9si8OBBO19Sly6uE4lIKFGhJCI0bAiffw433GDXObv4Yvj1V9epyubvv+HWW+Haa6FnT1i+HJo0cZ1KREKNCiURAexs1JMmwbvvwrff2lm933gj+FqX0tPT2bFjB+np6YVu88kn0LSpzf/yy/DKK3ayTRGRklKhJCJ5XHwxrF5tL1Fdc42dtXr9etepICUlhSt69qRqlSrUqlWLqlWqcEXPnixdujR3m9RUO6KtUyc7+/h338FNN6k/koiUnpYwEZFCvfsuDBkC//ufvX/oITcj4yZOnMiAAQM4LTqaPpmZNAJ+BKbExLAuK4vnnksmJqYfjzwC6enw1FO2YIrSR0ERKVyxPkKpUBKRo9q/H8aMgSeesJfn7rnHjhoL1EzWKSkptGvXjkHGMI68zeDZwBDgOTxgCddd14Z//xvq1g1MNhEJaSqURMR3fv0VRo2CyZNtkXTHHbbVpmZN/x73ip49WTdvHt9nZhbYVyAbSPBiqNuhOx8vfMu/YUQknARXoeR5npeampp95OMZGRlkZGTkfr1nzx4SEhLYsmWLCiWRILR1K4wda4fdZ2ZCjx5w883QqpXvL3Wlp6dTp3ZtnsnOZshRthsP3BMVxbZffyU2Nta3IUQkLMXHx8cDe0wRhVAgC6U4IDUgBxORsPIO0K2I73cPUBYRCSvxxpi0o20QyCVM9qSm5q+TjmxR2r59O+eccw5r166lTp06ZTpgYmIiy5YtK9M+fLWfYMmSlpZGvXr1fNJiFyyvKdiy+Oo9DqbXdLR9ZGfDl1/aGb7nzIEdOyA2Flq2tLNhn3EGnHoq1K8PrVoVvh9jYNcu+Oknu6TKN9/A55+ns/nH2vxIvsboPDYD0SVsUQqV9zfQ+4m08zfQ+9H769/9lOT9zWlRKmqfASuUimraOlLVqlXL/Ic8OjraJ5fvfLGfYMoCEBcXF1avKZiy5CjrexxMr6mofXTpYm/JybbAWbzY3pKT4a+/cvYBnreYDh3iqFjRrjcXHQ1790JaGmzbZtdjy9m2aVPo1CmOVdW6M+WbeQw+Sh+lKTEx9OjenZol6DAVSu9voPcDkXX+Bno/oPfXn/uB4r2/RbUk5QjrRXEHDBgQNPsJpiy+EkyvKZiy+Eowvabi7iMqChIT7e2ee2wr0bZtsGaNbSmaO3cLDRrU4sABOHDALity4ol2+ZTjj7czhDdsaFugKlWy+0xJuYt27eZwJxQ66m1dVhaT77zTL68pEPsJpiy+EkyvKZiy+EowvaZgyuIPQTfqbevWrbnNZnU1xtfnNKrQ//Qe+96kSZPo379/7jxKDbGX23LmUUpOTqZfv36uY4YFnb/+pffXv0r4/hZr1FvQTcdWoUKFPPfiWxUqVGD48OF6f/1I77Hv9evXjyVLlpDQvTv3REXRHTvKLaF7d5YsWaIiyYd0/vqX3l//8sf7G3QtSqq2ReRo0tPTSUtLIy4uTlMBiEhZFKtFKaz7KIlI+ImNjVWBJCIBE3SX3kRERESChQolERERkUIEuo9SkQ6bwbvI2TJFRERE/CkYCyUPqEox1l8RERER8aegu/RmrDQVSaXneV5/z/N+8jxvv+d533ied95Rtu3geZ4p4NY4kJlDhed57TzPm+d53q+H3qfLivGc9od+Dvs9z9vseZ7GsheipO+vzt/i8zxvmOd5yzzP2+N53u+e583xPO/UYjxP528xleY91jlcfJ7n3e553nee56Udun3heV7XIp5T5vM36AolKRvP867GLqb+BHAmsASY73neCUU89VTg+MNum/wYM5RVBlYBA4uzsed5JwLvY38OZwL/BiZ4nne53xKGthK9v4fR+Vu09kAS0Aq4EDvqeYHneZULe4LO3xIr8Xt8GJ3DRdsK3A+cfei2EJjreV6Tgjb21fkbdJfepGw8z/sKWGGMuf2wx9YBc4wxwwrYvgPwKXCMMeavAMUMC57nGaCHMWbOUbYZDVxqjDntsMcmAc2MMa39nzJ0FfP97YDO31LxPK868DvQ3hjzWSHb6Pwtg2K+xx3QOVxqnuftAu41xrxUwPd8cv6qRSmMeJ5XHmgBLDjiWwuAc4t4+ree5233PO8Tz/PO90vAyNSa/D+PD4GzPc8r5yBPuNL5W3Lxh+53HWUbnb9lU5z3OIfO4RLwPC/a87x/YVuhvyhkM5+cvyqUwks1IBrYccTjO4BahTxnO3AbcDnQE9gAfOJ5Xjt/hYwwtSj45xGD/XlJ2ej8LYVDg2bGAinGmNVH2VTnbymV4D3WOVwCnuc19TxvL5ABTMK2Oq8tZHOfnL+amTs8HXk91SvgMbuhMRuw/zFzfOF5Xj3gHqDApmIpsYJ+HgU9LiWk87fUngfOANoWY1udv6VTrPdY53CJbQCaA//AFpeveJ7X/ijFUpnPX7UohZedQBb5W49qkL+qPpovgZN9FSrC/UbBP49M4M/Ax4kIOn+PwvO854BLgfONMVuL2FznbymU8D0uiM7hQhhjDhhjfjDGLD/U73YVcEchm/vk/FWhFEaMMQeAb7CjLQ53IfB5CXZ1JrY5WMruC/L/PDoDy40xBx3kiQQ6fwvgWc9jL+9cYIz5qRhP0/lbAqV8jwuic7j4PKBCId/zyfmrS2/hZyzwmud5y7EnyW3ACdhruXieNwqoY4y5/tDXQ4CfgTVAeeBabHOmhv8WwPO8KsBJhz10oud5zYFdxphfjnx/se/7QM/zxgJTsJ0LbwF6BTB2yCjp+6vzt0SSgN5Ad2CP53k5n7RTjTHpkP/3Azp/S6rE77HO4eLzPO/fwHxgC3Zi6n8BHYAuh77vn/PXGKNbmN2A/tj/eBnYFqZ2h31vGrDosK+HAj8A6diRGUuAf7p+DcF6O/Sf0hRwm1bQ+3vosfbAikM/j5+Afq5fR7DeSvr+6vwt0Xtb0PtqgBsP20bnb4DfY53DJXp/Xzrsb9vvwMfAhYW9t4ceK/P5q3mURERERAqhPkoiIiIihVChJCIiIlIIFUoiIiIihVChJCIiIlIIFUoiIiIihVChJCIiIlIIFUoiIiIihVChJCIiIlIIFUoiIiIihVChJCIiIlIIFUoiIiIihfg/PdvoGYPa9cIAAAAASUVORK5CYII=\n",
1505 "text/plain": [
1506 "Graphics object consisting of 3 graphics primitives"
1507 ]
1508 },
1509 "metadata": {},
1510 "output_type": "display_data"
1511 }
1512 ],
1513 "source": [
1514 "points = [ (0,1), (1,2), (1.5,0), (2,4), (3,5) ]\n",
1515 "polring.<x> = QQ[] # you need to specify a polynomial ring\n",
1516 "lp = polring.lagrange_polynomial(points)\n",
1517 "show(scatter_plot(points, facecolor=\"red\")\n",
1518 " + plot(lp, 0, 3) # slightly different notation for polynomials\n",
1519 " + text(lp, (1,8), color=\"black\")\n",
1520 " )"
1521 ]
1522 },
1523 {
1524 "cell_type": "markdown",
1525 "metadata": {},
1526 "source": [
1527 "One can compute the Lagrange Polynomial over any base ring, and it has the advantage that it is a very \"nice\" function (continuous and differentiable as much as you like, with easily computable derivatives and primitives).\n",
1528 "\n",
1529 "However, it does not always give you good approximation of your data:"
1530 ]
1531 },
1532 {
1533 "cell_type": "code",
1534 "execution_count": 142,
1535 "metadata": {},
1536 "outputs": [
1537 {
1538 "data": {
1539 "image/png": "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05/+NOLX3HfffXrooYc0a9YsFRYWqn379jrvvPNqF9OMhJcGmTVHV155pVavXq2FCxdq4cKFWr16ta655pqwrxs9erS2bdtWe3v99dfjUC2AZPHiiy9qypQp+uUvf6kPPvhAw4YN0wUXXKDi4uIGX7du3brDji2nnnpqnCqOvbPPlqqr7QLCseClwBTziSuNMeapp54yfr8/7POqq6tN+/btze9///vax8rLy43f7zePPvpoJLsyxhizcaOdNHLRoohfggRRVFRkJJkVK1bUPrZ8+XIjyXz66af1vu7HP/6xGTduXBwqRDLw+uSDaJrBgwebSZMmHfbYaaedZu644446n7948WIjyezevTsO1bmjqsoYv9+Y3/0uNtu/7jpjhgyJzbYdFFHeSagxTBs3blRJSYlGjRpV+1haWpq+/e1v65///GfE26GFKXktX75cfr9fQ4YMqX1s6NCh8vv9YT8D77zzjrKystSzZ09NnDhR27dvj3W5AJJEZWWlVq1addj5RZJGjRoV9tgyYMAAdejQQeeee64Wx3LAjwtSUqQhQ+yV3LHgpRamhApMJSUlkqR27dod9ni7du1qfxYJAlPyKikpUVZW1lGPZ2VlNfgZuOCCC/Tcc8/p7bff1oMPPqjCwkJ95zvfOWwFe3hffn6+srOzlZOT43YpSDA7duxQVVVVo84vHTp00OOPP65XXnlFr776qnr16qVzzz1X7733XjxKjpuzzrKTV0Y/j/XRmnVg8vl8030+nznkdtSAuJUrV0ZVlO+IiYmMMUc91hACU+KZPn16nYMn6/rc1PW7DvcZuPzyyzVmzBj16dNHY8eO1RtvvKHPPvtMf//732P2npB48vLyVFRUpMJYDchA0mvM+aVXr16aOHGizjzzTJ111lmaPXu2xowZowceeCAepcbNWWfZ1Sc+/9z5bSfCJNJOaco8TLMk/aXmH2vXrl175BO6du3apGLat28vybYydOjQofbx7du3H/WtoCEEpsQzefJkXXHFFQ0+p2vXrvroo49UWlp61M++/vrrRn0GOnTooC5duujzWBwBACSdtm3bKjU19ajWpMaeX4YOHapnn33W6fJcVTMCYvlyqWdPZ7cdCEh9+ji7Tbc0OjAZY3ZI2hGDWtStWze1b99eixYt0oABAyTZfud3331X9957b8TbITAlnrZt26pt27Zhn3fW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\n",
1540 "text/plain": [
1541 "Graphics object consisting of 2 graphics primitives"
1542 ]
1543 },
1544 "metadata": {},
1545 "output_type": "display_data"
1546 }
1547 ],
1548 "source": [
1549 "R = [x/10 for x in range(-10,10)]\n",
1550 "L = [1/(1+25*x^2) for x in R]\n",
1551 "points = [(R[i], L[i]) for i in range(len(L))]\n",
1552 "polring.<x> = RR[]\n",
1553 "lp = polring.lagrange_polynomial(points)\n",
1554 "\n",
1555 "show(plot(lp, -0.92, 0.82) + scatter_plot(points))"
1556 ]
1557 },
1558 {
1559 "cell_type": "markdown",
1560 "metadata": {},
1561 "source": [
1562 "This particular example is called [Runge's phenomenon](https://en.wikipedia.org/wiki/Runge%27s_phenomenon). For a better approximation you can use a [spline](https://en.wikipedia.org/wiki/Spline_(mathematics)), which is a *piecewise* polynomial function:"
1563 ]
1564 },
1565 {
1566 "cell_type": "code",
1567 "execution_count": 143,
1568 "metadata": {},
1569 "outputs": [
1570 {
1571 "data": {
1572 "image/png": "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\n",
1573 "text/plain": [
1574 "Graphics object consisting of 2 graphics primitives"
1575 ]
1576 },
1577 "metadata": {},
1578 "output_type": "display_data"
1579 }
1580 ],
1581 "source": [
1582 "show(plot(spline(points), -1, 1) + scatter_plot(points))"
1583 ]
1584 },
1585 {
1586 "cell_type": "markdown",
1587 "metadata": {},
1588 "source": [
1589 "A detailed explanation of splines is a good topic for a course of numerical analysis. For this course it is enough that you know that they exist and they can be plotted."
1590 ]
1591 }
1592 ],
1593 "metadata": {
1594 "kernelspec": {
1595 "display_name": "SageMath 9.2",
1596 "language": "sage",
1597 "name": "sagemath"
1598 },
1599 "language_info": {
1600 "codemirror_mode": {
1601 "name": "ipython",
1602 "version": 3
1603 },
1604 "file_extension": ".py",
1605 "mimetype": "text/x-python",
1606 "name": "python",
1607 "nbconvert_exporter": "python",
1608 "pygments_lexer": "ipython3",
1609 "version": "3.8.5"
1610 }
1611 },
1612 "nbformat": 4,
1613 "nbformat_minor": 4
1614}
diff --git a/src/Lecture6/notebook/.ipynb_checkpoints/9-SageLatex-checkpoint.ipynb b/src/Lecture6/notebook/.ipynb_checkpoints/9-SageLatex-checkpoint.ipynb
new file mode 100644
index 0000000..88cd7f5
--- /dev/null
+++ b/src/Lecture6/notebook/.ipynb_checkpoints/9-SageLatex-checkpoint.ipynb
@@ -0,0 +1,339 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "It can happen that you need to include the results of your Sage computations and/or Sage code inside a LaTeX document. Luckily Sage provides some functions to translate its objects into LaTeX, and the listings package for LaTeX can be used to include any code (Sage, Python or any other language) in a LaTeX document.\n",
8 "\n",
9 "In this document we will describe some of these interactions between LaTeX and Sage."
10 ]
11 },
12 {
13 "cell_type": "markdown",
14 "metadata": {},
15 "source": [
16 "# The `show()` command\n",
17 "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/repl/sage/repl/display/pretty_print.html)] (`show()` is just an alternative name for `pretty_print()`).\n",
18 "\n",
19 "With this command Sage will generate a picture displaying the object. The result depends on the object itself: most of them will be typeset in Latex, but for example graphics primitives (such as plots) will be displayed as pictures.\n",
20 "\n",
21 "You can see it as an alternative to `print()`."
22 ]
23 },
24 {
25 "cell_type": "code",
26 "execution_count": 4,
27 "metadata": {},
28 "outputs": [
29 {
30 "name": "stdout",
31 "output_type": "stream",
32 "text": [
33 "1 + 1*x + 1/2*x^2 + 1/6*x^3 + Order(x^4)\n"
34 ]
35 },
36 {
37 "data": {
38 "text/html": [
39 "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}1 + 1 x + \\frac{1}{2} x^{2} + \\frac{1}{6} x^{3} + \\mathcal{O}\\left(x^{4}\\right)</script></html>"
40 ],
41 "text/latex": [
42 "\\begin{math}\n",
43 "\\newcommand{\\Bold}[1]{\\mathbf{#1}}1 + 1 x + \\frac{1}{2} x^{2} + \\frac{1}{6} x^{3} + \\mathcal{O}\\left(x^{4}\\right)\n",
44 "\\end{math}"
45 ],
46 "text/plain": [
47 "1 + 1*x + 1/2*x^2 + 1/6*x^3 + Order(x^4)"
48 ]
49 },
50 "metadata": {},
51 "output_type": "display_data"
52 },
53 {
54 "name": "stdout",
55 "output_type": "stream",
56 "text": [
57 "[ 1 2 3]\n",
58 "[ 4 5 6]\n",
59 "[ 8 9 10]\n"
60 ]
61 },
62 {
63 "data": {
64 "text/html": [
65 "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n",
66 "1 & 2 & 3 \\\\\n",
67 "4 & 5 & 6 \\\\\n",
68 "8 & 9 & 10\n",
69 "\\end{array}\\right)</script></html>"
70 ],
71 "text/latex": [
72 "\\begin{math}\n",
73 "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n",
74 "1 & 2 & 3 \\\\\n",
75 "4 & 5 & 6 \\\\\n",
76 "8 & 9 & 10\n",
77 "\\end{array}\\right)\n",
78 "\\end{math}"
79 ],
80 "text/plain": [
81 "[ 1 2 3]\n",
82 "[ 4 5 6]\n",
83 "[ 8 9 10]"
84 ]
85 },
86 "metadata": {},
87 "output_type": "display_data"
88 },
89 {
90 "name": "stdout",
91 "output_type": "stream",
92 "text": [
93 "pi\n"
94 ]
95 },
96 {
97 "data": {
98 "text/html": [
99 "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\pi</script></html>"
100 ],
101 "text/latex": [
102 "\\begin{math}\n",
103 "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\pi\n",
104 "\\end{math}"
105 ],
106 "text/plain": [
107 "pi"
108 ]
109 },
110 "metadata": {},
111 "output_type": "display_data"
112 }
113 ],
114 "source": [
115 "s = (e^x).series(x==0, 4)\n",
116 "M = matrix([[1,2,3],[4,5,6],[8,9,10]])\n",
117 "print(s)\n",
118 "show(s)\n",
119 "print(M)\n",
120 "show(M)\n",
121 "print(pi)\n",
122 "show(pi)"
123 ]
124 },
125 {
126 "cell_type": "markdown",
127 "metadata": {},
128 "source": [
129 "In a Jupyter notebook, the results above are displayed using [MathJax](https://www.mathjax.org/).\n",
130 "\n",
131 "If you are running this code in an interactive console (terminal) instead of a Jupyter notebook, you will get the Latex source code for those objects. You can force this behavior by using the `latex()` command."
132 ]
133 },
134 {
135 "cell_type": "markdown",
136 "metadata": {},
137 "source": [
138 "# The `latex()` command\n",
139 "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/misc/sage/misc/latex.html)]\n",
140 "\n",
141 "This command is potentially very useful if you need to include the results of Sage computations in a Latex file, especially with complex objects like matrices or very large polynomials.\n",
142 "\n",
143 "Technically, this is a function that returns a string, so you need to `print()` it to see the result."
144 ]
145 },
146 {
147 "cell_type": "code",
148 "execution_count": 5,
149 "metadata": {},
150 "outputs": [
151 {
152 "name": "stdout",
153 "output_type": "stream",
154 "text": [
155 "1 + 1 x + \\frac{1}{2} x^{2} + \\frac{1}{6} x^{3} + \\mathcal{O}\\left(x^{4}\\right)\n",
156 "\n",
157 "\n",
158 "\\left(\\begin{array}{rrr}\n",
159 "1 & 2 & 3 \\\\\n",
160 "4 & 5 & 6 \\\\\n",
161 "8 & 9 & 10\n",
162 "\\end{array}\\right)\n"
163 ]
164 }
165 ],
166 "source": [
167 "print(latex(s))\n",
168 "print(\"\\n\")\n",
169 "print(latex(M))"
170 ]
171 },
172 {
173 "cell_type": "markdown",
174 "metadata": {},
175 "source": [
176 "Interestingly, Sage can use matplotlib's PGF backend to generate Latex code for a plot. (PGF is the graphics language underlying TikZ, like TeX is the language underlying Latex)."
177 ]
178 },
179 {
180 "cell_type": "code",
181 "execution_count": 15,
182 "metadata": {},
183 "outputs": [],
184 "source": [
185 "#latex(plot(x^2)) # The output is more than 20 pages long"
186 ]
187 },
188 {
189 "cell_type": "markdown",
190 "metadata": {},
191 "source": [
192 "It is probably easier to just generate the picture and include that in your Latex document with `\\includegraphics`."
193 ]
194 },
195 {
196 "cell_type": "markdown",
197 "metadata": {},
198 "source": [
199 "## A Latex name for your variables\n",
200 "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/var.html)]\n",
201 "\n",
202 "Sometimes you might want to use variables and functions that have, for example, a Greek letter as a name. You can tell Sage that you want them displayed this way when you declare them:"
203 ]
204 },
205 {
206 "cell_type": "code",
207 "execution_count": 14,
208 "metadata": {},
209 "outputs": [
210 {
211 "name": "stdout",
212 "output_type": "stream",
213 "text": [
214 "phi1(epsilon)\n"
215 ]
216 },
217 {
218 "data": {
219 "text/html": [
220 "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}e^{{\\epsilon}} + \\phi_1\\left({\\epsilon}\\right)</script></html>"
221 ],
222 "text/latex": [
223 "\\begin{math}\n",
224 "\\newcommand{\\Bold}[1]{\\mathbf{#1}}e^{{\\epsilon}} + \\phi_1\\left({\\epsilon}\\right)\n",
225 "\\end{math}"
226 ],
227 "text/plain": [
228 "e^epsilon + phi1(epsilon)"
229 ]
230 },
231 "metadata": {},
232 "output_type": "display_data"
233 },
234 {
235 "data": {
236 "text/plain": [
237 "e^{{\\epsilon}} + \\phi_1\\left({\\epsilon}\\right)"
238 ]
239 },
240 "execution_count": 14,
241 "metadata": {},
242 "output_type": "execute_result"
243 }
244 ],
245 "source": [
246 "var('epsilon', latex_name=\"\\\\epsilon\")\n",
247 "function('phi1', latex_name=\"\\\\phi_1\")\n",
248 "\n",
249 "print(phi1(epsilon))\n",
250 "show(phi1(epsilon) + e^epsilon)\n",
251 "latex(phi1(epsilon) + e^epsilon)"
252 ]
253 },
254 {
255 "cell_type": "markdown",
256 "metadata": {},
257 "source": [
258 "**Warning:** You need to use two backspaces `\\\\`. The reason is that in Python (like in many other programming languages) the backslash symbol inside a string is used to print special characters, such as a newline `\\n`."
259 ]
260 },
261 {
262 "cell_type": "markdown",
263 "metadata": {},
264 "source": [
265 "# From Jupyter to Latex\n",
266 "**Reference:** [[4](https://nbconvert.readthedocs.io/en/latest/)]\n",
267 "\n",
268 "From the Jupyter menu `File > Download as` you can choose to download your work in many formats, among which there are also Latex and pdf. Personally I prefer downloading the .tex file, so then I can change the title, add an author name and make any other change I like before compiling it into a pdf file.\n",
269 "\n",
270 "If you choose to download the pdf file, you might need to install some extra packages. For example I had to install [`pandoc`](https://pandoc.org/), `texlive-XeTeX` and `texlive-Xdvi`, but this depends on your operating system and Latex distribution."
271 ]
272 },
273 {
274 "cell_type": "markdown",
275 "metadata": {},
276 "source": [
277 "# SageTex\n",
278 "**Reference:** [[5](https://doc.sagemath.org/html/en/tutorial/sagetex.html)]\n",
279 "\n",
280 "With SageTex it is possible to run Sage commands directly inside Latex, using the `\\sage{}` command. In this way you don't need to run your Sage code first and then copy the results in Latex. It can be useful especially for short Sage commands.\n",
281 "\n",
282 "You might need to take some extra steps to make this work on your system, see the link above."
283 ]
284 },
285 {
286 "cell_type": "markdown",
287 "metadata": {},
288 "source": [
289 "# The Latex `listings` package\n",
290 "**References:** [[6](https://en.wikibooks.org/wiki/LaTeX/Source_Code_Listings)] and [[7](https://ftp.snt.utwente.nl/pub/software/tex/macros/latex/contrib/listings/listings.pdf)]\n",
291 "\n",
292 "If you want to include some code (Sage, Python or anything else) in a Latex document you can use the listings package.\n",
293 "\n",
294 "```\n",
295 "\\usepackage{listings}\n",
296 "\n",
297 "...\n",
298 "\n",
299 "\\begin{lstlisting}[language=Python]\n",
300 "for i in range(0,100):\n",
301 " if i%5 == 0:\n",
302 " print(\"Multiple of 5!\")\n",
303 "\\end{lstlisting}\n",
304 "```\n",
305 "\n",
306 "You need to specify the language you are using with the `language=` option. This option can also be set at the beginning of the document using the `\\lstset{language=Python}` command.\n",
307 "\n",
308 "As an alternative, you can include a file directly without copying the code into the tex file, like you would do for a picture:\n",
309 "\n",
310 "```\n",
311 "\\lstinputlisting[language=Python]{file.py}\n",
312 "```\n",
313 "\n",
314 "It is technically possible to include Latex listings in a markdown cell of the Jupyter notebook using [this package](https://jupyter-contrib-nbextensions.readthedocs.io/en/latest/nbextensions/latex_envs/README.html), but it does not make much sense. So we will move to a Latex editor for the examples."
315 ]
316 }
317 ],
318 "metadata": {
319 "kernelspec": {
320 "display_name": "SageMath 9.2",
321 "language": "sage",
322 "name": "sagemath"
323 },
324 "language_info": {
325 "codemirror_mode": {
326 "name": "ipython",
327 "version": 3
328 },
329 "file_extension": ".py",
330 "mimetype": "text/x-python",
331 "name": "python",
332 "nbconvert_exporter": "python",
333 "pygments_lexer": "ipython3",
334 "version": "3.8.5"
335 }
336 },
337 "nbformat": 4,
338 "nbformat_minor": 4
339}
diff --git a/src/Lecture6/notebook/8-SageCalculus.aux b/src/Lecture6/notebook/8-SageCalculus.aux
new file mode 100644
index 0000000..6aa6ff2
--- /dev/null
+++ b/src/Lecture6/notebook/8-SageCalculus.aux
@@ -0,0 +1,58 @@
1\relax
2\providecommand\hyper@newdestlabel[2]{}
3\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
4\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
5\global\let\oldcontentsline\contentsline
6\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
7\global\let\oldnewlabel\newlabel
8\gdef\newlabel#1#2{\newlabelxx{#1}#2}
9\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
10\AtEndDocument{\ifx\hyper@anchor\@undefined
11\let\contentsline\oldcontentsline
12\let\newlabel\oldnewlabel
13\fi}
14\fi}
15\global\let\hyper@last\relax
16\gdef\HyperFirstAtBeginDocument#1{#1}
17\providecommand\HyField@AuxAddToFields[1]{}
18\providecommand\HyField@AuxAddToCoFields[2]{}
19\providecommand \oddpage@label [2]{}
20\@writefile{toc}{\contentsline {section}{\numberline {1}Symbolic expressions}{1}{section.1}\protected@file@percent }
21\newlabel{symbolic-expressions}{{1}{1}{Symbolic expressions}{section.1}{}}
22\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}Solving equations and inequalities}{1}{subsection.1.1}\protected@file@percent }
23\newlabel{solving-equations-and-inequalities}{{1.1}{1}{Solving equations and inequalities}{subsection.1.1}{}}
24\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.1}The set of solutions}{2}{subsubsection.1.1.1}\protected@file@percent }
25\newlabel{the-set-of-solutions}{{1.1.1}{2}{The set of solutions}{subsubsection.1.1.1}{}}
26\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.2}Alternative method for real roots: \texttt {find\_root()}}{3}{subsubsection.1.1.2}\protected@file@percent }
27\newlabel{alternative-method-for-real-roots-find_root}{{1.1.2}{3}{\texorpdfstring {Alternative method for real roots: \texttt {find\_root()}}{Alternative method for real roots: find\_root()}}{subsubsection.1.1.2}{}}
28\@writefile{toc}{\contentsline {subsection}{\numberline {1.2}Evaluating functions}{3}{subsection.1.2}\protected@file@percent }
29\newlabel{evaluating-functions}{{1.2}{3}{Evaluating functions}{subsection.1.2}{}}
30\@writefile{toc}{\contentsline {subsection}{\numberline {1.3}Symbolic computations}{4}{subsection.1.3}\protected@file@percent }
31\newlabel{symbolic-computations}{{1.3}{4}{Symbolic computations}{subsection.1.3}{}}
32\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.3.1}The Symbolic Ring}{5}{subsubsection.1.3.1}\protected@file@percent }
33\newlabel{the-symbolic-ring}{{1.3.1}{5}{The Symbolic Ring}{subsubsection.1.3.1}{}}
34\@writefile{toc}{\contentsline {section}{\numberline {2}Calculus}{5}{section.2}\protected@file@percent }
35\newlabel{calculus}{{2}{5}{Calculus}{section.2}{}}
36\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Limits and series}{5}{subsection.2.1}\protected@file@percent }
37\newlabel{limits-and-series}{{2.1}{5}{Limits and series}{subsection.2.1}{}}
38\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}Derivatives}{6}{subsection.2.2}\protected@file@percent }
39\newlabel{derivatives}{{2.2}{6}{Derivatives}{subsection.2.2}{}}
40\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}Integrals}{7}{subsection.2.3}\protected@file@percent }
41\newlabel{integrals}{{2.3}{7}{Integrals}{subsection.2.3}{}}
42\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.3.1}Symbolic integration}{7}{subsubsection.2.3.1}\protected@file@percent }
43\newlabel{symbolic-integration}{{2.3.1}{7}{Symbolic integration}{subsubsection.2.3.1}{}}
44\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.3.2}Numerical integration}{8}{subsubsection.2.3.2}\protected@file@percent }
45\newlabel{numerical-integration}{{2.3.2}{8}{Numerical integration}{subsubsection.2.3.2}{}}
46\@writefile{toc}{\contentsline {subsection}{\numberline {2.4}Differential equations}{9}{subsection.2.4}\protected@file@percent }
47\newlabel{differential-equations}{{2.4}{9}{Differential equations}{subsection.2.4}{}}
48\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.4.1}A real-world example}{10}{subsubsection.2.4.1}\protected@file@percent }
49\newlabel{a-real-world-example}{{2.4.1}{10}{A real-world example}{subsubsection.2.4.1}{}}
50\@writefile{toc}{\contentsline {section}{\numberline {3}Basic data analysis and visualization}{10}{section.3}\protected@file@percent }
51\newlabel{basic-data-analysis-and-visualization}{{3}{10}{Basic data analysis and visualization}{section.3}{}}
52\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Statistics}{10}{subsection.3.1}\protected@file@percent }
53\newlabel{statistics}{{3.1}{10}{Statistics}{subsection.3.1}{}}
54\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Plotting}{11}{subsection.3.2}\protected@file@percent }
55\newlabel{plotting}{{3.2}{11}{Plotting}{subsection.3.2}{}}
56\@writefile{toc}{\contentsline {subsection}{\numberline {3.3}Interpolation}{15}{subsection.3.3}\protected@file@percent }
57\newlabel{interpolation}{{3.3}{15}{Interpolation}{subsection.3.3}{}}
58\gdef \@abspage@last{18}
diff --git a/src/Lecture6/notebook/8-SageCalculus.ipynb b/src/Lecture6/notebook/8-SageCalculus.ipynb
new file mode 100644
index 0000000..4b81998
--- /dev/null
+++ b/src/Lecture6/notebook/8-SageCalculus.ipynb
@@ -0,0 +1,1372 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "# Symbolic expressions\n",
8 "\n",
9 "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n",
10 "\n",
11 "Last time we saw the basics of symbolic expressions:\n",
12 "* How to define and manipulate symbolic expressions\n",
13 "* How to introduce new variables (in the Mathematical sense) with `var()`\n",
14 "* How to solve equations and inequalities\n",
15 "* Some of the Mathematical constants that are included in Sage, and how to approximate them using `n()`\n",
16 "\n",
17 "Here are some examples to remind you of these basic things:"
18 ]
19 },
20 {
21 "cell_type": "code",
22 "execution_count": 2,
23 "metadata": {},
24 "outputs": [
25 {
26 "name": "stdout",
27 "output_type": "stream",
28 "text": [
29 "[\n",
30 "x == -sqrt(-pi),\n",
31 "x == sqrt(-pi)\n",
32 "]\n",
33 "[\n",
34 "z == -sqrt(pi + x^2),\n",
35 "z == sqrt(pi + x^2)\n",
36 "]\n",
37 "[[y < -2], [y > 1]]\n",
38 "2*pi + e is approximately 9.00146713563863\n"
39 ]
40 }
41 ],
42 "source": [
43 "var('y', 'z') # Define new variables (x is already defined by Sage)\n",
44 "f = x^2 + pi\n",
45 "g = y^2 + y - 2 > 0\n",
46 "print( solve(f==0, x) )\n",
47 "print( solve(z^2 - f, z) )\n",
48 "print( solve(g, y) )\n",
49 "print( 2*pi + e, \"is approximately\", n(2*pi + e) )"
50 ]
51 },
52 {
53 "cell_type": "markdown",
54 "metadata": {},
55 "source": [
56 "Now we will see some more details about solving equations and manipulating their solutions."
57 ]
58 },
59 {
60 "cell_type": "markdown",
61 "metadata": {},
62 "source": [
63 "## Solving equations and inequalities\n",
64 "\n",
65 "**Reference** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)] for the details of `solve()` and `find_root()`, [[2](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/relation.html#solving)] for examples.\n",
66 "\n",
67 "Other than equations and inequalities, we can also solve systems: it is enough to give Sage a list of expressions and a list of variables with respect to which we want to solve. For example the system\n",
68 "\n",
69 "\\begin{align*}\n",
70 " \\begin{cases}\n",
71 " x + y = 2 \\\\\n",
72 " 2x - y = 6\n",
73 " \\end{cases}\n",
74 "\\end{align*}\n",
75 "\n",
76 "Can be solved as"
77 ]
78 },
79 {
80 "cell_type": "code",
81 "execution_count": 40,
82 "metadata": {},
83 "outputs": [
84 {
85 "data": {
86 "text/plain": [
87 "[[x == (8/3), y == (-2/3)]]"
88 ]
89 },
90 "execution_count": 40,
91 "metadata": {},
92 "output_type": "execute_result"
93 }
94 ],
95 "source": [
96 "solve([x+y == 2, 2*x - y == 6], [x,y])"
97 ]
98 },
99 {
100 "cell_type": "markdown",
101 "metadata": {},
102 "source": [
103 "**Exercise.** Find the intersection of the circle of radius $2$ centered in the origin and the parabula of equation $y=x^2-2x^2+1$."
104 ]
105 },
106 {
107 "cell_type": "markdown",
108 "metadata": {},
109 "source": [
110 "### The set of solutions\n",
111 "\n",
112 "One would expect the result of `solve()` to be a list of solutions, but it is actually a list of expressions (technically it is not a list but a different type of Python collection, but this is not so important)"
113 ]
114 },
115 {
116 "cell_type": "code",
117 "execution_count": 37,
118 "metadata": {},
119 "outputs": [
120 {
121 "data": {
122 "text/plain": [
123 "x == -3"
124 ]
125 },
126 "execution_count": 37,
127 "metadata": {},
128 "output_type": "execute_result"
129 }
130 ],
131 "source": [
132 "solutions = solve(x^2-9 == 0, x)\n",
133 "solutions[0] # This is the expression 'x == -3'"
134 ]
135 },
136 {
137 "cell_type": "markdown",
138 "metadata": {},
139 "source": [
140 "To read the actual solution without the `x ==` part you can use the `rhs()` or `lhs()` functions, which can be applied to any expression containing a relation operator (like `==`, `<`, `>=`...) and return the *right hand side* and *left hand side* of the expression, respectively"
141 ]
142 },
143 {
144 "cell_type": "code",
145 "execution_count": 41,
146 "metadata": {},
147 "outputs": [
148 {
149 "name": "stdout",
150 "output_type": "stream",
151 "text": [
152 "rhs: 2\n",
153 "lhs: x\n"
154 ]
155 }
156 ],
157 "source": [
158 "f = x == 2\n",
159 "print(\"rhs:\", f.rhs())\n",
160 "print(\"lhs:\", f.lhs())"
161 ]
162 },
163 {
164 "cell_type": "markdown",
165 "metadata": {},
166 "source": [
167 "When you solve an inequality or a system, the set of solutions can be more complicated to describe. In this case the result is a list containing lists of expressions that have to be `True` at the same time. It is easier to explain with an example:"
168 ]
169 },
170 {
171 "cell_type": "code",
172 "execution_count": 38,
173 "metadata": {},
174 "outputs": [
175 {
176 "name": "stdout",
177 "output_type": "stream",
178 "text": [
179 "Simple inequality: [[x < -3], [x > 3]]\n",
180 "System of inequalities:\n",
181 " [\n",
182 "[3 < x, x < 6],\n",
183 "[x < -3]\n",
184 "]\n"
185 ]
186 }
187 ],
188 "source": [
189 "print(\"Simple inequality:\", solve(x^2-9 > 0, x))\n",
190 "print(\"System of inequalities:\\n\", solve([x^2-9 > 0, x < 6], x))"
191 ]
192 },
193 {
194 "cell_type": "markdown",
195 "metadata": {},
196 "source": [
197 "In the last example (system of inequalities), Sage is telling us that the system\n",
198 "\\begin{align*}\n",
199 " \\begin{cases}\n",
200 " x^2-9 > 9 \\\\\n",
201 " x < 6\n",
202 " \\end{cases}\n",
203 "\\end{align*}\n",
204 "has two solutions:\n",
205 "* $x$ is between $3$ and $6$;\n",
206 "* $x$ is less than $-3$.\n",
207 "\n",
208 "Since in Sage (and in Python) expressions can have at most on relational operator like `<`, the first solution requires two expressions to be described. Hence the \"list of lists\".\n"
209 ]
210 },
211 {
212 "cell_type": "markdown",
213 "metadata": {},
214 "source": [
215 "**Exercise.** In the first exercise you were asked to solve a system of equations, but some of its solutions were complex numbers. Select only the real solutions and print them as pairs $(x,y)$."
216 ]
217 },
218 {
219 "cell_type": "markdown",
220 "metadata": {},
221 "source": [
222 "When solving a system of equations (not inequalities), you can use the option `solution_dict=True` to have the solutions arranged as a *dictionary*, which is a type of Python collection that we did not treat in this course"
223 ]
224 },
225 {
226 "cell_type": "code",
227 "execution_count": 44,
228 "metadata": {},
229 "outputs": [
230 {
231 "data": {
232 "text/plain": [
233 "[{x: 8/3, y: -2/3}]"
234 ]
235 },
236 "execution_count": 44,
237 "metadata": {},
238 "output_type": "execute_result"
239 }
240 ],
241 "source": [
242 "solve([x+y == 2, 2*x - y == 6], [x,y], solution_dict=True)"
243 ]
244 },
245 {
246 "cell_type": "markdown",
247 "metadata": {},
248 "source": [
249 "### Alternative method for real roots: `find_root()`\n",
250 "\n",
251 "The `solve()` method is very useful when solving *symbolic* equations, for example when you have two variables and you want to solve for one of them in terms of the other. However, it does not always find explicit solutions.\n",
252 "\n",
253 "When you want to find an explicit, even if approximate, solution, it can be better to use `find_root()`. This function works *numerically*, which means that it finds an approximation of the root. It only works for real solutions and you need to specify an interval where you want the root to be searched:"
254 ]
255 },
256 {
257 "cell_type": "code",
258 "execution_count": 52,
259 "metadata": {},
260 "outputs": [
261 {
262 "name": "stdout",
263 "output_type": "stream",
264 "text": [
265 "Using solve():\n",
266 " [\n",
267 "x == -e^x + 10\n",
268 "]\n",
269 "Using find_root(): 2.070579904980303\n"
270 ]
271 }
272 ],
273 "source": [
274 "f = e^x + x - 10\n",
275 "print(\"Using solve():\\n\", solve(f, x))\n",
276 "print(\"Using find_root():\", f.find_root(0,100))"
277 ]
278 },
279 {
280 "cell_type": "markdown",
281 "metadata": {},
282 "source": [
283 "## Evaluating functions\n",
284 "\n",
285 "If an expression contains only one variable you can evaluate it easily, even if it is not a function."
286 ]
287 },
288 {
289 "cell_type": "code",
290 "execution_count": 21,
291 "metadata": {},
292 "outputs": [
293 {
294 "name": "stdout",
295 "output_type": "stream",
296 "text": [
297 "1\n",
298 "y + 3 > (y + 3)^2\n"
299 ]
300 }
301 ],
302 "source": [
303 "var('y')\n",
304 "f = x^2-3\n",
305 "g = x > x^2\n",
306 "\n",
307 "print(f(2))\n",
308 "print(g(3+y))"
309 ]
310 },
311 {
312 "cell_type": "markdown",
313 "metadata": {},
314 "source": [
315 "If an expression contains more than one variable, you can specify a value for each of them and they will be substituted in alphabetic order. You can also specify a value only for some of the variables."
316 ]
317 },
318 {
319 "cell_type": "code",
320 "execution_count": 38,
321 "metadata": {},
322 "outputs": [
323 {
324 "name": "stdout",
325 "output_type": "stream",
326 "text": [
327 "-2 == 0\n",
328 "3*y == 2\n"
329 ]
330 }
331 ],
332 "source": [
333 "var('y','z')\n",
334 "\n",
335 "f = y*z^2 - y == z\n",
336 "print(f(2, 0))\n",
337 "print(f(z=2))"
338 ]
339 },
340 {
341 "cell_type": "markdown",
342 "metadata": {},
343 "source": [
344 "## Symbolic computations\n",
345 "\n",
346 "Sage can understand and simplify symbolic expressions such as sums (finite or infinite) and products. In the following cell, we compute the following sums using the [`sum()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.sum) function:\n",
347 "\n",
348 "\\begin{align*}\n",
349 " \\begin{array}{llcc}\n",
350 " (1) & \\sum_{k=0}^nk &=&\\frac{n^2+n}{2}\\\\\n",
351 " (2) & \\sum_{k=0}^nk^4 &=&\\frac{6n^5+15n^4+10n^3-n}{30}\\\\\n",
352 " (3) & \\sum_{k=0}^n\\binom nk &=& 2^n\\\\\n",
353 " (4) & \\sum_{k=0}^\\infty \\frac1{k^2} &=& \\frac{\\pi^2}{6}\n",
354 " \\end{array}\n",
355 "\\end{align*}"
356 ]
357 },
358 {
359 "cell_type": "code",
360 "execution_count": 22,
361 "metadata": {},
362 "outputs": [
363 {
364 "name": "stdout",
365 "output_type": "stream",
366 "text": [
367 "(1) 1/2*n^2 + 1/2*n\n",
368 "(2) 1/5*n^5 + 1/2*n^4 + 1/3*n^3 - 1/30*n\n",
369 "(3) 2^n\n",
370 "(4) 1/6*pi^2\n"
371 ]
372 }
373 ],
374 "source": [
375 "var('k', 'n') # Remember to declare all variables\n",
376 "\n",
377 "s = []\n",
378 "s.append( sum(k, k, 0, n) )\n",
379 "s.append( sum(k^4, k, 0, n) )\n",
380 "s.append( sum(binomial(n,k), k, 0, n) )\n",
381 "s.append( sum(1/k^2, k, 1, infinity) )\n",
382 "\n",
383 "for i in range(len(s)):\n",
384 " print(\"({}) {}\".format(i+1, s[i]))"
385 ]
386 },
387 {
388 "cell_type": "markdown",
389 "metadata": {},
390 "source": [
391 "An alternative notation is `expression.sum(k, a, b)`. There is an analogous [`prod()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.prod) for products."
392 ]
393 },
394 {
395 "cell_type": "markdown",
396 "metadata": {},
397 "source": [
398 "Sometimes Sage tries to keep an expression in its original form without expanding out sums and products. To change this behavior you can use the [`expand()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.expand) function:"
399 ]
400 },
401 {
402 "cell_type": "code",
403 "execution_count": 30,
404 "metadata": {},
405 "outputs": [
406 {
407 "name": "stdout",
408 "output_type": "stream",
409 "text": [
410 "(x + 1)^2 - (x - 1)^2\n",
411 "4*x\n"
412 ]
413 }
414 ],
415 "source": [
416 "f = (x+1)^2 - (x-1)^2\n",
417 "print(f)\n",
418 "print(f.expand())"
419 ]
420 },
421 {
422 "cell_type": "markdown",
423 "metadata": {},
424 "source": [
425 "### The Symbolic Ring\n",
426 "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html)]\n",
427 "\n",
428 "The symbolic expressions that we have seen so far live in a ring called *symbolic ring* and denoted by `SR` in Sage. This ring works like the ring `ZZ` of integers or `RR` of reals numbers. In particular, you can define matrices and other objects using it as a \"basis\"."
429 ]
430 },
431 {
432 "cell_type": "code",
433 "execution_count": 45,
434 "metadata": {},
435 "outputs": [
436 {
437 "name": "stdout",
438 "output_type": "stream",
439 "text": [
440 "-b*c + a*d\n",
441 "[(-a, 2)]\n"
442 ]
443 }
444 ],
445 "source": [
446 "var('a', 'b', 'c', 'd')\n",
447 "\n",
448 "M = matrix([[a,b], [c,d]])\n",
449 "print(M.determinant())\n",
450 "\n",
451 "polring.<x> = SR[]\n",
452 "f = x^2 + 2*a*x + a^2\n",
453 "print(f.roots())"
454 ]
455 },
456 {
457 "cell_type": "markdown",
458 "metadata": {},
459 "source": [
460 "**Exercise.** Compute the eigenvalues of the matrix\n",
461 "\\begin{align*}\n",
462 "\\begin{pmatrix}\n",
463 "\\cos \\alpha & \\sin \\alpha\\\\\n",
464 "-\\sin\\alpha & \\cos \\alpha\n",
465 "\\end{pmatrix}\n",
466 "\\end{align*}"
467 ]
468 },
469 {
470 "cell_type": "markdown",
471 "metadata": {},
472 "source": [
473 "# Calculus\n",
474 "**Reference:** [[4](https://doc.sagemath.org/html/en/reference/calculus/index.html)] for an overview, but most functions are described in [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]"
475 ]
476 },
477 {
478 "cell_type": "markdown",
479 "metadata": {},
480 "source": [
481 "## Limits and series\n",
482 "\n",
483 "**References:** [[5](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/calculus.html#sage.calculus.calculus.limit)] for limits, [[6](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.series)] for series\n",
484 "\n",
485 "You can compute limits"
486 ]
487 },
488 {
489 "cell_type": "code",
490 "execution_count": 54,
491 "metadata": {},
492 "outputs": [
493 {
494 "name": "stdout",
495 "output_type": "stream",
496 "text": [
497 "1\n",
498 "0\n"
499 ]
500 }
501 ],
502 "source": [
503 "f = sin(x)/x\n",
504 "# print(f(0)) # This one gives an error\n",
505 "print( f.limit(x=0) )\n",
506 "\n",
507 "print( (e^(-x)).limit(x=infinity) )"
508 ]
509 },
510 {
511 "cell_type": "markdown",
512 "metadata": {},
513 "source": [
514 "**Exercise.** Compute the constant $e$ using a limit."
515 ]
516 },
517 {
518 "cell_type": "markdown",
519 "metadata": {},
520 "source": [
521 "You can also specify a direction for the limit. If you don't, Sage assumes that you want to take a two-sided limit."
522 ]
523 },
524 {
525 "cell_type": "code",
526 "execution_count": 55,
527 "metadata": {},
528 "outputs": [
529 {
530 "name": "stdout",
531 "output_type": "stream",
532 "text": [
533 "und\n",
534 "1\n",
535 "-1\n"
536 ]
537 }
538 ],
539 "source": [
540 "f = abs(x)/x # 1 if x>0, -1 if x<0\n",
541 "print( f.limit(x=0) ) # undefined\n",
542 "print( f.limit(x=0, dir=\"+\") )\n",
543 "print( f.limit(x=0, dir=\"-\") )"
544 ]
545 },
546 {
547 "cell_type": "markdown",
548 "metadata": {},
549 "source": [
550 "There is also the alternative notation `limit(f, x, dir)` which does the same as `f.limit(x, dir)`."
551 ]
552 },
553 {
554 "cell_type": "markdown",
555 "metadata": {},
556 "source": [
557 "You can also compute series expansions up to any order. **Watch out:** the notation uses `==` instead of `=` as `limit()` does."
558 ]
559 },
560 {
561 "cell_type": "code",
562 "execution_count": 56,
563 "metadata": {},
564 "outputs": [
565 {
566 "name": "stdout",
567 "output_type": "stream",
568 "text": [
569 "1 + 1*x + 1/2*x^2 + Order(x^3)\n",
570 "(-2) + 1*x + 1*x^2 + (-1/6)*x^3 + (-1/12)*x^4 + 1/120*x^5 + 1/360*x^6 + Order(x^7)\n",
571 "1*(x - 1) + (-1/2)*(x - 1)^2 + Order((x - 1)^3)\n"
572 ]
573 }
574 ],
575 "source": [
576 "f = e^x\n",
577 "g = sin(x) - 2*cos(x)\n",
578 "h = log(x)\n",
579 "\n",
580 "print(f.series(x==0, 3))\n",
581 "print(g.series(x==0, 7))\n",
582 "print(h.series(x==1, 3))"
583 ]
584 },
585 {
586 "cell_type": "markdown",
587 "metadata": {},
588 "source": [
589 "## Derivatives\n",
590 "**References:** [[7](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.derivative)] and [[8](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functional.html#sage.calculus.functional.derivative)] for derivatives, [[9](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functions.html#sage.calculus.functions.jacobian)] for the Jacobian matrix and [[10](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.hessian)] for the Hessian."
591 ]
592 },
593 {
594 "cell_type": "markdown",
595 "metadata": {},
596 "source": [
597 "When computing derivatives, you need to specify with respect to which variables you want to derive, except in case there is only one."
598 ]
599 },
600 {
601 "cell_type": "code",
602 "execution_count": 57,
603 "metadata": {},
604 "outputs": [
605 {
606 "name": "stdout",
607 "output_type": "stream",
608 "text": [
609 "8*y^3\n",
610 "6*x^2 - 1\n"
611 ]
612 }
613 ],
614 "source": [
615 "var('y')\n",
616 "print( (x^2+2*y^4).derivative(y) ) # Alternative: derivative(f, y)\n",
617 "print( (2*x^3-x+2).derivative() )"
618 ]
619 },
620 {
621 "cell_type": "markdown",
622 "metadata": {},
623 "source": [
624 "You can also compute higher order derivatives:"
625 ]
626 },
627 {
628 "cell_type": "code",
629 "execution_count": 58,
630 "metadata": {},
631 "outputs": [
632 {
633 "name": "stdout",
634 "output_type": "stream",
635 "text": [
636 "6*x\n",
637 "84*x^5*y + 10*y^4 + 24*x^2*y\n",
638 "1680*x^3 + 48\n"
639 ]
640 }
641 ],
642 "source": [
643 "print( (x^3).derivative(x, x) ) # Same as (x^3).derivative(x, 2)\n",
644 "\n",
645 "f = x^7*y^2 + x^4*y^2 - 2*x^3 + x^2*y^5 + y + 2\n",
646 "print( f.derivative(x, x, y) ) # Twice in x, once in y\n",
647 "print( f.derivative(x, 4, y, 2) ) # 4 times in x, twice in y"
648 ]
649 },
650 {
651 "cell_type": "markdown",
652 "metadata": {},
653 "source": [
654 "Jacobian and Hessian matrices are also easy to compute:"
655 ]
656 },
657 {
658 "cell_type": "code",
659 "execution_count": 59,
660 "metadata": {},
661 "outputs": [
662 {
663 "name": "stdout",
664 "output_type": "stream",
665 "text": [
666 "[-2*x + 2*y 2*x]\n",
667 "[ 0 3*y^2]\n",
668 "[ y + 1 x + 1] \n",
669 "\n",
670 "[ 2 -4*y + 1]\n",
671 "[ -4*y + 1 -4*x + 6*y]\n"
672 ]
673 }
674 ],
675 "source": [
676 "f = (-x^2 + 2*x*y, y^3, x+y+x*y)\n",
677 "print( jacobian(f, [x,y]), \"\\n\" )\n",
678 "\n",
679 "g = x^2 + x*y + y^3 -2*x*y^2 -3\n",
680 "print( g.hessian() )"
681 ]
682 },
683 {
684 "cell_type": "markdown",
685 "metadata": {},
686 "source": [
687 "*Note:* the notation `f.jacobian([x,y])` is also valid, but only if you specify that `f` is vector by declaring it as `f = vector([...])`."
688 ]
689 },
690 {
691 "cell_type": "markdown",
692 "metadata": {},
693 "source": [
694 "## Integrals\n",
695 "**References:** [[11](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/integration/integral.html)] for symbolic integration and [[12](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html)] for numerical methods.\n",
696 "\n",
697 "You should remember from high school or from your first calculus/analysis course that derivatives are easy, but integrals are hard.\n",
698 "When using a computer software to solve your integrals, you have two choices:\n",
699 "\n",
700 "1. You can try to compute a primitive function exactly, and then (if you are computing a definite integral) substitute the endpoints of your integration interval to get the result. We can call this *symbolic integration*.\n",
701 "2. You can get an *approximated* result with a *numerical method*. This method always gives some kind of result, but it cannot be used to compute indefinite integrals.\n",
702 "\n",
703 "Sage can do both of these things, although people that work in numerical analysis and use often the second method tend to prefer other programs, such as Matlab (or its open-source clone Octave)."
704 ]
705 },
706 {
707 "cell_type": "markdown",
708 "metadata": {},
709 "source": [
710 "### Symbolic integration\n",
711 "\n",
712 "Symbolic integrals work more or less like derivatives. You must specify an integration variable, but the endpoints of the integration interval are optional. If they are not given you get an indefinite integral."
713 ]
714 },
715 {
716 "cell_type": "code",
717 "execution_count": 60,
718 "metadata": {},
719 "outputs": [
720 {
721 "name": "stdout",
722 "output_type": "stream",
723 "text": [
724 "1/2*x^2 - cos(x)\n",
725 "0\n",
726 "-1/2*a^2 + 1/2*b^2 + cos(a) - cos(b)\n"
727 ]
728 }
729 ],
730 "source": [
731 "var('a', 'b')\n",
732 "f = x + sin(x)\n",
733 "print( f.integral(x) ) # Alternative: integral(f, x)\n",
734 "print( f.integral(x, -10, 10) )\n",
735 "print( f.integral(x, a, b) )"
736 ]
737 },
738 {
739 "cell_type": "markdown",
740 "metadata": {},
741 "source": [
742 "Your endpoints can also be $\\pm\\infty$:"
743 ]
744 },
745 {
746 "cell_type": "code",
747 "execution_count": 61,
748 "metadata": {},
749 "outputs": [
750 {
751 "name": "stdout",
752 "output_type": "stream",
753 "text": [
754 "1\n",
755 "sqrt(pi)\n"
756 ]
757 }
758 ],
759 "source": [
760 "print( integral(e^(-x), x, 0, infinity) )\n",
761 "print( integral(e^(-x^2), x, -infinity, infinity) )"
762 ]
763 },
764 {
765 "cell_type": "markdown",
766 "metadata": {},
767 "source": [
768 "The last function is also an example of an integral that perhaps you might want to compute numerically. In fact:"
769 ]
770 },
771 {
772 "cell_type": "code",
773 "execution_count": 65,
774 "metadata": {},
775 "outputs": [
776 {
777 "name": "stdout",
778 "output_type": "stream",
779 "text": [
780 "1/2*sqrt(pi)*erf(x)\n",
781 "1/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1)\n"
782 ]
783 }
784 ],
785 "source": [
786 "print( integral(e^(-x^2), x) )\n",
787 "print( integral(e^(-x^2), x, 1, 2) )"
788 ]
789 },
790 {
791 "cell_type": "markdown",
792 "metadata": {},
793 "source": [
794 "Here `erf(x)` denotes the [error function](https://en.wikipedia.org/wiki/Error_function)."
795 ]
796 },
797 {
798 "cell_type": "markdown",
799 "metadata": {},
800 "source": [
801 "### Numerical integration\n",
802 "\n",
803 "In order to get an explicit value for the computations above, we can use a *numerical* method.\n",
804 "\n",
805 "The word \"numerical\" does not have much to do with numbers, but it refers to the fact that we are trying to compute explicit results rather than symbolic or algebraic ones. [Numerical analysis](https://en.wikipedia.org/wiki/Numerical_analysis) is the branch of mathematics that studies methods to approximate computations over the real or complex numbers. With these methods there is usually a trade-off between speed and precision.\n",
806 "\n",
807 "The Sage function [`numerical_integral()`](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html#sage.calculus.integration.numerical_integral) takes as a parameter a real-valued one-variable function and the integration endpoints, and it returns both an approximate value for the integral and an error estimate."
808 ]
809 },
810 {
811 "cell_type": "code",
812 "execution_count": 40,
813 "metadata": {},
814 "outputs": [
815 {
816 "data": {
817 "text/plain": [
818 "(0.13525725794999466, 1.5016572202374808e-15)"
819 ]
820 },
821 "execution_count": 40,
822 "metadata": {},
823 "output_type": "execute_result"
824 }
825 ],
826 "source": [
827 "numerical_integral(e^(-x^2), 1, 2)"
828 ]
829 },
830 {
831 "cell_type": "markdown",
832 "metadata": {},
833 "source": [
834 "The result above means, in symbols\n",
835 "\\begin{align*}\n",
836 "\\int_1^2 e^{-x^2}\\mathrm dx = 0.13525725794999466 \\pm 1.5016572202374808\\times 10^{-15}\n",
837 "\\end{align*}\n",
838 "\n",
839 "There is also a [`monte_carlo_integral()`](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html#sage.calculus.integration.monte_carlo_integral) method for functions with more than one variable."
840 ]
841 },
842 {
843 "cell_type": "markdown",
844 "metadata": {},
845 "source": [
846 "**Exercise.** Compute the area of the ellipse of equation $y^2+\\left(\\frac x3\\right)^2=1$."
847 ]
848 },
849 {
850 "cell_type": "markdown",
851 "metadata": {},
852 "source": [
853 "## Differential equations\n",
854 "**Reference:** [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]\n",
855 "\n",
856 "A [differential equation](https://en.wikipedia.org/wiki/Differential_equation) is an equation involving an unknwon function and its derivatives. They can be of two kinds: *ordinary* differential equations ([ODE](https://en.wikipedia.org/wiki/Ordinary_differential_equation)) and *partial* differential equations ([PDE](https://en.wikipedia.org/wiki/Partial_differential_equation)). The latter involve multivariate functions and their partial derivatives.\n",
857 "\n",
858 "Differential equations are in general hard to solve *exactly* (or *symbolically*): even a simple equation of the form $f'(x)=g(x)$, where $g(x)$ is someknown function, requires solving the integral $\\int g(x)\\mathrm{d}x$ in order to find $f$, which as we know is not always easy!\n",
859 "\n",
860 "Theoretical results on differential equations usually ensure the existence and/or uniquess of a solution under certain conditions, but in general they do not give a way to solve them. There exits many methods to find approximate solutions, and some of them are implemented in Sage as well (see [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]). However we will focus on the simple ODEs that can be solved exactly.\n",
861 "\n",
862 "Let's start with a simple example. Let's find all functions $f(x)$ such that $f'(x)=f(x)$. In order to do so, we need to use the `function()` construct, which allows us to define an \"unknwon\" function inside Sage, like we define variables with `var()`."
863 ]
864 },
865 {
866 "cell_type": "code",
867 "execution_count": 4,
868 "metadata": {},
869 "outputs": [
870 {
871 "data": {
872 "text/plain": [
873 "_C*e^x"
874 ]
875 },
876 "execution_count": 4,
877 "metadata": {},
878 "output_type": "execute_result"
879 }
880 ],
881 "source": [
882 "var('x')\n",
883 "function('f')\n",
884 "equation = derivative(f(x)) == f(x)\n",
885 "desolve(equation, f(x)) # f is the unknown function"
886 ]
887 },
888 {
889 "cell_type": "markdown",
890 "metadata": {},
891 "source": [
892 "As you can expect, they are all the functions $Ce^x$ for some constant $C$. The constant $C$ plays the same role as the constant in the solution of an integral, but in this case Sage writes it explicitly.\n",
893 "\n",
894 "We can also specify *initial conditions* for our function. For example we can impose that $f(0)=3$ as follows:"
895 ]
896 },
897 {
898 "cell_type": "code",
899 "execution_count": 5,
900 "metadata": {},
901 "outputs": [
902 {
903 "data": {
904 "text/plain": [
905 "3*e^x"
906 ]
907 },
908 "execution_count": 5,
909 "metadata": {},
910 "output_type": "execute_result"
911 }
912 ],
913 "source": [
914 "desolve(equation, f(x), (0,3))"
915 ]
916 },
917 {
918 "cell_type": "markdown",
919 "metadata": {},
920 "source": [
921 "You can also solve *second order* equations, that is equations where the second derivative also appears. In this case if you want to specify an initial condition you should write the triple of values $(x_0, f(x_0), f'(x_0))$."
922 ]
923 },
924 {
925 "cell_type": "code",
926 "execution_count": 6,
927 "metadata": {},
928 "outputs": [
929 {
930 "data": {
931 "text/plain": [
932 "-1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e^(-1/2*x^2), x)"
933 ]
934 },
935 "execution_count": 6,
936 "metadata": {},
937 "output_type": "execute_result"
938 }
939 ],
940 "source": [
941 "equation = derivative(f(x), x, 2) + x*derivative(f(x)) == 1\n",
942 "desolve(equation, f(x), (0, 0, 0))"
943 ]
944 },
945 {
946 "cell_type": "markdown",
947 "metadata": {},
948 "source": [
949 "**Exercise.** Use Sage to find out the functions $f(x)$ that satisfy\n",
950 "\\begin{align*}\n",
951 " \\begin{array}{rlcrl}\n",
952 " (A) &\n",
953 " \\begin{cases}\n",
954 " f(0) &= 1\\\\\n",
955 " f'(0) &= 0\\\\\n",
956 " f''(x) &= -f(x)\n",
957 " \\end{cases}\n",
958 " & \\qquad \\qquad &\n",
959 " (B) &\n",
960 " \\begin{cases}\n",
961 " f(0) &= 0\\\\\n",
962 " f'(0) &= 1\\\\\n",
963 " f''(x) &= -f(x)\n",
964 " \\end{cases}\n",
965 " \\end{array}\n",
966 "\\end{align*}"
967 ]
968 },
969 {
970 "cell_type": "code",
971 "execution_count": null,
972 "metadata": {},
973 "outputs": [],
974 "source": []
975 },
976 {
977 "cell_type": "markdown",
978 "metadata": {},
979 "source": [
980 "### A real-world example\n",
981 "\n",
982 "Differential equations have countless applications in Science, so it would be a shame not to see at least a simple one.\n",
983 "\n",
984 "Consider an object moving with constant acceleration $a$. Its velocity at time $t$ is described by the formula $v(t) = v(0) + at$. For example an object falling from the sky has acceleration $g\\sim 9.8 m/s^2$ towards the ground, so its velocity is $v(t) = -gt$.\n",
985 "\n",
986 "However in the real world you need to take into account the air's resistance, which depends (among other things) on the velocity of the object. In this case the acceleration $a(t)$ is not constant anymore, and it satisfies an equation of the form $a(t)=-g -kv(t)$, where $k$ is some constant that may depend on the shape and mass of the object (in practice it may be more complicated than this).\n",
987 "\n",
988 "Since the acceleration is the derivative of the velocity, we have a differential equation\n",
989 "\\begin{align*}\n",
990 " v'(t) = -g -kv(t)\n",
991 "\\end{align*}\n",
992 "and we can try to solve it with Sage!"
993 ]
994 },
995 {
996 "cell_type": "code",
997 "execution_count": 7,
998 "metadata": {},
999 "outputs": [
1000 {
1001 "data": {
1002 "text/plain": [
1003 "-98/15*(e^(3/2*t) - 1)*e^(-3/2*t)"
1004 ]
1005 },
1006 "execution_count": 7,
1007 "metadata": {},
1008 "output_type": "execute_result"
1009 }
1010 ],
1011 "source": [
1012 "var('t')\n",
1013 "function('v')\n",
1014 "g = 9.8\n",
1015 "k = 1.5\n",
1016 "conditions = (0, 0) # Start with velocity 0\n",
1017 "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions)"
1018 ]
1019 },
1020 {
1021 "cell_type": "markdown",
1022 "metadata": {},
1023 "source": [
1024 "If you want to solve this equation symbolically (that is, keeping $g$ and $k$ in symbols) you need to specify that $t$ is the *independent variable* of the equation:"
1025 ]
1026 },
1027 {
1028 "cell_type": "code",
1029 "execution_count": 10,
1030 "metadata": {},
1031 "outputs": [
1032 {
1033 "data": {
1034 "text/plain": [
1035 "-(g*e^(k*t) - g)*e^(-k*t)/k"
1036 ]
1037 },
1038 "execution_count": 10,
1039 "metadata": {},
1040 "output_type": "execute_result"
1041 }
1042 ],
1043 "source": [
1044 "var('t', 'g', 'k')\n",
1045 "function('v')\n",
1046 "conditions = (0, 0) # Start with velocity 0\n",
1047 "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions, ivar=t)"
1048 ]
1049 },
1050 {
1051 "cell_type": "markdown",
1052 "metadata": {},
1053 "source": [
1054 "# Basic data analysis and visualization\n",
1055 "\n",
1056 "## Statistics\n",
1057 "**References:** [[14](https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html)]\n",
1058 "\n",
1059 "Sage includes the most basic functions for statistical analysis."
1060 ]
1061 },
1062 {
1063 "cell_type": "code",
1064 "execution_count": 20,
1065 "metadata": {},
1066 "outputs": [
1067 {
1068 "name": "stdout",
1069 "output_type": "stream",
1070 "text": [
1071 "Values:\t [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n",
1072 "Mean:\t\t\t 5/13\n",
1073 "Median:\t\t\t 1\n",
1074 "Mode:\t\t\t [3]\n",
1075 "Standard deviation:\t 2*sqrt(29/13)\n",
1076 "Variance:\t\t 116/13\n",
1077 "Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5]\n"
1078 ]
1079 }
1080 ],
1081 "source": [
1082 "L = [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n",
1083 "\n",
1084 "print(\"Values:\\t\", L)\n",
1085 "\n",
1086 "print(\"Mean:\\t\\t\\t\", mean(L))\n",
1087 "print(\"Median:\\t\\t\\t\", median(L))\n",
1088 "print(\"Mode:\\t\\t\\t\", mode(L))\n",
1089 "\n",
1090 "print(\"Standard deviation:\\t\", std(L))\n",
1091 "print(\"Variance:\\t\\t\", variance(L))\n",
1092 "\n",
1093 "print(\"Moving average (5):\", moving_average(L,5))"
1094 ]
1095 },
1096 {
1097 "cell_type": "markdown",
1098 "metadata": {},
1099 "source": [
1100 "You can also compare your data to a probability distribution, see [this page](https://doc.sagemath.org/html/en/reference/probability/sage/probability/probability_distribution.html). If you need to do more advanced statistics you should consider using [R](https://www.r-project.org/); you can also use it inside Sage."
1101 ]
1102 },
1103 {
1104 "cell_type": "markdown",
1105 "metadata": {},
1106 "source": [
1107 "## Plotting\n",
1108 "**Reference:** [[15](https://doc.sagemath.org/html/en/reference/plotting/index.html)], more specifically the subsection [[16](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html)].\n",
1109 "\n",
1110 "Some Sage objects can be plotted:"
1111 ]
1112 },
1113 {
1114 "cell_type": "code",
1115 "execution_count": 21,
1116 "metadata": {},
1117 "outputs": [
1118 {
1119 "data": {
1120 "image/png": "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\n",
1121 "text/plain": [
1122 "Graphics object consisting of 1 graphics primitive"
1123 ]
1124 },
1125 "execution_count": 21,
1126 "metadata": {},
1127 "output_type": "execute_result"
1128 }
1129 ],
1130 "source": [
1131 "f = sin(x)\n",
1132 "plot(f)"
1133 ]
1134 },
1135 {
1136 "cell_type": "markdown",
1137 "metadata": {},
1138 "source": [
1139 "Sage's plotting functions are based on Python's [matplotlib](https://matplotlib.org/).\n",
1140 "\n",
1141 "You can give a number of options to adjust the aspect of your plot, see [here](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html#sage.plot.plot.plot). Let's see some of them:"
1142 ]
1143 },
1144 {
1145 "cell_type": "code",
1146 "execution_count": 67,
1147 "metadata": {},
1148 "outputs": [
1149 {
1150 "data": {
1151 "image/png": "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\n",
1152 "text/plain": [
1153 "Graphics object consisting of 1 graphics primitive"
1154 ]
1155 },
1156 "execution_count": 67,
1157 "metadata": {},
1158 "output_type": "execute_result"
1159 }
1160 ],
1161 "source": [
1162 "f = sin(x)\n",
1163 "plot(f,\n",
1164 " -2*pi, 2*pi, # bounds for x\n",
1165 " ymin = -0.7, ymax = 0.7, # bounds for y\n",
1166 " color = \"red\",\n",
1167 " title = \"The sin function\",\n",
1168 " )"
1169 ]
1170 },
1171 {
1172 "cell_type": "markdown",
1173 "metadata": {},
1174 "source": [
1175 "Some of the options are not described precisely in Sage's documentation, but you can find them on [matplotlib's documentation](https://matplotlib.org/stable/contents.html). You can find many examples online for adjusting your plot as you like!"
1176 ]
1177 },
1178 {
1179 "cell_type": "markdown",
1180 "metadata": {},
1181 "source": [
1182 "If you need to plot more than one object at the time, you can sum two plots and show them together with `show()`:"
1183 ]
1184 },
1185 {
1186 "cell_type": "code",
1187 "execution_count": 36,
1188 "metadata": {},
1189 "outputs": [
1190 {
1191 "data": {
1192 "image/png": "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\n",
1193 "text/plain": [
1194 "Graphics object consisting of 2 graphics primitives"
1195 ]
1196 },
1197 "metadata": {},
1198 "output_type": "display_data"
1199 }
1200 ],
1201 "source": [
1202 "cosine = plot(cos(x), (x,-pi/2,pi/2), color=\"red\")\n",
1203 "exponential = plot(exp(x), (x,-2,0.5))\n",
1204 "\n",
1205 "show(cosine + exponential)"
1206 ]
1207 },
1208 {
1209 "cell_type": "markdown",
1210 "metadata": {},
1211 "source": [
1212 "Finally, there are other types of plots that you can use, like [scatter plots](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/scatter_plot.html#sage.plot.scatter_plot.scatter_plot) and [bar charts](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/bar_chart.html#sage.plot.bar_chart.bar_chart). You can also add [text](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/text.html#sage.plot.text.text) to your plot:"
1213 ]
1214 },
1215 {
1216 "cell_type": "code",
1217 "execution_count": 53,
1218 "metadata": {},
1219 "outputs": [
1220 {
1221 "data": {
1222 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkcAAAGGCAYAAABxHyV7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAtOElEQVR4nO3dfZhcdX338fd3d8MGhAyBalVYS1QUNoEQIEErJkEUFEGw0oIPuYUqtBCrctfbCLWCogYK1QisDwhEqpBETW0Rq1IoBAENEBKQBuQpIdiIIEg2xTiE7O/+Y3Y3J7sz+5DM7uyceb+u61yzM+fMzPfMCexnf+d3vhMpJSRJklTSVOsCJEmSxhLDkSRJUobhSJIkKcNwJEmSlGE4kiRJyjAcSZIkZRiOJEmSMgxHkiRJGQ0djqJkQkRErWuRJEljQ0utCxhBg7b+3rBhA4VCgQ0bNoxGPZIkqbaGNBjS0CNHkiRJfdV1OIqI3SJiQUQ8HhGbIuKOiJhe67okSVL9qvfTalcAU4A5wHrgA8CNEdHuF+pKkqTtUbfhKCJ2Bt4DHJ9SurX74fMi4gTgjJoVJkmS6lrdhiNKtTcDf+zz+Cbg8HJPKBaLFIvF3vudnZ0jVpwkSapPdTvnKKW0Efg58I8R8cqIaI6IDwCHAa8o95z58+dTKBR6l7a2ttEsWZKkHRYxekujinqemxMRrwGuAmYCW4B7gIeAg1NK+/fdvtzIUVtbGxs2bGDChAmjVLUkSdtvNENLHUeESob06dXzaTVSSo8CsyLiJcCElNJvImIJsAboF45aW1tpbW0d7TIlSVIdqdvTalkppee7g9FE4Gjg32tdkyRJqk91HY4i4uiIeHtETIqItwE3A78CFta4NEmSVKfqOhwBBaADeBD4F+A24KiU0uaaViVJkupWvc85+i7w3VrXIUmS8qPeR44kSZKqqiHDUUdHB+3t7Uyf7tewSZKkbdV1n6NBDLpjnZ2dFAoF+xxJkuqGfY52yJA+vYYcOZIkSarEcCRJkpRhOJIkScowHEmSJGUYjiRJkjIMR5IkSRkNGY7scyRJkiqxz5F9jiRJdcQ+RzvEPkeSJEnDZTiSJEnKMBxJkiRlGI4kSZIyDEeSJEkZhiNJkqSMhgxH9jmSJEmV2OfIPkeSpDpin6MdYp8jVV9EEBGcd955tS5lSGbPnk1EMHv27FqXIkmqE4YjaZSdcsopvSFz7dq1tS5HktSH4UjaAWvXru0NOt/61rdqXY4kqQoMR5IkSRmGI0mSpAzDkSRJUsawwlFE/CgiUkT8vML6w7vXp4h4LiKay2wzMSK6ureZW+F1XhoRn4+Ild2v88eIWBsR346Iwwd4Ts97/025bT784Q/3zg/ZY489yvY5WrBgARFBS0sLnZ2dA34e2+u5557jC1/4Am984xuZOHEi48aN46UvfSnt7e28+93v5mtf+xpPPfVUv+cN9UqxoV6htXbtWubNm8chhxzCnnvuyfjx45k0aRJHHHEE//zP/8y6desG3Ze77rqL9773vey99960tray1157MWfOHB544IFBnzuQ8847r3d/ofSZnXvuuUyePJldd92VPfbYg9mzZ3PNNdfs0Pv0uO2225gzZw777LMP48ePZ/fdd2fatGl8+tOf5umnny77nIhg0qRJvfdPPfXU3prr7ao+SY1gY60LqB8ppSEvwP+j1D9oM7BrmfWf7l7fsxxaZpsTMuunlFl/FLChz+v0XS4Dmso897+71y9OZbzmNa/pfY3JkyenDRs2JCBt2LChd5vjjz8+AemQQw4p9xI7bPXq1emVr3zlQPuWgHTppZf2e27PunPPPXfA95g1a1YC0qxZsypuc9FFF6Vx48YNWEO552druPTSS1NLS0vZ5+6yyy5p2bJlw/x0tjr33HN7X+uxxx7b5tj1XU488cS0efPm7fostmzZkubOnTvg51AoFNINN9xQ8bMYaCl3rD74wQ/2rl+zZs12f0aSGlOp+9Bwl3sSjOu+HfrzcmhIeadlyCmqZFn3bQtwOPCTPutnl7l/d4VtfkcpzPSKiIOAHwI7UQpgHcC/A88D04BPAZOAud2PzStTXzswq2/h//M//8Ojjz7ae3/16tX87ne/22ablBI/+9nPSkWOUF+cOXPmsH79esaNG8dpp53GO97xDl7+8pfT1dXF+vXrufPOO1m6dOmIvHeP888/n8985jMA7L777px55pkcccQR7Lnnnjz33HPcc889/OAHP+gdtSnnpz/9KcuXL+fAAw/kYx/7GAcccACbNm3iBz/4AV/5ylf4wx/+wJw5c3j44YfZaaeddqjek046iTVr1vC3f/u3nHjiiRQKBe677z4uvPBCHnroIb7//e/zile8gksuuWTYr/2pT32Kjo4OACZNmsS8efM4+OCDef7557nuuuu47LLL2LBhA8ceeyx33nknU6dO7X3uL3/5S9avX8/RRx8NwOc//3mOP/74bV7/ZS972Q7suSRVyyJKv1YXU/p1qgENNUWl0shMM9BJ6a/eC/qsG0cpsCRKgSYB15d5jVXd65aWWXdn97oXgaPKrJ/I1tGhLcDkPuv/qntdeuCBB7aJit/+9rd7R4xe/epXJyBdffXV24wcrVy5svcv+uuuu66qUTWllB599NEBR4Z6dHV1pWeffbbf4z3P3ZGRoxUrVqSmpqYEpNe97nXpiSeeqPg65db11ACkY445JhWLxX7bfP7zn+/d5l//9V8HrLWS7MgRkK699tp+23R2dqapU6cmIDU1NaX77ruv3zYDfRb33Xdf72cxZcqU9Pvf/77fNj/+8Y97t5kxY0a/9WvWrOmtceHChUPaN0eOJO2I4Y8adaUWXpWaILXwZwm6HDkaZBnWnKOU0hbg9u67s/usngHs0h2evtz92OHZeUcRMRE4oPvuLdknR8QMoGcS0BUppRvKvP/vgdO77zYBV0fEmojYFBGPAYf0bHvLLdu8PMuWlQa9Zs+e3TsqdNttt5XdpqmpiTe/+c19336HPfnkk70/z5w5s+J2EcHEiROr/v4AF110EV1dXUQEixcvZu+996647UDrxo8fz8KFC8uOCn30ox/tfbxnJG5HHHvssbz3ve/t9/huu+3G5ZdfDkBXVxdf//rXh/W6X/va1+jq6gLgm9/8Jrvvvnu/bd7+9rfz13/91wDceeed3HXXXcOsvr/W1tayP0vSyFjFi6zjLOBFHgfurXVBY972XK12S/ftIRGxa+bx2d23PwPuADYBBbYdv5uZec9lbOutmZ+vrPTmKaXbgZ7ZvgcBHwH2Bz4JnAn8FvqHo577A4Wjnm2mTp1a9hfljnrFK17R+3MtGgZ2dXXxk5+UzoTOmjWLadO2f2j1bW97W8VTRrvtthv77rsvAI899th2v0ePU089teK6GTNmMHnyZABuvPHGYb1uz/bt7e284Q1vqLjdaaed1u85OyL7PX677bbbDr+eJG31ILCkz3Ixu9HM54DdaAYuLrPNg7Upd4zannDUd95Rj9ndt7eklF4Aft7n8ezPzwK/7PO6U7pvXwBWDlLD8u7bZuA/U0prU0rfB26gNHLVOwoEsH79eh555BEiglmzZnHEEUcA8OCDW/8xpFGYbzRp0qTeEakvf/nLTJ48mc985jP813/9F3/4wx9G5D2z1qxZw3PPPQcMPHI1FPvtt9+A6/fYYw8ANm7c8asjyl1VmDVjxgwAHn74YV544YUhvWaxWOThhx8G4LDDDhtw22nTpjFu3DgA7r///iG9/kB6wlFTUxO77rrrIFtL0nB8Gji5z3Itc9jCLsAH2AJcU2abf6xNuWPU9oSju4H/7f55NkBEjAP+vPuxW/rczs48t+fnW1MqTRLK2KP79tmU0ouD1PBk5udDumuYSmaS+JNPPtkbfm6++WYA9t9/f1pbW5kwYQL77LMP2RLuu+8+nnnmGaA0qjJSFi1axBvf+EagNCn8/PPP58gjj2T33Xdn1qxZfP3rX+ePf/zjiLx3dgJ6dhRre+yyyy4Drm9qKv3T2rJlyw69Dww+qflP//RPgVLA/f3vfz+k18xu1/P8SsaNG8eee+4JwLPPPjuk1x9IoVAAHDWSNBKuJDgJgL+k9MtyI6VLvKF0ldPG7sf/svux4GTgitEtc4wbdjjqDi53dN+d3X07na3zjXpGfW7pvn1zRDRHxO7AgX3WlX2LIZSRvYzq9ojY3P2+C4D5PSt6TpP1jCK95CUvoVAoUCgU+n3hZ882EbHDoyoD2Wuvvbjjjju48cYbOfPMM5k8eTIRwebNm7n11ls544wzmDJlCg899NCI1QAMeCXaWDNYrf1zdnVfvxrvkdUTjrKn1yRVT8ToLmNLgcQi4CqWMp430cJatv7SDGAt8CZaWMp4YCGJaynNglGP7e2QfUv3bc+8o9nd93/WPWkbSqe+NgETKM07Gmi+EZROtQHsGRGDtRjI/qk/BzgY+CDwCUp9kh6CreGo5/ass85iw4YNbNiwgW984xvb7lD3NgceeOCITYbOOvLII+no6OD+++/n6aefZvHixbzlLW8B4NFHH+Wkk07q95yeX+I9k4gref7558s+/id/8ie9P69fv357Sx91v/3tbwdc39MwczgT2bPbZSfKl/Piiy/2jhj1nC7cER/84AdJKQ2pyaYkDV8Ap9LFKh5jHJf2WXsJ8Bjj6GIVcArbjjcItj8c9Z13NLv7/i09G5SZd9Szze+B+8q8Zs9kjp0YvAnDjO7bp1JK16SUfplS+jalq+TO7qlv2bJlrF+/nocffpiI4K1vfSsTJkxgwoQJHHPMMb0v9vTTT3PrrbeWCh2h+UYD2XPPPTnppJO46aabeNe73gXAqlWreufE9Og5DTPQqaOurq5+z+sxadKk3lDQs7/1YLArxHrW77vvvkPuqdTa2to7aXz58uUDbrty5Uo2b94MwJQpU7ZZV08jcJIaTTOJTRwFPA38U/ftUUBiEwy71WHj2N5wdBelnkYAb6P/fCP63J/NtqNL5YY+spcBfajSG0fEGyk1eoStV6312EJpn26B0ohAz+Xd7e3tvPSlL+3dcO+992afffYB4PLLLx+V+UZDceSRR/b+3LdJZc9XVdx9d9++mlv9x3/8Bxs2bCi7rqmpqTcULlu2jJUrB5v3PjZcffXVFdfdfffdvZOk3/rWt1bcrpye7VevXs0vfvGLittdccXWc/F932P8+PG9PxeLxWG9vySNrKW00sQ4oJ1m5gGTaWEnoJUmYGQbDtez7QpHKaXNbB0V+hDwEradb9Tjlu7bWcDUPo/1fc07KYUugA9HxNv6bhMRBaDnfFgC9ouId0bEPhHxbuD/Aj/IvkdP1+RyI0KHH1662K7nFNtg842+9a1v7dB3Zq1atYpVq1ZVXJ9S6r1UPCJ6w1uPnuC2fPlybr/99r5P5ze/+Q0f/ehHB6zhE5/4BE1NTaSUOPnkk/n1r39dcduB1o2m6667ju9+97v9Hv/f//1fTj+91PaqqamJv/mbsl+pV9EZZ5zRO3H89NNPLxsqb7jhBq68stRZYsaMGf2unNtzzz17R6uyHdgHcsopp/T+O+o7902SqqWZJQRdnAA8y0xgBc9wOCcAQRfNLKlpfWPZ9o4cwdYA0jOLKzvfqEfPvKNdGXi+UY/TKV3K3wz8KCL+OSJmR8ShEXEacA9bm0h+hVIf9K9SGkG6mFJw+seU0vrXvva1AL2/8MqFo57L6nu2mTJlSu9VSSNh1apVTJs2jRkzZnD++efzox/9iBUrVvCLX/yCRYsWcfTRR/PDH/4QgOOPP77fFWWnn346LS0tpJQ47rjjWLBgAXfffTd33HEHF110EdOmTaOzs7P3dFE5Bx10EJ/97GcBeOihhzjggAP49Kc/zU033cSqVau45ZZbWLBgATNnzmTOnDkj9lkMx6GHHsr73vc+5s6dy80338yKFStYuHAhhx56aO/o19y5cznwwAMHeaVtHXDAAfz93/89UPoqkIMPPpjLL7+cu+66i2XLlvGJT3yCY489li1btrDTTjv1m6cG0NLS0huYrrrqKhYtWsQDDzzAI488wiOPPFKVq9skafjWsYWVFGkmcSFd3AgcTBc3kbiAIs1s4R7giVoXOjYNtZV234XSXKPsVzx8osJ2N2W2eY4yXxjbZ/vt/uLZ7PKhD32od/uISE899VS/HuKrV6/e5nX/7u/+bsCe41/96ld7t73kkksG3LachQsXDrRPvcvhhx+ennnmmbKv8aUvfani8yZOnJiWLVs2pC+e/eIXv1jxS2N7lsG+eHYgQ6lhIH2/eHbSpEkV63zPe96zQ188e+aZZw74ORQKhfTTn/60Yq3XX399ioiyz/WLZ6XRN/yv19ixZWzu3xMJjkmwvML6X3Svf2JM7dsoqP7Xh/RxJ5DtXHhLhe1uzvxcab5Rr1T62pDXAl+k9D1snUARWEepc9WbU0ofGex1siNFfecb9dhrr722uT/YfKOf/7x0JnHixImccsopA25bzvve9z5uvvlmzjnnHN785jczadIkdtllF3baaSf23ntv3vWud3HttdeybNmyildFnXXWWfzkJz/h6KOPZuLEibS2tjJp0iTmzp3LqlWrhtyG4Oyzz2b16tV8/OMfZ8qUKUyYMIHx48fz6le/miOPPJIFCxawePHiYe/jSJg0aRIrVqzgnHPOYf/992eXXXahUCgwc+ZMvvOd7/D973+flpbtm1jY1NRER0cHt956K+9///t51ate1dsL66CDDuKcc87h4Ycf5qijjqr4Gu985zu56aabOP7443nlK1/Z2zBSkmpnb+BHbL1+qa/DutdX/pqoRhapiv1bxpiKO9bR0UFHRwdbtmzhoYceYsOGDUPqObPPPvvw+OOP89nPfrb3W+01Ms4777ze0385/jcqaQSM9kWko/2/qNHcvxz+73dIn96OjBzVrblz57J69ephfYnounXrePzxxykUCnzsYx8bweokSVItNWQ42h49HbQ/+tGP9nY4liRJ+WMHqCGaM2fOmLl6S5IkjRxHjiRJkjIMR5IkSRkNebVaj87OTgqFwpCvVpMkjX1erVY9OYwIXq0mSZI0XA0Zjjo6Omhvb+/3PVmSJEmeVvO0miTliqfVqieHEcHTapIkScNlOJIkScowHEmSJGUYjiRJkjIMR5IkSRmGI0mSpIyGDEf2OZIkSZXY58g+R5KUK/Y5qp4c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\n",
1223 "text/plain": [
1224 "Graphics object consisting of 3 graphics primitives"
1225 ]
1226 },
1227 "metadata": {},
1228 "output_type": "display_data"
1229 }
1230 ],
1231 "source": [
1232 "b = bar_chart(range(1,10))\n",
1233 "s = scatter_plot([(1,5), (4,2), (8,8), (4,7)],\n",
1234 " marker = \"*\", # symbol\n",
1235 " markersize = 100,\n",
1236 " edgecolor = \"black\",\n",
1237 " facecolor = \"red\"\n",
1238 " )\n",
1239 "t = text(\"wow, such plot!\", (1, 8), color=\"black\", fontsize=20)\n",
1240 "show(b + s + t)"
1241 ]
1242 },
1243 {
1244 "cell_type": "markdown",
1245 "metadata": {},
1246 "source": [
1247 "## Interpolation\n",
1248 "**References:** [[17](https://doc.sagemath.org/html/en/reference/polynomial_rings/sage/rings/polynomial/polynomial_ring.html#sage.rings.polynomial.polynomial_ring.PolynomialRing_field.lagrange_polynomial)] and [[18](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/interpolation.html)].\n",
1249 "\n",
1250 "When you need to work with a discrete set of data, like measurements of real-world quantities, it can be useful to visualize a \"smoothed out\" version of this data, for example by plotting a function that approximates it.\n",
1251 "\n",
1252 "One way to do so is finding the lowest-degree polynomial that passes through all your points. This is called [Lagrange Polynomial](https://en.wikipedia.org/wiki/Lagrange_polynomial)."
1253 ]
1254 },
1255 {
1256 "cell_type": "code",
1257 "execution_count": 65,
1258 "metadata": {},
1259 "outputs": [
1260 {
1261 "data": {
1262 "image/png": "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uFx7LaSnw+LFbicpGhVKIiIS8tavt7/IH34YIiLcThNcqlWDNm3s2K9A5DeFUnx8PDExMcTGxrodRUREQsz48XYj15493U4SnK67Dj7+GBIT3U5SeBrMLSIiIW3DBjj/fHjlFejTx+00wWnXLqhd26523quX22kyaTC3iIhIfp58EurWVWuSN9WqBRdeGJjLBKhQEhGRkLV9O/zvfzBqlMYmeVvXrvDRR3DsmNtJCkeFkoiIhKz//heqVoXbbnM7SfC76io4dAhWrnQ7SeGoUBIRkZC0axe8+ircey+ULu12muDXrBlUrw7vved2ksJRoSQiIiFp0iQoVw7uvtvtJKHBceDqq+Hdd91OUjgqlEREJOT89RfMnAlDh0L58m6nCR1XXw07dtixYYFChZKIiIScadPsZq1DhridJLR07Gi7OQOpVUmFkoiIhJTERHjuORgwACpVcjtNaClTBi69VIWS5OKvv/6iYcOGhIeHMz9Q13L3Y8888wyO43DxxRdz5MgRt+MEJd3DEgymT4fkZBgxwu0koenqq+3Mt3/+cTtJwQRMobRgwQIuv/xyKleujOM4bNiwIcfj1qxZw6WXXkrZsmU57bTTaN++PcnJyVmOSU5OpkyZMmzbto1Vq1bRunVrKlWqRGRkJA0bNmTKlCk5nrt9+/ZFzn/o0CG6dOlC5cqVGTduHL169WLZsmV5vmbChAk4jsOwYcOKfN2C+t///kezZs0oU6YMderU4amnnsry+eXLl+M4TrbHtm3bsp1r3Lhx3HTTTQDcfffd1KtXj8jISE4//XTi4uJyfM3y5csZN25ckfO//vrr3H///TzzzDMcPHiQ6667juPHj2c55sCBA1xxxRVUr16dUqVKUatWLQYPHkxSUlKRr5th+vTpnHfeeURFRREVFUWrVq1YunRprsfffffdOI7D1KlTsz1fkPfr5HsYICUlhQcffJA6depQqlQp6tWrx0svvZTtdb64hydMmEBsbCzly5enSpUqXHvttfzwww9Fvm5BHD16lNtuu40mTZoQERHBtddem+Nx8fHxnHvuuURGRnLOOefw6quvZvn85s2bue6666hbt26O35+T3XbbbYwePTrz3++99x4tW7YkMjKSypUr071792yvefnll3n55ZeL8iV61J49e+jZsyfnnHMOYWFhPvkZ4y+OHoWpU6FvXzjjDLfT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hx9o06YNAMePH+eXX37J1n2W20y+t956iwULFrB8+XJuvPFGHnvsMcaPH59rhvLly1P+pH03ypcvT8WKFb3yfgWDnTth/ny7yGQuP0bFBZ07w6hR8MUX0KGD22ly541CqQy2u+1kaRRzKYKDBw/y22+/8ccffwBkFkTVqlWjWrVqOI7D/fffz9ixY2natCnNmjXjlVdeYdu2bcybNw+wP+A6depEmTJlMs8bHx9P7dq1M6dSr1q1iqeffpohBVzXPj4+njVr1vDdd99Rq1atzKn2a9euzTKupCDKly+fbRxH2bJlqVSpklfHd+zfv5958+bRvn17jh49yuzZs3n77bf5/PPPM4+ZOnUqdevWpVGjRhw7dow5c+Ywf/78zEUHU1NTWbp0aZZ1dXbu3Mlbb71F586dOf300/n999+ZOHEikZGRXHnllfnmOnToELfccgtDhgyhS5cu1K5dmxYtWnD11VfTo0ePQn+d77//Pnv37iU2NpZy5cqxZcsWRo4cSevWralbt26hz3eyBx54gC5dulCrVi0OHTrE3LlzWb58OR988AEAlSpVotIpSwCXKFGCatWqcc455wAFe79yuod79uzJY489Rt++fRk/fjz79+/n/vvv5/bbbycyMjLf7J68hwEGDRrEG2+8weLFiylfvjx//vknANHR0QXKU1Rbtmzh2LFjHDx4kEOHDmWutdasWTPAFo9fffUVLVu25O+//2by5Mls2rQpS+F97NgxtmzZkvnfv//+Oxs2bKBcuXLUr1+fffv2sW7dOhYtWpT5mqioKPr378/YsWOpVatWlnXICnKf7t69mwEDBjBx4kTatGnDyy+/zFVXXUWXLl246KKLPPPm5CDj/Tl8+DB//fUXGzZsoGTJkkUukP3Z1KlQsSLceqvbSeRk550HVarYcUr+XCh5o+vtZWA3/788QDfgL2BiQdrBcpv1Nnv27BzHMp3aXTNhwgRTs2ZNU6ZMGdOqVasszeFt2rTJNpvtmWeeMY0aNTJlypQxUVFR5vzzzzcJCQkFmpa7detWExkZmaVbJDEx0dStW9eMHDmyIF9uvnwx6+2vv/4yF110kSlbtqwpU6aM6dixo/nyyy+zHDNx4kRTr149U7p0aVOhQgXTpk0b895772V+ftmyZdmm2f/++++mS5cupkqVKqZEiRKmZs2apmfPnmbbtm0FytW3b1/TpEmTLFPSp02bZipWrGh2795d4K8vw6effmpatWploqOjTenSpU2DBg3MqFGj8l3yoCBuv/12U6dOHVOyZElz+umnm44dO2ZbsuBUp3btFOT9yukeNsbei506dTKRkZGmZs2aZsSIEdm6rXPijXs4p/9PgVy7nHJSlFlvderUyfG6GbZs2WKaNWtmIiMjTVRUlImLi8t2L2Z07Z/6yOiynDVrVo7LCRw7dszce++9pkqVKqZ8+fKmU6dO2Wa95SQ9Pd107NjRXH755ZlLcRhjzPDhw029evXMoUOHCvS1F2XWW05fZ17dwIFq/37bvVPESYHiZb16GXPBBa5dvkB1jWNOdD14iuM45YHHThRIVYA/gDeBR40xOfdvnCQpKYno6GgSExML1fWWn/3793PGGWewa9euPBeSk6IZOnQoqampJCQkuB0laOkedt8111xDmzZtGDlypNtRpICeeAIefxx+/dW2Xoh/efVV29K3bx+cfrrPL+8U5CCPd70ZYw4Bw048/MbBgweZPHmyfsF4SePGjWnVqpXbMYKa7mH3tWnThptvvtntGFJAR4/Cs8/aX8QqkvxTxtDNTz+FG290N0tuPN6ilI98L+atFiUREQktL74I/frBtm1w9tlup5HcnHMOXHqp3azYxwrUohQwm+KKiIgUlDEwZQp07aoiyd916AC5TMj1CyqUREQk6Hz6KWzeDPfc43YSyU+HDrbV78RGEH5HhZKIiASdadOgSRM/n3YuALRrZz+etCKNX1GhJCIiQeXHH+Hdd21rklOgUSjipmrV4Nxz4bPP3E6SMxVKIiISVJ591i4w2bOn20mkoNq3999xSiqUREQkaCQlwezZ0L8/eHEhePGwDh1g+3Y4sfmGX1GhJCIiQeOllyA5GQYOdDuJFEbGOCV/bFVSoSQiIkEhLc12u/XoAdWru51GCqNKFWjUyD/HKXljU1wRERGfe+892LkT3nzT7SRSFB06wIl9xP2K37QoxcfHExMTQ2xsrNtRREQkAE2dChddBBde6HYSKYp27eyMxd9/dztJVtrCREREAt5330HTprY16aab3E4jRfHnn3DGGfDWW3DDDT65pLYwERGR0PDMM1CjBlx3ndtJpKiqVYP69WHVKreTZKVCSUREAtpff8GcOTBoEJQo4XYaKY42bVQoiYiIeNTMmXYF7rvucjuJFFeb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H40xX58Yd7sRuCeXwz1y/6pQCiLGmGPAN9jZFie7DPiiEKc6H9scLMW3huzfj87A18aY4y7kCQW6f3PgWM9hu3cuNcb8XICX6f4thCK+xznRPVxwDlAql8955P5V11vwmQy85jjO19ib5C6gNrYvF8dxJgA1jDF9Tvx7GPALsBkoCfTGNmdq+m8OHMcpB9Q/6akzHcdpBhw0xvx26vuLfd8HO44zGXgBO7jwDuBmH8YOGIV9f3X/Fko80BOIAw45jpPxl3aiMSYZsv98QPdvYRX6PdY9XHCO4/wHWArswi5MfRPQHrjixOe9c/8aY/QIsgcwEPs/Xgq2hantSZ97GVh+0r9HAj8CydiZGSuBK93+Gvz1ceJ/SpPD4+Wc3t8Tz7UD1p/4fvwM9Hf76/DXR2HfX92/hXpvc3pfDXDbScfo/vXxe6x7uFDv74sn/W7bBywDLsvtvT3xXLHvX62jJCIiIpILjVESERERyYUKJREREZFcqFASERERyYUKJREREZFcqFASERERyYUKJREREZFcqFASERERyYUKJREREZFcqFASERERyYUKJREREZFcqFASERERycX/AcX86mbC2eHsAAAAAElFTkSuQmCC\n",
1263 "text/plain": [
1264 "Graphics object consisting of 3 graphics primitives"
1265 ]
1266 },
1267 "metadata": {},
1268 "output_type": "display_data"
1269 }
1270 ],
1271 "source": [
1272 "points = [ (0,1), (1,2), (1.5,0), (2,4), (3,5) ]\n",
1273 "polring.<x> = QQ[] # you need to specify a polynomial ring\n",
1274 "lp = polring.lagrange_polynomial(points)\n",
1275 "show(scatter_plot(points, facecolor=\"red\")\n",
1276 " + plot(lp, 0, 3) # slightly different notation for polynomials\n",
1277 " + text(lp, (1,8), color=\"black\")\n",
1278 " )"
1279 ]
1280 },
1281 {
1282 "cell_type": "markdown",
1283 "metadata": {},
1284 "source": [
1285 "One can compute the Lagrange Polynomial over any base ring, and it has the advantage that it is a very \"nice\" function (continuous and differentiable as much as you like, with easily computable derivatives and primitives).\n",
1286 "\n",
1287 "However, it does not always give you good approximation of your data:"
1288 ]
1289 },
1290 {
1291 "cell_type": "code",
1292 "execution_count": 2,
1293 "metadata": {},
1294 "outputs": [
1295 {
1296 "data": {
1297 "image/png": "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\n",
1298 "text/plain": [
1299 "Graphics object consisting of 2 graphics primitives"
1300 ]
1301 },
1302 "metadata": {},
1303 "output_type": "display_data"
1304 }
1305 ],
1306 "source": [
1307 "R = [x/10 for x in range(-10,10)]\n",
1308 "L = [1/(1+25*x^2) for x in R]\n",
1309 "points = [(R[i], L[i]) for i in range(len(L))]\n",
1310 "polring.<x> = RR[]\n",
1311 "lp = polring.lagrange_polynomial(points)\n",
1312 "\n",
1313 "show(plot(lp, -0.82, 0.72) + scatter_plot(points))"
1314 ]
1315 },
1316 {
1317 "cell_type": "markdown",
1318 "metadata": {},
1319 "source": [
1320 "This particular example is called [Runge's phenomenon](https://en.wikipedia.org/wiki/Runge%27s_phenomenon). For a better approximation you can use a [spline](https://en.wikipedia.org/wiki/Spline_(mathematics)), which is a *piecewise* polynomial function:"
1321 ]
1322 },
1323 {
1324 "cell_type": "code",
1325 "execution_count": 90,
1326 "metadata": {},
1327 "outputs": [
1328 {
1329 "data": {
1330 "image/png": "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\n",
1331 "text/plain": [
1332 "Graphics object consisting of 2 graphics primitives"
1333 ]
1334 },
1335 "metadata": {},
1336 "output_type": "display_data"
1337 }
1338 ],
1339 "source": [
1340 "show(plot(spline(points), -1, 1) + scatter_plot(points))"
1341 ]
1342 },
1343 {
1344 "cell_type": "markdown",
1345 "metadata": {},
1346 "source": [
1347 "A detailed explanation of splines is a good topic for a course of numerical analysis. For this course it is enough that you know that they exist and they can be plotted."
1348 ]
1349 }
1350 ],
1351 "metadata": {
1352 "kernelspec": {
1353 "display_name": "SageMath 9.2",
1354 "language": "sage",
1355 "name": "sagemath"
1356 },
1357 "language_info": {
1358 "codemirror_mode": {
1359 "name": "ipython",
1360 "version": 3
1361 },
1362 "file_extension": ".py",
1363 "mimetype": "text/x-python",
1364 "name": "python",
1365 "nbconvert_exporter": "python",
1366 "pygments_lexer": "ipython3",
1367 "version": "3.8.5"
1368 }
1369 },
1370 "nbformat": 4,
1371 "nbformat_minor": 4
1372}
diff --git a/src/Lecture6/notebook/8-SageCalculus.log b/src/Lecture6/notebook/8-SageCalculus.log
new file mode 100644
index 0000000..0614274
--- /dev/null
+++ b/src/Lecture6/notebook/8-SageCalculus.log
@@ -0,0 +1,1106 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/VoidLinux) (preloaded format=pdflatex 2021.4.20) 7 MAY 2021 18:13
2entering extended mode
3 \write18 enabled.
4 %&-line parsing enabled.
5**8-SageCalculus.tex
6(./8-SageCalculus.tex
7LaTeX2e <2020-10-01> patch level 2
8L3 programming layer <2020-12-03> xparse <2020-03-03>
9(/usr/share/texmf-dist/tex/latex/base/article.cls
10Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
11(/usr/share/texmf-dist/tex/latex/base/size11.clo
12File: size11.clo 2020/04/10 v1.4m Standard LaTeX file (size option)
13)
14\c@part=\count177
15\c@section=\count178
16\c@subsection=\count179
17\c@subsubsection=\count180
18\c@paragraph=\count181
19\c@subparagraph=\count182
20\c@figure=\count183
21\c@table=\count184
22\abovecaptionskip=\skip47
23\belowcaptionskip=\skip48
24\bibindent=\dimen138
25)
26(/usr/share/texmf-dist/tex/latex/tcolorbox/tcolorbox.sty
27Package: tcolorbox 2020/10/09 version 4.42 text color boxes
28
29(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
30(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
31(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
32\pgfutil@everybye=\toks15
33\pgfutil@tempdima=\dimen139
34\pgfutil@tempdimb=\dimen140
35
36(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex))
37(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
38\pgfutil@abb=\box47
39)
40(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
41(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex)
42Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a)
43))
44Package: pgf 2020/12/01 v3.1.7a (3.1.7a)
45
46(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
47(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty
48Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR)
49
50(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty
51Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
52\KV@toks@=\toks16
53)
54(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty
55Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR)
56
57(/usr/share/texmf-dist/tex/latex/graphics/trig.sty
58Package: trig 2016/01/03 v1.10 sin cos tan (DPC)
59)
60(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
61File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration
62)
63Package graphics Info: Driver file: pdftex.def on input line 105.
64
65(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def
66File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex
67))
68\Gin@req@height=\dimen141
69\Gin@req@width=\dimen142
70)
71(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
72(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
73Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a)
74
75(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
76\pgfkeys@pathtoks=\toks17
77\pgfkeys@temptoks=\toks18
78
79(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex
80\pgfkeys@tmptoks=\toks19
81))
82\pgf@x=\dimen143
83\pgf@y=\dimen144
84\pgf@xa=\dimen145
85\pgf@ya=\dimen146
86\pgf@xb=\dimen147
87\pgf@yb=\dimen148
88\pgf@xc=\dimen149
89\pgf@yc=\dimen150
90\pgf@xd=\dimen151
91\pgf@yd=\dimen152
92\w@pgf@writea=\write3
93\r@pgf@reada=\read2
94\c@pgf@counta=\count185
95\c@pgf@countb=\count186
96\c@pgf@countc=\count187
97\c@pgf@countd=\count188
98\t@pgf@toka=\toks20
99\t@pgf@tokb=\toks21
100\t@pgf@tokc=\toks22
101\pgf@sys@id@count=\count189
102
103(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
104File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a)
105)
106Driver file for pgf: pgfsys-pdftex.def
107
108(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
109File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a)
110
111(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def
112File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a)
113)))
114(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
115File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a)
116\pgfsyssoftpath@smallbuffer@items=\count190
117\pgfsyssoftpath@bigbuffer@items=\count191
118)
119(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
120File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a)
121))
122(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty
123Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
124
125(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg
126File: color.cfg 2016/01/02 v1.6 sample color configuration
127)
128Package xcolor Info: Driver file: pdftex.def on input line 225.
129Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
130Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
131Package xcolor Info: Model `RGB' extended on input line 1364.
132Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
133Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
134Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
135Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
136Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
137Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
138)
139(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
140Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a)
141
142(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
143(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
144(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex)
145(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
146\pgfmath@dimen=\dimen153
147\pgfmath@count=\count192
148\pgfmath@box=\box48
149\pgfmath@toks=\toks23
150\pgfmath@stack@operand=\toks24
151\pgfmath@stack@operation=\toks25
152)
153(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex
154(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex)
155(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code
156.tex)
157(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex)
158(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te
159x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex)
160(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex)
161(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex)
162(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics
163.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
164\c@pgfmathroundto@lastzeros=\count193
165)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex)
166(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex
167File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a)
168\pgf@picminx=\dimen154
169\pgf@picmaxx=\dimen155
170\pgf@picminy=\dimen156
171\pgf@picmaxy=\dimen157
172\pgf@pathminx=\dimen158
173\pgf@pathmaxx=\dimen159
174\pgf@pathminy=\dimen160
175\pgf@pathmaxy=\dimen161
176\pgf@xx=\dimen162
177\pgf@xy=\dimen163
178\pgf@yx=\dimen164
179\pgf@yy=\dimen165
180\pgf@zx=\dimen166
181\pgf@zy=\dimen167
182)
183(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex
184File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a)
185\pgf@path@lastx=\dimen168
186\pgf@path@lasty=\dimen169
187) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex
188File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
189\pgf@shorten@end@additional=\dimen170
190\pgf@shorten@start@additional=\dimen171
191)
192(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex
193File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
194\pgfpic=\box49
195\pgf@hbox=\box50
196\pgf@layerbox@main=\box51
197\pgf@picture@serial@count=\count194
198)
199(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex
200File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a)
201\pgflinewidth=\dimen172
202)
203(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t
204ex
205File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a)
206\pgf@pt@x=\dimen173
207\pgf@pt@y=\dimen174
208\pgf@pt@temp=\dimen175
209) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
210File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a)
211)
212(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex
213File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a)
214)
215(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te
216x
217File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a)
218) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex
219File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a)
220\pgfarrowsep=\dimen176
221)
222(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
223File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a)
224\pgf@max=\dimen177
225\pgf@sys@shading@range@num=\count195
226\pgf@shadingcount=\count196
227)
228(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
229File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
230
231(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex
232File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a)
233\pgfexternal@startupbox=\box52
234))
235(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex
236File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a)
237)
238(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex
239File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a)
240) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex
241File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a)
242)
243(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
244File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a)
245)))
246(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
247File: pgfmoduleshapes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
248\pgfnodeparttextbox=\box53
249)
250(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
251File: pgfmoduleplot.code.tex 2020/12/01 v3.1.7a (3.1.7a)
252)
253(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
254Package: pgfcomp-version-0-65 2020/12/01 v3.1.7a (3.1.7a)
255\pgf@nodesepstart=\dimen178
256\pgf@nodesepend=\dimen179
257)
258(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
259Package: pgfcomp-version-1-18 2020/12/01 v3.1.7a (3.1.7a)
260))
261(/usr/share/texmf-dist/tex/latex/tools/verbatim.sty
262Package: verbatim 2020-07-07 v1.5u LaTeX2e package for verbatim enhancements
263\every@verbatim=\toks26
264\verbatim@line=\toks27
265\verbatim@in@stream=\read3
266)
267(/usr/share/texmf-dist/tex/latex/environ/environ.sty
268Package: environ 2014/05/04 v0.3 A new way to define environments
269
270(/usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty
271Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list
272)
273\@envbody=\toks28
274)
275(/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty
276Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW)
277\etb@tempcnta=\count197
278)
279\tcb@titlebox=\box54
280\tcb@upperbox=\box55
281\tcb@lowerbox=\box56
282\tcb@phantombox=\box57
283\c@tcbbreakpart=\count198
284\c@tcblayer=\count199
285\c@tcolorbox@number=\count266
286\tcb@temp=\box58
287\tcb@temp=\box59
288\tcb@temp=\box60
289\tcb@temp=\box61
290\tcb@out=\write4
291\tcb@record@out=\write5
292
293(/usr/share/texmf-dist/tex/latex/tcolorbox/tcbbreakable.code.tex
294Library (tcolorbox): 'tcbbreakable.code.tex' version '4.42'
295(/usr/share/texmf-dist/tex/generic/oberdiek/pdfcol.sty
296Package: pdfcol 2019/12/29 v1.6 Handle new color stacks for pdfTeX (HO)
297
298(/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
299Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO)
300)
301(/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty
302Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO)
303)
304(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty
305Package: iftex 2020/03/06 v1.0d TeX engine tests
306))
307Package pdfcol Info: New color stack `tcb@breakable' = 1 on input line 23.
308\tcb@testbox=\box62
309\tcb@totalupperbox=\box63
310\tcb@totallowerbox=\box64
311))
312(/usr/share/texmf-dist/tex/latex/parskip/parskip.sty
313Package: parskip 2020-06-15 v2.0f non-zero parskip adjustments
314
315(/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty
316Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO)
317
318(/usr/share/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
319Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO)
320)))
321(/usr/share/texmf-dist/tex/latex/base/fontenc.sty
322Package: fontenc 2020/08/10 v2.0s Standard LaTeX package
323)
324(/usr/share/texmf-dist/tex/latex/psnfss/mathpazo.sty
325Package: mathpazo 2020/03/25 PSNFSS-v9.3 Palatino w/ Pazo Math (D.Puga, WaS)
326\symupright=\mathgroup4
327)
328(/usr/share/texmf-dist/tex/latex/caption/caption.sty
329Package: caption 2020/10/26 v3.5g Customizing captions (AR)
330
331(/usr/share/texmf-dist/tex/latex/caption/caption3.sty
332Package: caption3 2020/10/21 v2.2e caption3 kernel (AR)
333\captionmargin=\dimen180
334\captionmargin@=\dimen181
335\captionwidth=\dimen182
336\caption@tempdima=\dimen183
337\caption@indent=\dimen184
338\caption@parindent=\dimen185
339\caption@hangindent=\dimen186
340Package caption Info: Standard document class detected.
341)
342\c@caption@flags=\count267
343\c@continuedfloat=\count268
344)
345(/usr/share/texmf-dist/tex/latex/adjustbox/adjustbox.sty
346Package: adjustbox 2020/08/19 v1.3 Adjusting TeX boxes (trim, clip, ...)
347
348(/usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty
349Package: xkeyval 2020/11/20 v2.8 package option processing (HA)
350
351(/usr/share/texmf-dist/tex/generic/xkeyval/xkeyval.tex
352(/usr/share/texmf-dist/tex/generic/xkeyval/xkvutils.tex
353\XKV@toks=\toks29
354\XKV@tempa@toks=\toks30
355)
356\XKV@depth=\count269
357File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA)
358))
359(/usr/share/texmf-dist/tex/latex/adjustbox/adjcalc.sty
360Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back
361-ends (calc, etex, pgfmath)
362)
363(/usr/share/texmf-dist/tex/latex/adjustbox/trimclip.sty
364Package: trimclip 2020/08/19 v1.2 Trim and clip general TeX material
365
366(/usr/share/texmf-dist/tex/latex/collectbox/collectbox.sty
367Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes
368\collectedbox=\box65
369)
370\tc@llx=\dimen187
371\tc@lly=\dimen188
372\tc@urx=\dimen189
373\tc@ury=\dimen190
374Package trimclip Info: Using driver 'tc-pdftex.def'.
375
376(/usr/share/texmf-dist/tex/latex/adjustbox/tc-pdftex.def
377File: tc-pdftex.def 2019/01/04 v2.2 Clipping driver for pdftex
378))
379\adjbox@Width=\dimen191
380\adjbox@Height=\dimen192
381\adjbox@Depth=\dimen193
382\adjbox@Totalheight=\dimen194
383\adjbox@pwidth=\dimen195
384\adjbox@pheight=\dimen196
385\adjbox@pdepth=\dimen197
386\adjbox@ptotalheight=\dimen198
387
388(/usr/share/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty
389Package: ifoddpage 2016/04/23 v1.1 Conditionals for odd/even page detection
390\c@checkoddpage=\count270
391)
392(/usr/share/texmf-dist/tex/latex/varwidth/varwidth.sty
393Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages
394\@vwid@box=\box66
395\sift@deathcycles=\count271
396\@vwid@loff=\dimen199
397\@vwid@roff=\dimen256
398))
399(/usr/share/texmf-dist/tex/latex/float/float.sty
400Package: float 2001/11/08 v1.3d Float enhancements (AL)
401\c@float@type=\count272
402\float@exts=\toks31
403\float@box=\box67
404\@float@everytoks=\toks32
405\@floatcapt=\box68
406)
407(/usr/share/texmf-dist/tex/latex/tools/enumerate.sty
408Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC)
409\@enLab=\toks33
410)
411(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty
412Package: geometry 2020/01/02 v5.9 Page Geometry
413
414(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty
415Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
416)
417\Gm@cnth=\count273
418\Gm@cntv=\count274
419\c@Gm@tempcnt=\count275
420\Gm@bindingoffset=\dimen257
421\Gm@wd@mp=\dimen258
422\Gm@odd@mp=\dimen259
423\Gm@even@mp=\dimen260
424\Gm@layoutwidth=\dimen261
425\Gm@layoutheight=\dimen262
426\Gm@layouthoffset=\dimen263
427\Gm@layoutvoffset=\dimen264
428\Gm@dimlist=\toks34
429)
430(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty
431Package: amsmath 2020/09/23 v2.17i AMS math features
432\@mathmargin=\skip49
433
434For additional information on amsmath, use the `?' option.
435(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty
436Package: amstext 2000/06/29 v2.01 AMS text
437
438(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty
439File: amsgen.sty 1999/11/30 v2.0 generic functions
440\@emptytoks=\toks35
441\ex@=\dimen265
442))
443(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty
444Package: amsbsy 1999/11/29 v1.2d Bold Symbols
445\pmbraise@=\dimen266
446)
447(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty
448Package: amsopn 2016/03/08 v2.02 operator names
449)
450\inf@bad=\count276
451LaTeX Info: Redefining \frac on input line 234.
452\uproot@=\count277
453\leftroot@=\count278
454LaTeX Info: Redefining \overline on input line 399.
455\classnum@=\count279
456\DOTSCASE@=\count280
457LaTeX Info: Redefining \ldots on input line 496.
458LaTeX Info: Redefining \dots on input line 499.
459LaTeX Info: Redefining \cdots on input line 620.
460\Mathstrutbox@=\box69
461\strutbox@=\box70
462\big@size=\dimen267
463LaTeX Font Info: Redeclaring font encoding OML on input line 743.
464LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
465\macc@depth=\count281
466\c@MaxMatrixCols=\count282
467\dotsspace@=\muskip16
468\c@parentequation=\count283
469\dspbrk@lvl=\count284
470\tag@help=\toks36
471\row@=\count285
472\column@=\count286
473\maxfields@=\count287
474\andhelp@=\toks37
475\eqnshift@=\dimen268
476\alignsep@=\dimen269
477\tagshift@=\dimen270
478\tagwidth@=\dimen271
479\totwidth@=\dimen272
480\lineht@=\dimen273
481\@envbody=\toks38
482\multlinegap=\skip50
483\multlinetaggap=\skip51
484\mathdisplay@stack=\toks39
485LaTeX Info: Redefining \[ on input line 2923.
486LaTeX Info: Redefining \] on input line 2924.
487)
488(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty
489Package: amssymb 2013/01/14 v3.01 AMS font symbols
490
491(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty
492Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
493\symAMSa=\mathgroup5
494\symAMSb=\mathgroup6
495LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
496LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
497(Font) U/euf/m/n --> U/euf/b/n on input line 106.
498))
499(/usr/share/texmf-dist/tex/latex/base/textcomp.sty
500Package: textcomp 2020/02/02 v2.0n Standard LaTeX package
501)
502(/usr/share/texmf-dist/tex/latex/upquote/upquote.sty
503Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba
504tim
505)
506(/usr/share/texmf-dist/tex/latex/eurosym/eurosym.sty
507Package: eurosym 1998/08/06 v1.1 European currency symbol ``Euro''
508\@eurobox=\box71
509)
510(/usr/share/texmf-dist/tex/latex/ucs/ucs.sty
511Package: ucs 2013/05/11 v2.2 UCS: Unicode input support
512
513(/usr/share/texmf-dist/tex/latex/ucs/data/uni-global.def
514File: uni-global.def 2013/05/13 UCS: Unicode global data
515)
516\uc@secondtry=\count288
517\uc@combtoks=\toks40
518\uc@combtoksb=\toks41
519\uc@temptokena=\toks42
520)
521(/usr/share/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty
522Package: fancyvrb 2020/05/03 v3.6 verbatim text (tvz,hv)
523\FV@CodeLineNo=\count289
524\FV@InFile=\read4
525\FV@TabBox=\box72
526\c@FancyVerbLine=\count290
527\FV@StepNumber=\count291
528\FV@OutFile=\write6
529)
530(/usr/share/texmf-dist/tex/latex/grffile/grffile.sty
531Package: grffile 2019/11/11 v2.1 Extended file name support for graphics (legac
532y)
533Package grffile Info: This package is an empty stub for compatibility on input
534line 40.
535)
536(/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty
537Package: hyperref 2020-05-15 v7.00e Hypertext links for LaTeX
538
539(/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
540Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO
541)
542Package pdftexcmds Info: \pdf@primitive is available.
543Package pdftexcmds Info: \pdf@ifprimitive is available.
544Package pdftexcmds Info: \pdfdraftmode found.
545)
546(/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
547Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO)
548)
549(/usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty
550Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO)
551)
552(/usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty
553Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO)
554)
555(/usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
556Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO)
557)
558(/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty
559Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO)
560)
561\@linkdim=\dimen274
562\Hy@linkcounter=\count292
563\Hy@pagecounter=\count293
564
565(/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def
566File: pd1enc.def 2020-05-15 v7.00e Hyperref: PDFDocEncoding definition (HO)
567Now handling font encoding PD1 ...
568... no UTF-8 mapping file for font encoding PD1
569)
570(/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty
571Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO)
572)
573(/usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty
574Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO)
575)
576\Hy@SavedSpaceFactor=\count294
577Package hyperref Info: Hyper figures OFF on input line 4464.
578Package hyperref Info: Link nesting OFF on input line 4469.
579Package hyperref Info: Hyper index ON on input line 4472.
580Package hyperref Info: Plain pages OFF on input line 4479.
581Package hyperref Info: Backreferencing OFF on input line 4484.
582Package hyperref Info: Implicit mode ON; LaTeX internals redefined.
583Package hyperref Info: Bookmarks ON on input line 4717.
584\c@Hy@tempcnt=\count295
585
586(/usr/share/texmf-dist/tex/latex/url/url.sty
587\Urlmuskip=\muskip17
588Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
589)
590LaTeX Info: Redefining \url on input line 5076.
591\XeTeXLinkMargin=\dimen275
592
593(/usr/share/texmf-dist/tex/generic/bitset/bitset.sty
594Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO)
595
596(/usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
597Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO
598)
599))
600\Fld@menulength=\count296
601\Field@Width=\dimen276
602\Fld@charsize=\dimen277
603Package hyperref Info: Hyper figures OFF on input line 6347.
604Package hyperref Info: Link nesting OFF on input line 6352.
605Package hyperref Info: Hyper index ON on input line 6355.
606Package hyperref Info: backreferencing OFF on input line 6362.
607Package hyperref Info: Link coloring OFF on input line 6367.
608Package hyperref Info: Link coloring with OCG OFF on input line 6372.
609Package hyperref Info: PDF/A mode OFF on input line 6377.
610LaTeX Info: Redefining \ref on input line 6417.
611LaTeX Info: Redefining \pageref on input line 6421.
612
613(/usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty
614Package: atbegshi-ltx 2020/08/17 v1.0a Emulation of the original atbegshi packa
615ge
616with kernel methods
617)
618\Hy@abspage=\count297
619\c@Item=\count298
620\c@Hfootnote=\count299
621)
622Package hyperref Info: Driver (autodetected): hpdftex.
623
624(/usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def
625File: hpdftex.def 2020-05-15 v7.00e Hyperref driver for pdfTeX
626
627(/usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty
628Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atvery packag
629e
630with kernel methods
631)
632\Fld@listcount=\count300
633\c@bookmark@seq@number=\count301
634
635(/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
636Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO)
637
638(/usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
639Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO)
640)
641Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2
64286.
643)
644\Hy@SectionHShift=\skip52
645)
646(/usr/share/texmf-dist/tex/latex/titling/titling.sty
647Package: titling 2009/09/04 v2.1d maketitle typesetting
648\thanksmarkwidth=\skip53
649\thanksmargin=\skip54
650\droptitle=\skip55
651)
652(/usr/share/texmf-dist/tex/latex/tools/longtable.sty
653Package: longtable 2020/01/07 v4.13 Multi-page Table package (DPC)
654\LTleft=\skip56
655\LTright=\skip57
656\LTpre=\skip58
657\LTpost=\skip59
658\LTchunksize=\count302
659\LTcapwidth=\dimen278
660\LT@head=\box73
661\LT@firsthead=\box74
662\LT@foot=\box75
663\LT@lastfoot=\box76
664\LT@cols=\count303
665\LT@rows=\count304
666\c@LT@tables=\count305
667\c@LT@chunks=\count306
668\LT@p@ftn=\toks43
669)
670(/usr/share/texmf-dist/tex/latex/booktabs/booktabs.sty
671Package: booktabs 2020/01/12 v1.61803398 Publication quality tables
672\heavyrulewidth=\dimen279
673\lightrulewidth=\dimen280
674\cmidrulewidth=\dimen281
675\belowrulesep=\dimen282
676\belowbottomsep=\dimen283
677\aboverulesep=\dimen284
678\abovetopsep=\dimen285
679\cmidrulesep=\dimen286
680\cmidrulekern=\dimen287
681\defaultaddspace=\dimen288
682\@cmidla=\count307
683\@cmidlb=\count308
684\@aboverulesep=\dimen289
685\@belowrulesep=\dimen290
686\@thisruleclass=\count309
687\@lastruleclass=\count310
688\@thisrulewidth=\dimen291
689)
690(/usr/share/texmf-dist/tex/latex/enumitem/enumitem.sty
691Package: enumitem 2019/06/20 v3.9 Customized lists
692\labelindent=\skip60
693\enit@outerparindent=\dimen292
694\enit@toks=\toks44
695\enit@inbox=\box77
696\enit@count@id=\count311
697\enitdp@description=\count312
698)
699(/usr/share/texmf-dist/tex/generic/ulem/ulem.sty
700\UL@box=\box78
701\UL@hyphenbox=\box79
702\UL@skip=\skip61
703\UL@hook=\toks45
704\UL@height=\dimen293
705\UL@pe=\count313
706\UL@pixel=\dimen294
707\ULC@box=\box80
708Package: ulem 2019/11/18
709\ULdepth=\dimen295
710)
711(/usr/share/texmf-dist/tex/latex/jknapltx/mathrsfs.sty
712Package: mathrsfs 1996/01/01 Math RSFS package v1.0 (jk)
713\symrsfs=\mathgroup7
714)
715\Wrappedcontinuationbox=\box81
716\Wrappedvisiblespacebox=\box82
717Package hyperref Info: Option `breaklinks' set `true' on input line 361.
718Package hyperref Info: Option `colorlinks' set `true' on input line 361.
719LaTeX Font Info: Trying to load font information for T1+ppl on input line 36
7208.
721
722(/usr/share/texmf-dist/tex/latex/psnfss/t1ppl.fd
723File: t1ppl.fd 2001/06/04 font definitions for T1/ppl.
724)
725(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
726File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX)
727\l__kernel_color_stack_int=\count314
728\l__pdf_internal_box=\box83
729)
730(./8-SageCalculus.aux)
731\openout1 = `8-SageCalculus.aux'.
732
733LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 368.
734LaTeX Font Info: ... okay on input line 368.
735LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 368.
736LaTeX Font Info: ... okay on input line 368.
737LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 368.
738LaTeX Font Info: ... okay on input line 368.
739LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 368.
740LaTeX Font Info: ... okay on input line 368.
741LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 368.
742LaTeX Font Info: ... okay on input line 368.
743LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 368.
744LaTeX Font Info: ... okay on input line 368.
745LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 368.
746LaTeX Font Info: ... okay on input line 368.
747LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 368.
748LaTeX Font Info: ... okay on input line 368.
749
750(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
751[Loading MPS to PDF converter (version 2006.09.02).]
752\scratchcounter=\count315
753\scratchdimen=\dimen296
754\scratchbox=\box84
755\nofMPsegments=\count316
756\nofMParguments=\count317
757\everyMPshowfont=\toks46
758\MPscratchCnt=\count318
759\MPscratchDim=\dimen297
760\MPnumerator=\count319
761\makeMPintoPDFobject=\count320
762\everyMPtoPDFconversion=\toks47
763) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
764Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
765Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
76685.
767
768(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
769File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
770e
771))
772Package caption Info: Begin \AtBeginDocument code.
773Package caption Info: float package is loaded.
774Package caption Info: hyperref package is loaded.
775Package caption Info: longtable package is loaded.
776
777(/usr/share/texmf-dist/tex/latex/caption/ltcaption.sty
778Package: ltcaption 2020/05/30 v1.4b longtable captions (AR)
779)
780Package caption Info: End \AtBeginDocument code.
781
782*geometry* driver: auto-detecting
783*geometry* detected driver: pdftex
784*geometry* verbose mode - [ preamble ] result:
785* driver: pdftex
786* paper: <default>
787* layout: <same size as paper>
788* layoutoffset:(h,v)=(0.0pt,0.0pt)
789* modes:
790* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt)
791* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt)
792* \paperwidth=614.295pt
793* \paperheight=794.96999pt
794* \textwidth=469.75502pt
795* \textheight=650.43001pt
796* \oddsidemargin=0.0pt
797* \evensidemargin=0.0pt
798* \topmargin=-37.0pt
799* \headheight=12.0pt
800* \headsep=25.0pt
801* \topskip=11.0pt
802* \footskip=30.0pt
803* \marginparwidth=59.0pt
804* \marginparsep=10.0pt
805* \columnsep=10.0pt
806* \skip\footins=10.0pt plus 4.0pt minus 2.0pt
807* \hoffset=0.0pt
808* \voffset=0.0pt
809* \mag=1000
810* \@twocolumnfalse
811* \@twosidefalse
812* \@mparswitchfalse
813* \@reversemarginfalse
814* (1in=72.27pt=25.4mm, 1cm=28.453pt)
815
816(/usr/share/texmf-dist/tex/latex/ucs/ucsencs.def
817File: ucsencs.def 2011/01/21 Fixes to fontencodings LGR, T3
818)
819Package hyperref Info: Link coloring ON on input line 368.
820
821(/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty
822Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section
823
824(/usr/share/texmf-dist/tex/latex/refcount/refcount.sty
825Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO)
826)
827(/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
828Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO)
829)
830\c@section@level=\count321
831)
832LaTeX Info: Redefining \ref on input line 368.
833LaTeX Info: Redefining \pageref on input line 368.
834LaTeX Info: Redefining \nameref on input line 368.
835
836(./8-SageCalculus.out) (./8-SageCalculus.out)
837\@outlinefile=\write7
838\openout7 = `8-SageCalculus.out'.
839
840LaTeX Font Info: Trying to load font information for OT1+ppl on input line 3
84170.
842
843(/usr/share/texmf-dist/tex/latex/psnfss/ot1ppl.fd
844File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl.
845)
846LaTeX Font Info: Trying to load font information for OML+zplm on input line
847370.
848
849(/usr/share/texmf-dist/tex/latex/psnfss/omlzplm.fd
850File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm.
851)
852LaTeX Font Info: Trying to load font information for OMS+zplm on input line
853370.
854
855(/usr/share/texmf-dist/tex/latex/psnfss/omszplm.fd
856File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm.
857)
858LaTeX Font Info: Trying to load font information for OMX+zplm on input line
859370.
860
861(/usr/share/texmf-dist/tex/latex/psnfss/omxzplm.fd
862File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm.
863)
864LaTeX Font Info: Trying to load font information for OT1+zplm on input line
865370.
866
867(/usr/share/texmf-dist/tex/latex/psnfss/ot1zplm.fd
868File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm.
869)
870LaTeX Font Info: Font shape `U/msa/m/n' will be
871(Font) scaled to size 12.50409pt on input line 370.
872LaTeX Font Info: Font shape `U/msa/m/n' will be
873(Font) scaled to size 9.37807pt on input line 370.
874LaTeX Font Info: Font shape `U/msa/m/n' will be
875(Font) scaled to size 7.29405pt on input line 370.
876LaTeX Font Info: Font shape `U/msb/m/n' will be
877(Font) scaled to size 12.50409pt on input line 370.
878LaTeX Font Info: Font shape `U/msb/m/n' will be
879(Font) scaled to size 9.37807pt on input line 370.
880LaTeX Font Info: Font shape `U/msb/m/n' will be
881(Font) scaled to size 7.29405pt on input line 370.
882LaTeX Font Info: Trying to load font information for U+rsfs on input line 37
8830.
884
885(/usr/share/texmf-dist/tex/latex/jknapltx/ursfs.fd
886File: ursfs.fd 1998/03/24 rsfs font definition file (jk)
887)
888LaTeX Font Info: Trying to load font information for T1+cmtt on input line 3
88970.
890
891(/usr/share/texmf-dist/tex/latex/base/t1cmtt.fd
892File: t1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions
893)
894LaTeX Font Info: Font shape `U/msa/m/n' will be
895(Font) scaled to size 6.25204pt on input line 391.
896LaTeX Font Info: Font shape `U/msa/m/n' will be
897(Font) scaled to size 5.21004pt on input line 391.
898LaTeX Font Info: Font shape `U/msb/m/n' will be
899(Font) scaled to size 6.25204pt on input line 391.
900LaTeX Font Info: Font shape `U/msb/m/n' will be
901(Font) scaled to size 5.21004pt on input line 391.
902LaTeX Font Info: Trying to load font information for TS1+cmtt on input line
903392.
904
905(/usr/share/texmf-dist/tex/latex/base/ts1cmtt.fd
906File: ts1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions
907)
908LaTeX Font Info: Font shape `U/msa/m/n' will be
909(Font) scaled to size 11.40997pt on input line 432.
910LaTeX Font Info: Font shape `U/msa/m/n' will be
911(Font) scaled to size 8.33606pt on input line 432.
912LaTeX Font Info: Font shape `U/msb/m/n' will be
913(Font) scaled to size 11.40997pt on input line 432.
914LaTeX Font Info: Font shape `U/msb/m/n' will be
915(Font) scaled to size 8.33606pt on input line 432.
916 [1
917
918{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
919LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <10.95> not available
920(Font) Font shape `T1/cmtt/m/n' tried instead on input line 511.
921 [2]
922Underfull \hbox (badness 10000) in paragraph at lines 541--545
923[]\T1/ppl/m/n/10.95 When solv-ing a sys-tem of equa-tions (not in-equal-i-ties)
924, you can use the op-tion
925 []
926
927[3] [4] [5] [6] [7] [8] [9] [10]
928<output_75_0.png, id=190, 423.5022pt x 281.853pt>
929File: output_75_0.png Graphic file (type png)
930<use output_75_0.png>
931Package pdftex.def Info: output_75_0.png used on input line 1282.
932(pdftex.def) Requested size: 423.50114pt x 281.85231pt.
933 [11]
934Underfull \hbox (badness 10000) in paragraph at lines 1284--1285
935
936 []
937
938
939Underfull \hbox (badness 10000) in paragraph at lines 1290--1293
940[]\T1/cmtt/m/n/10.95 You can give a number of options to adjust the aspect of y
941our plot, see [][]here[][].
942 []
943
944<output_77_0.png, id=199, 426.393pt x 281.1303pt>
945File: output_77_0.png Graphic file (type png)
946<use output_77_0.png>
947Package pdftex.def Info: output_77_0.png used on input line 1311.
948(pdftex.def) Requested size: 426.39195pt x 281.12961pt.
949[12 <./output_75_0.png>]
950Underfull \hbox (badness 10000) in paragraph at lines 1313--1314
951
952 []
953
954
955Underfull \hbox (badness 10000) in paragraph at lines 1316--1321
956[]\T1/cmtt/m/n/10.95 Some of the options are not described precisely in Sage's
957documentation, but you
958 []
959
960
961Underfull \hbox (badness 10000) in paragraph at lines 1316--1321
962\T1/cmtt/m/n/10.95 can find them on [][]matplotlib's documentation[][]. You can
963 find many examples online for
964 []
965
966
967Underfull \hbox (badness 10000) in paragraph at lines 1322--1324
968[]\T1/cmtt/m/n/10.95 If you need to plot more than one object at the time, you
969can sum two plots and
970 []
971
972<output_80_0.png, id=206, 424.9476pt x 281.1303pt>
973File: output_80_0.png Graphic file (type png)
974<use output_80_0.png>
975Package pdftex.def Info: output_80_0.png used on input line 1336.
976(pdftex.def) Requested size: 424.94655pt x 281.12961pt.
977[13 <./output_77_0.png>]
978Underfull \hbox (badness 10000) in paragraph at lines 1338--1339
979
980 []
981
982
983Underfull \hbox (badness 10000) in paragraph at lines 1340--1347
984[]\T1/cmtt/m/n/10.95 Finally, there are other types of plots that you can use,
985like [][]scatter plots[][] and
986 []
987
988<output_82_0.png, id=216, 421.3341pt x 281.853pt>
989File: output_82_0.png Graphic file (type png)
990<use output_82_0.png>
991Package pdftex.def Info: output_82_0.png used on input line 1364.
992(pdftex.def) Requested size: 421.33307pt x 281.85231pt.
993[14 <./output_80_0.png>]
994Underfull \hbox (badness 10000) in paragraph at lines 1366--1367
995
996 []
997
998
999Underfull \hbox (badness 10000) in paragraph at lines 1376--1380
1000[]\T1/cmtt/m/n/10.95 When you need to work with a discrete set of data, like me
1001asurements of real-world
1002 []
1003
1004
1005Underfull \hbox (badness 10000) in paragraph at lines 1376--1380
1006\T1/cmtt/m/n/10.95 quantities, it can be useful to visualize a ``smoothed out''
1007 version of this data,
1008 []
1009
1010
1011Underfull \hbox (badness 10000) in paragraph at lines 1381--1385
1012[]\T1/cmtt/m/n/10.95 One way to do so is finding the lowest-degree polynomial t
1013hat passes through all
1014 []
1015
1016<output_84_0.png, id=225, 423.5022pt x 280.4076pt>
1017File: output_84_0.png Graphic file (type png)
1018<use output_84_0.png>
1019Package pdftex.def Info: output_84_0.png used on input line 1400.
1020(pdftex.def) Requested size: 423.50114pt x 280.4069pt.
1021[15 <./output_82_0.png>]
1022Underfull \hbox (badness 10000) in paragraph at lines 1402--1403
1023
1024 []
1025
1026
1027Underfull \hbox (badness 10000) in paragraph at lines 1404--1408
1028[]\T1/cmtt/m/n/10.95 One can compute the Lagrange Polynomial over any base ring
1029, and it has the
1030 []
1031
1032
1033Underfull \hbox (badness 10000) in paragraph at lines 1404--1408
1034\T1/cmtt/m/n/10.95 advantage that it is a very ``nice'' function (continuous an
1035d differentiable as much
1036 []
1037
1038<output_86_0.png, id=232, 424.9476pt x 281.853pt>
1039File: output_86_0.png Graphic file (type png)
1040<use output_86_0.png>
1041Package pdftex.def Info: output_86_0.png used on input line 1425.
1042(pdftex.def) Requested size: 424.94655pt x 281.85231pt.
1043[16 <./output_84_0.png>]
1044Underfull \hbox (badness 10000) in paragraph at lines 1427--1428
1045
1046 []
1047
1048
1049Underfull \hbox (badness 10000) in paragraph at lines 1429--1434
1050[]\T1/cmtt/m/n/10.95 This particular example is called [][]Runge's phenomenon[]
1051[]. For a better approximation
1052 []
1053
1054<output_88_0.png, id=240, 424.9476pt x 281.853pt>
1055File: output_88_0.png Graphic file (type png)
1056<use output_88_0.png>
1057Package pdftex.def Info: output_88_0.png used on input line 1443.
1058(pdftex.def) Requested size: 424.94655pt x 281.85231pt.
1059[17 <./output_86_0.png>]
1060Underfull \hbox (badness 10000) in paragraph at lines 1445--1446
1061
1062 []
1063
1064
1065Underfull \hbox (badness 10000) in paragraph at lines 1447--1450
1066[]\T1/cmtt/m/n/10.95 A detailed explanation of splines is a good topic for a co
1067urse of numerical
1068 []
1069
1070
1071Underfull \hbox (badness 10000) in paragraph at lines 1447--1450
1072\T1/cmtt/m/n/10.95 analysis. For this course it is enough that you know that th
1073ey exist and they
1074 []
1075
1076[18 <./output_88_0.png>] (./8-SageCalculus.aux)
1077Package rerunfilecheck Info: File `8-SageCalculus.out' has not changed.
1078(rerunfilecheck) Checksum: 07C494ECBA08A2F1E2EF17E2726357A6;1338.
1079 )
1080Here is how much of TeX's memory you used:
1081 21395 strings out of 479383
1082 389927 string characters out of 5875798
1083 723366 words of memory out of 5000000
1084 37972 multiletter control sequences out of 15000+600000
1085 442051 words of font info for 125 fonts, out of 8000000 for 9000
1086 1141 hyphenation exceptions out of 8191
1087 107i,19n,111p,507b,620s stack positions out of 5000i,500n,10000p,200000b,80000s
1088{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}{/usr/share/
1089texmf-dist/fonts/enc/dvips/base/8r.enc}{/usr/share/texmf-dist/fonts/enc/dvips/c
1090m-super/cm-super-t1.enc}</usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/c
1091mex10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></us
1092r/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texmf-d
1093ist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-dist/fonts/type
10941/public/mathpazo/fplmr.pfb></usr/share/texmf-dist/fonts/type1/public/mathpazo/
1095fplmri.pfb></usr/share/texmf-dist/fonts/type1/public/cm-super/sfit1095.pfb></us
1096r/share/texmf-dist/fonts/type1/public/cm-super/sftt1095.pfb></usr/share/texmf-d
1097ist/fonts/type1/public/cm-super/sftt1200.pfb></usr/share/texmf-dist/fonts/type1
1098/urw/palatino/uplb8a.pfb></usr/share/texmf-dist/fonts/type1/urw/palatino/uplr8a
1099.pfb></usr/share/texmf-dist/fonts/type1/urw/palatino/uplri8a.pfb>
1100Output written on 8-SageCalculus.pdf (18 pages, 323733 bytes).
1101PDF statistics:
1102 311 PDF objects out of 1000 (max. 8388607)
1103 262 compressed objects within 3 object streams
1104 59 named destinations out of 1000 (max. 500000)
1105 200 words of extra memory for PDF output out of 10000 (max. 10000000)
1106
diff --git a/src/Lecture6/notebook/8-SageCalculus.out b/src/Lecture6/notebook/8-SageCalculus.out
new file mode 100644
index 0000000..8608c4d
--- /dev/null
+++ b/src/Lecture6/notebook/8-SageCalculus.out
@@ -0,0 +1,19 @@
1\BOOKMARK [1][-]{section.1}{Symbolic expressions}{}% 1
2\BOOKMARK [2][-]{subsection.1.1}{Solving equations and inequalities}{section.1}% 2
3\BOOKMARK [3][-]{subsubsection.1.1.1}{The set of solutions}{subsection.1.1}% 3
4\BOOKMARK [3][-]{subsubsection.1.1.2}{Alternative method for real roots: find\137root\(\)}{subsection.1.1}% 4
5\BOOKMARK [2][-]{subsection.1.2}{Evaluating functions}{section.1}% 5
6\BOOKMARK [2][-]{subsection.1.3}{Symbolic computations}{section.1}% 6
7\BOOKMARK [3][-]{subsubsection.1.3.1}{The Symbolic Ring}{subsection.1.3}% 7
8\BOOKMARK [1][-]{section.2}{Calculus}{}% 8
9\BOOKMARK [2][-]{subsection.2.1}{Limits and series}{section.2}% 9
10\BOOKMARK [2][-]{subsection.2.2}{Derivatives}{section.2}% 10
11\BOOKMARK [2][-]{subsection.2.3}{Integrals}{section.2}% 11
12\BOOKMARK [3][-]{subsubsection.2.3.1}{Symbolic integration}{subsection.2.3}% 12
13\BOOKMARK [3][-]{subsubsection.2.3.2}{Numerical integration}{subsection.2.3}% 13
14\BOOKMARK [2][-]{subsection.2.4}{Differential equations}{section.2}% 14
15\BOOKMARK [3][-]{subsubsection.2.4.1}{A real-world example}{subsection.2.4}% 15
16\BOOKMARK [1][-]{section.3}{Basic data analysis and visualization}{}% 16
17\BOOKMARK [2][-]{subsection.3.1}{Statistics}{section.3}% 17
18\BOOKMARK [2][-]{subsection.3.2}{Plotting}{section.3}% 18
19\BOOKMARK [2][-]{subsection.3.3}{Interpolation}{section.3}% 19
diff --git a/src/Lecture6/notebook/8-SageCalculus.pdf b/src/Lecture6/notebook/8-SageCalculus.pdf
new file mode 100644
index 0000000..5b533b6
--- /dev/null
+++ b/src/Lecture6/notebook/8-SageCalculus.pdf
Binary files differ
diff --git a/src/Lecture6/notebook/8-SageCalculus.tex b/src/Lecture6/notebook/8-SageCalculus.tex
new file mode 100644
index 0000000..c1defa2
--- /dev/null
+++ b/src/Lecture6/notebook/8-SageCalculus.tex
@@ -0,0 +1,1456 @@
1\documentclass[11pt]{article}
2
3 \usepackage[breakable]{tcolorbox}
4 \usepackage{parskip} % Stop auto-indenting (to mimic markdown behaviour)
5
6 \usepackage{iftex}
7 \ifPDFTeX
8 \usepackage[T1]{fontenc}
9 \usepackage{mathpazo}
10 \else
11 \usepackage{fontspec}
12 \fi
13
14 % Basic figure setup, for now with no caption control since it's done
15 % automatically by Pandoc (which extracts ![](path) syntax from Markdown).
16 \usepackage{graphicx}
17 % Maintain compatibility with old templates. Remove in nbconvert 6.0
18 \let\Oldincludegraphics\includegraphics
19 % Ensure that by default, figures have no caption (until we provide a
20 % proper Figure object with a Caption API and a way to capture that
21 % in the conversion process - todo).
22 \usepackage{caption}
23 \DeclareCaptionFormat{nocaption}{}
24 \captionsetup{format=nocaption,aboveskip=0pt,belowskip=0pt}
25
26 \usepackage[Export]{adjustbox} % Used to constrain images to a maximum size
27 \adjustboxset{max size={0.9\linewidth}{0.9\paperheight}}
28 \usepackage{float}
29 \floatplacement{figure}{H} % forces figures to be placed at the correct location
30 \usepackage{xcolor} % Allow colors to be defined
31 \usepackage{enumerate} % Needed for markdown enumerations to work
32 \usepackage{geometry} % Used to adjust the document margins
33 \usepackage{amsmath} % Equations
34 \usepackage{amssymb} % Equations
35 \usepackage{textcomp} % defines textquotesingle
36 % Hack from http://tex.stackexchange.com/a/47451/13684:
37 \AtBeginDocument{%
38 \def\PYZsq{\textquotesingle}% Upright quotes in Pygmentized code
39 }
40 \usepackage{upquote} % Upright quotes for verbatim code
41 \usepackage{eurosym} % defines \euro
42 \usepackage[mathletters]{ucs} % Extended unicode (utf-8) support
43 \usepackage{fancyvrb} % verbatim replacement that allows latex
44 \usepackage{grffile} % extends the file name processing of package graphics
45 % to support a larger range
46 \makeatletter % fix for grffile with XeLaTeX
47 \def\Gread@@xetex#1{%
48 \IfFileExists{"\Gin@base".bb}%
49 {\Gread@eps{\Gin@base.bb}}%
50 {\Gread@@xetex@aux#1}%
51 }
52 \makeatother
53
54 % The hyperref package gives us a pdf with properly built
55 % internal navigation ('pdf bookmarks' for the table of contents,
56 % internal cross-reference links, web links for URLs, etc.)
57 \usepackage{hyperref}
58 % The default LaTeX title has an obnoxious amount of whitespace. By default,
59 % titling removes some of it. It also provides customization options.
60 \usepackage{titling}
61 \usepackage{longtable} % longtable support required by pandoc >1.10
62 \usepackage{booktabs} % table support for pandoc > 1.12.2
63 \usepackage[inline]{enumitem} % IRkernel/repr support (it uses the enumerate* environment)
64 \usepackage[normalem]{ulem} % ulem is needed to support strikethroughs (\sout)
65 % normalem makes italics be italics, not underlines
66 \usepackage{mathrsfs}
67
68
69
70 % Colors for the hyperref package
71 \definecolor{urlcolor}{rgb}{0,.145,.698}
72 \definecolor{linkcolor}{rgb}{.71,0.21,0.01}
73 \definecolor{citecolor}{rgb}{.12,.54,.11}
74
75 % ANSI colors
76 \definecolor{ansi-black}{HTML}{3E424D}
77 \definecolor{ansi-black-intense}{HTML}{282C36}
78 \definecolor{ansi-red}{HTML}{E75C58}
79 \definecolor{ansi-red-intense}{HTML}{B22B31}
80 \definecolor{ansi-green}{HTML}{00A250}
81 \definecolor{ansi-green-intense}{HTML}{007427}
82 \definecolor{ansi-yellow}{HTML}{DDB62B}
83 \definecolor{ansi-yellow-intense}{HTML}{B27D12}
84 \definecolor{ansi-blue}{HTML}{208FFB}
85 \definecolor{ansi-blue-intense}{HTML}{0065CA}
86 \definecolor{ansi-magenta}{HTML}{D160C4}
87 \definecolor{ansi-magenta-intense}{HTML}{A03196}
88 \definecolor{ansi-cyan}{HTML}{60C6C8}
89 \definecolor{ansi-cyan-intense}{HTML}{258F8F}
90 \definecolor{ansi-white}{HTML}{C5C1B4}
91 \definecolor{ansi-white-intense}{HTML}{A1A6B2}
92 \definecolor{ansi-default-inverse-fg}{HTML}{FFFFFF}
93 \definecolor{ansi-default-inverse-bg}{HTML}{000000}
94
95 % commands and environments needed by pandoc snippets
96 % extracted from the output of `pandoc -s`
97 \providecommand{\tightlist}{%
98 \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
99 \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}}
100 % Add ',fontsize=\small' for more characters per line
101 \newenvironment{Shaded}{}{}
102 \newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}}
103 \newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{{#1}}}
104 \newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}}
105 \newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}}
106 \newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}}
107 \newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}}
108 \newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}}
109 \newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{{#1}}}}
110 \newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{{#1}}}
111 \newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}}
112 \newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{{#1}}}
113 \newcommand{\RegionMarkerTok}[1]{{#1}}
114 \newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}}
115 \newcommand{\NormalTok}[1]{{#1}}
116
117 % Additional commands for more recent versions of Pandoc
118 \newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{{#1}}}
119 \newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}}
120 \newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}}
121 \newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{{#1}}}
122 \newcommand{\ImportTok}[1]{{#1}}
123 \newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{{#1}}}}
124 \newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}}
125 \newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}}
126 \newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{{#1}}}
127 \newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}}
128 \newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{{#1}}}
129 \newcommand{\BuiltInTok}[1]{{#1}}
130 \newcommand{\ExtensionTok}[1]{{#1}}
131 \newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{{#1}}}
132 \newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{{#1}}}
133 \newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}}
134 \newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}}
135
136
137 % Define a nice break command that doesn't care if a line doesn't already
138 % exist.
139 \def\br{\hspace*{\fill} \\* }
140 % Math Jax compatibility definitions
141 \def\gt{>}
142 \def\lt{<}
143 \let\Oldtex\TeX
144 \let\Oldlatex\LaTeX
145 \renewcommand{\TeX}{\textrm{\Oldtex}}
146 \renewcommand{\LaTeX}{\textrm{\Oldlatex}}
147 % Document parameters
148 % Document title
149 \title{Calculus and more with SageMath}
150 \author{Sebastiano Tronto - \texttt{sebastiano.tronto@uni.lu}}
151 \date{2021-05-07}
152
153
154
155
156
157% Pygments definitions
158\makeatletter
159\def\PY@reset{\let\PY@it=\relax \let\PY@bf=\relax%
160 \let\PY@ul=\relax \let\PY@tc=\relax%
161 \let\PY@bc=\relax \let\PY@ff=\relax}
162\def\PY@tok#1{\csname PY@tok@#1\endcsname}
163\def\PY@toks#1+{\ifx\relax#1\empty\else%
164 \PY@tok{#1}\expandafter\PY@toks\fi}
165\def\PY@do#1{\PY@bc{\PY@tc{\PY@ul{%
166 \PY@it{\PY@bf{\PY@ff{#1}}}}}}}
167\def\PY#1#2{\PY@reset\PY@toks#1+\relax+\PY@do{#2}}
168
169\expandafter\def\csname PY@tok@w\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}}
170\expandafter\def\csname PY@tok@c\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
171\expandafter\def\csname PY@tok@cp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.74,0.48,0.00}{##1}}}
172\expandafter\def\csname PY@tok@k\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
173\expandafter\def\csname PY@tok@kp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
174\expandafter\def\csname PY@tok@kt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}}
175\expandafter\def\csname PY@tok@o\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
176\expandafter\def\csname PY@tok@ow\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}}
177\expandafter\def\csname PY@tok@nb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
178\expandafter\def\csname PY@tok@nf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
179\expandafter\def\csname PY@tok@nc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
180\expandafter\def\csname PY@tok@nn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
181\expandafter\def\csname PY@tok@ne\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.82,0.25,0.23}{##1}}}
182\expandafter\def\csname PY@tok@nv\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
183\expandafter\def\csname PY@tok@no\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}}
184\expandafter\def\csname PY@tok@nl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.63,0.00}{##1}}}
185\expandafter\def\csname PY@tok@ni\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}}
186\expandafter\def\csname PY@tok@na\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.49,0.56,0.16}{##1}}}
187\expandafter\def\csname PY@tok@nt\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
188\expandafter\def\csname PY@tok@nd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}}
189\expandafter\def\csname PY@tok@s\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
190\expandafter\def\csname PY@tok@sd\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
191\expandafter\def\csname PY@tok@si\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}}
192\expandafter\def\csname PY@tok@se\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.13}{##1}}}
193\expandafter\def\csname PY@tok@sr\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}}
194\expandafter\def\csname PY@tok@ss\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
195\expandafter\def\csname PY@tok@sx\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
196\expandafter\def\csname PY@tok@m\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
197\expandafter\def\csname PY@tok@gh\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}}
198\expandafter\def\csname PY@tok@gu\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}}
199\expandafter\def\csname PY@tok@gd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}}
200\expandafter\def\csname PY@tok@gi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}}
201\expandafter\def\csname PY@tok@gr\endcsname{\def\PY@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}}
202\expandafter\def\csname PY@tok@ge\endcsname{\let\PY@it=\textit}
203\expandafter\def\csname PY@tok@gs\endcsname{\let\PY@bf=\textbf}
204\expandafter\def\csname PY@tok@gp\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}}
205\expandafter\def\csname PY@tok@go\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.53,0.53}{##1}}}
206\expandafter\def\csname PY@tok@gt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}}
207\expandafter\def\csname PY@tok@err\endcsname{\def\PY@bc##1{\setlength{\fboxsep}{0pt}\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}}
208\expandafter\def\csname PY@tok@kc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
209\expandafter\def\csname PY@tok@kd\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
210\expandafter\def\csname PY@tok@kn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
211\expandafter\def\csname PY@tok@kr\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
212\expandafter\def\csname PY@tok@bp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
213\expandafter\def\csname PY@tok@fm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
214\expandafter\def\csname PY@tok@vc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
215\expandafter\def\csname PY@tok@vg\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
216\expandafter\def\csname PY@tok@vi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
217\expandafter\def\csname PY@tok@vm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
218\expandafter\def\csname PY@tok@sa\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
219\expandafter\def\csname PY@tok@sb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
220\expandafter\def\csname PY@tok@sc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
221\expandafter\def\csname PY@tok@dl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
222\expandafter\def\csname PY@tok@s2\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
223\expandafter\def\csname PY@tok@sh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
224\expandafter\def\csname PY@tok@s1\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
225\expandafter\def\csname PY@tok@mb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
226\expandafter\def\csname PY@tok@mf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
227\expandafter\def\csname PY@tok@mh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
228\expandafter\def\csname PY@tok@mi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
229\expandafter\def\csname PY@tok@il\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
230\expandafter\def\csname PY@tok@mo\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
231\expandafter\def\csname PY@tok@ch\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
232\expandafter\def\csname PY@tok@cm\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
233\expandafter\def\csname PY@tok@cpf\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
234\expandafter\def\csname PY@tok@c1\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
235\expandafter\def\csname PY@tok@cs\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
236
237\def\PYZbs{\char`\\}
238\def\PYZus{\char`\_}
239\def\PYZob{\char`\{}
240\def\PYZcb{\char`\}}
241\def\PYZca{\char`\^}
242\def\PYZam{\char`\&}
243\def\PYZlt{\char`\<}
244\def\PYZgt{\char`\>}
245\def\PYZsh{\char`\#}
246\def\PYZpc{\char`\%}
247\def\PYZdl{\char`\$}
248\def\PYZhy{\char`\-}
249\def\PYZsq{\char`\'}
250\def\PYZdq{\char`\"}
251\def\PYZti{\char`\~}
252% for compatibility with earlier versions
253\def\PYZat{@}
254\def\PYZlb{[}
255\def\PYZrb{]}
256\makeatother
257
258
259 % For linebreaks inside Verbatim environment from package fancyvrb.
260 \makeatletter
261 \newbox\Wrappedcontinuationbox
262 \newbox\Wrappedvisiblespacebox
263 \newcommand*\Wrappedvisiblespace {\textcolor{red}{\textvisiblespace}}
264 \newcommand*\Wrappedcontinuationsymbol {\textcolor{red}{\llap{\tiny$\m@th\hookrightarrow$}}}
265 \newcommand*\Wrappedcontinuationindent {3ex }
266 \newcommand*\Wrappedafterbreak {\kern\Wrappedcontinuationindent\copy\Wrappedcontinuationbox}
267 % Take advantage of the already applied Pygments mark-up to insert
268 % potential linebreaks for TeX processing.
269 % {, <, #, %, $, ' and ": go to next line.
270 % _, }, ^, &, >, - and ~: stay at end of broken line.
271 % Use of \textquotesingle for straight quote.
272 \newcommand*\Wrappedbreaksatspecials {%
273 \def\PYGZus{\discretionary{\char`\_}{\Wrappedafterbreak}{\char`\_}}%
274 \def\PYGZob{\discretionary{}{\Wrappedafterbreak\char`\{}{\char`\{}}%
275 \def\PYGZcb{\discretionary{\char`\}}{\Wrappedafterbreak}{\char`\}}}%
276 \def\PYGZca{\discretionary{\char`\^}{\Wrappedafterbreak}{\char`\^}}%
277 \def\PYGZam{\discretionary{\char`\&}{\Wrappedafterbreak}{\char`\&}}%
278 \def\PYGZlt{\discretionary{}{\Wrappedafterbreak\char`\<}{\char`\<}}%
279 \def\PYGZgt{\discretionary{\char`\>}{\Wrappedafterbreak}{\char`\>}}%
280 \def\PYGZsh{\discretionary{}{\Wrappedafterbreak\char`\#}{\char`\#}}%
281 \def\PYGZpc{\discretionary{}{\Wrappedafterbreak\char`\%}{\char`\%}}%
282 \def\PYGZdl{\discretionary{}{\Wrappedafterbreak\char`\$}{\char`\$}}%
283 \def\PYGZhy{\discretionary{\char`\-}{\Wrappedafterbreak}{\char`\-}}%
284 \def\PYGZsq{\discretionary{}{\Wrappedafterbreak\textquotesingle}{\textquotesingle}}%
285 \def\PYGZdq{\discretionary{}{\Wrappedafterbreak\char`\"}{\char`\"}}%
286 \def\PYGZti{\discretionary{\char`\~}{\Wrappedafterbreak}{\char`\~}}%
287 }
288 % Some characters . , ; ? ! / are not pygmentized.
289 % This macro makes them "active" and they will insert potential linebreaks
290 \newcommand*\Wrappedbreaksatpunct {%
291 \lccode`\~`\.\lowercase{\def~}{\discretionary{\hbox{\char`\.}}{\Wrappedafterbreak}{\hbox{\char`\.}}}%
292 \lccode`\~`\,\lowercase{\def~}{\discretionary{\hbox{\char`\,}}{\Wrappedafterbreak}{\hbox{\char`\,}}}%
293 \lccode`\~`\;\lowercase{\def~}{\discretionary{\hbox{\char`\;}}{\Wrappedafterbreak}{\hbox{\char`\;}}}%
294 \lccode`\~`\:\lowercase{\def~}{\discretionary{\hbox{\char`\:}}{\Wrappedafterbreak}{\hbox{\char`\:}}}%
295 \lccode`\~`\?\lowercase{\def~}{\discretionary{\hbox{\char`\?}}{\Wrappedafterbreak}{\hbox{\char`\?}}}%
296 \lccode`\~`\!\lowercase{\def~}{\discretionary{\hbox{\char`\!}}{\Wrappedafterbreak}{\hbox{\char`\!}}}%
297 \lccode`\~`\/\lowercase{\def~}{\discretionary{\hbox{\char`\/}}{\Wrappedafterbreak}{\hbox{\char`\/}}}%
298 \catcode`\.\active
299 \catcode`\,\active
300 \catcode`\;\active
301 \catcode`\:\active
302 \catcode`\?\active
303 \catcode`\!\active
304 \catcode`\/\active
305 \lccode`\~`\~
306 }
307 \makeatother
308
309 \let\OriginalVerbatim=\Verbatim
310 \makeatletter
311 \renewcommand{\Verbatim}[1][1]{%
312 %\parskip\z@skip
313 \sbox\Wrappedcontinuationbox {\Wrappedcontinuationsymbol}%
314 \sbox\Wrappedvisiblespacebox {\FV@SetupFont\Wrappedvisiblespace}%
315 \def\FancyVerbFormatLine ##1{\hsize\linewidth
316 \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@
317 \doublehyphendemerits\z@\finalhyphendemerits\z@
318 \strut ##1\strut}%
319 }%
320 % If the linebreak is at a space, the latter will be displayed as visible
321 % space at end of first line, and a continuation symbol starts next line.
322 % Stretch/shrink are however usually zero for typewriter font.
323 \def\FV@Space {%
324 \nobreak\hskip\z@ plus\fontdimen3\font minus\fontdimen4\font
325 \discretionary{\copy\Wrappedvisiblespacebox}{\Wrappedafterbreak}
326 {\kern\fontdimen2\font}%
327 }%
328
329 % Allow breaks at special characters using \PYG... macros.
330 \Wrappedbreaksatspecials
331 % Breaks at punctuation characters . , ; ? ! and / need catcode=\active
332 \OriginalVerbatim[#1,codes*=\Wrappedbreaksatpunct]%
333 }
334 \makeatother
335
336 % Exact colors from NB
337 \definecolor{incolor}{HTML}{303F9F}
338 \definecolor{outcolor}{HTML}{D84315}
339 \definecolor{cellborder}{HTML}{CFCFCF}
340 \definecolor{cellbackground}{HTML}{F7F7F7}
341
342 % prompt
343 \makeatletter
344 \newcommand{\boxspacing}{\kern\kvtcb@left@rule\kern\kvtcb@boxsep}
345 \makeatother
346 \newcommand{\prompt}[4]{
347 \ttfamily\llap{{\color{#2}[#3]:\hspace{3pt}#4}}\vspace{-\baselineskip}
348 }
349
350
351
352 % Prevent overflowing lines due to hard-to-break entities
353 \sloppy
354 % Setup hyperref package
355 \hypersetup{
356 breaklinks=true, % so long urls are correctly broken across lines
357 colorlinks=true,
358 urlcolor=urlcolor,
359 linkcolor=linkcolor,
360 citecolor=citecolor,
361 }
362 % Slightly bigger margins than the latex defaults
363
364 \geometry{verbose,tmargin=1in,bmargin=1in,lmargin=1in,rmargin=1in}
365
366
367
368\begin{document}
369
370 \maketitle
371
372
373
374
375 \hypertarget{symbolic-expressions}{%
376\section{Symbolic expressions}\label{symbolic-expressions}}
377
378\textbf{Reference:}
379{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html}{1}{]}
380
381Last time we saw the basics of symbolic expressions: * How to define and
382manipulate symbolic expressions * How to introduce new variables (in the
383Mathematical sense) with \texttt{var()} * How to solve equations and
384inequalities * Some of the Mathematical constants that are included in
385Sage, and how to approximate them using \texttt{n()}
386
387Here are some examples to remind you of these basic things:
388
389 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
390\prompt{In}{incolor}{2}{\boxspacing}
391\begin{Verbatim}[commandchars=\\\{\}]
392\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{y}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{z}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} \PY{c+c1}{\PYZsh{} Define new variables (x is already defined by Sage)}
393\PY{n}{f} \PY{o}{=} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{n}{pi}
394\PY{n}{g} \PY{o}{=} \PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{n}{y} \PY{o}{\PYZhy{}} \PY{l+m+mi}{2} \PY{o}{\PYZgt{}} \PY{l+m+mi}{0}
395\PY{n+nb}{print}\PY{p}{(} \PY{n}{solve}\PY{p}{(}\PY{n}{f}\PY{o}{==}\PY{l+m+mi}{0}\PY{p}{,} \PY{n}{x}\PY{p}{)} \PY{p}{)}
396\PY{n+nb}{print}\PY{p}{(} \PY{n}{solve}\PY{p}{(}\PY{n}{z}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{\PYZhy{}} \PY{n}{f}\PY{p}{,} \PY{n}{z}\PY{p}{)} \PY{p}{)}
397\PY{n+nb}{print}\PY{p}{(} \PY{n}{solve}\PY{p}{(}\PY{n}{g}\PY{p}{,} \PY{n}{y}\PY{p}{)} \PY{p}{)}
398\PY{n+nb}{print}\PY{p}{(} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{pi} \PY{o}{+} \PY{n}{e}\PY{p}{,} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{is approximately}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{n}\PY{p}{(}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{pi} \PY{o}{+} \PY{n}{e}\PY{p}{)} \PY{p}{)}
399\end{Verbatim}
400\end{tcolorbox}
401
402 \begin{Verbatim}[commandchars=\\\{\}]
403[
404x == -sqrt(-pi),
405x == sqrt(-pi)
406]
407[
408z == -sqrt(pi + x\^{}2),
409z == sqrt(pi + x\^{}2)
410]
411[[y < -2], [y > 1]]
4122*pi + e is approximately 9.00146713563863
413 \end{Verbatim}
414
415 Now we will see some more details about solving equations and
416manipulating their solutions.
417
418 \hypertarget{solving-equations-and-inequalities}{%
419\subsection{Solving equations and
420inequalities}\label{solving-equations-and-inequalities}}
421
422\textbf{Reference}
423{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html}{1}{]}
424for the details of \texttt{solve()} and \texttt{find\_root()},
425{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/relation.html\#solving}{2}{]}
426for examples.
427
428Other than equations and inequalities, we can also solve systems: it is
429enough to give Sage a list of expressions and a list of variables with
430respect to which we want to solve. For example the system
431
432\begin{align*}
433 \begin{cases}
434 x + y = 2 \\
435 2x - y = 6
436 \end{cases}
437\end{align*}
438
439Can be solved as
440
441 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
442\prompt{In}{incolor}{40}{\boxspacing}
443\begin{Verbatim}[commandchars=\\\{\}]
444\PY{n}{solve}\PY{p}{(}\PY{p}{[}\PY{n}{x}\PY{o}{+}\PY{n}{y} \PY{o}{==} \PY{l+m+mi}{2}\PY{p}{,} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{x} \PY{o}{\PYZhy{}} \PY{n}{y} \PY{o}{==} \PY{l+m+mi}{6}\PY{p}{]}\PY{p}{,} \PY{p}{[}\PY{n}{x}\PY{p}{,}\PY{n}{y}\PY{p}{]}\PY{p}{)}
445\end{Verbatim}
446\end{tcolorbox}
447
448 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
449\prompt{Out}{outcolor}{40}{\boxspacing}
450\begin{Verbatim}[commandchars=\\\{\}]
451[[x == (8/3), y == (-2/3)]]
452\end{Verbatim}
453\end{tcolorbox}
454
455 \textbf{Exercise.} Find the intersection of the circle of radius \(2\)
456centered in the origin and the parabula of equation \(y=x^2-2x^2+1\).
457
458 \hypertarget{the-set-of-solutions}{%
459\subsubsection{The set of solutions}\label{the-set-of-solutions}}
460
461One would expect the result of \texttt{solve()} to be a list of
462solutions, but it is actually a list of expressions (technically it is
463not a list but a different type of Python collection, but this is not so
464important)
465
466 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
467\prompt{In}{incolor}{37}{\boxspacing}
468\begin{Verbatim}[commandchars=\\\{\}]
469\PY{n}{solutions} \PY{o}{=} \PY{n}{solve}\PY{p}{(}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{o}{\PYZhy{}}\PY{l+m+mi}{9} \PY{o}{==} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{x}\PY{p}{)}
470\PY{n}{solutions}\PY{p}{[}\PY{l+m+mi}{0}\PY{p}{]} \PY{c+c1}{\PYZsh{} This is the expression \PYZsq{}x == \PYZhy{}3\PYZsq{}}
471\end{Verbatim}
472\end{tcolorbox}
473
474 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
475\prompt{Out}{outcolor}{37}{\boxspacing}
476\begin{Verbatim}[commandchars=\\\{\}]
477x == -3
478\end{Verbatim}
479\end{tcolorbox}
480
481 To read the actual solution without the \texttt{x\ ==} part you can use
482the \texttt{rhs()} or \texttt{lhs()} functions, which can be applied to
483any expression containing a relation operator (like \texttt{==},
484\texttt{\textless{}}, \texttt{\textgreater{}=}\ldots) and return the
485\emph{right hand side} and \emph{left hand side} of the expression,
486respectively
487
488 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
489\prompt{In}{incolor}{41}{\boxspacing}
490\begin{Verbatim}[commandchars=\\\{\}]
491\PY{n}{f} \PY{o}{=} \PY{n}{x} \PY{o}{==} \PY{l+m+mi}{2}
492\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{rhs:}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{f}\PY{o}{.}\PY{n}{rhs}\PY{p}{(}\PY{p}{)}\PY{p}{)}
493\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{lhs:}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{f}\PY{o}{.}\PY{n}{lhs}\PY{p}{(}\PY{p}{)}\PY{p}{)}
494\end{Verbatim}
495\end{tcolorbox}
496
497 \begin{Verbatim}[commandchars=\\\{\}]
498rhs: 2
499lhs: x
500 \end{Verbatim}
501
502 When you solve an inequality or a system, the set of solutions can be
503more complicated to describe. In this case the result is a list
504containing lists of expressions that have to be \texttt{True} at the
505same time. It is easier to explain with an example:
506
507 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
508\prompt{In}{incolor}{38}{\boxspacing}
509\begin{Verbatim}[commandchars=\\\{\}]
510\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Simple inequality:}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{solve}\PY{p}{(}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{o}{\PYZhy{}}\PY{l+m+mi}{9} \PY{o}{\PYZgt{}} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{x}\PY{p}{)}\PY{p}{)}
511\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{System of inequalities:}\PY{l+s+se}{\PYZbs{}n}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{solve}\PY{p}{(}\PY{p}{[}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{o}{\PYZhy{}}\PY{l+m+mi}{9} \PY{o}{\PYZgt{}} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{x} \PY{o}{\PYZlt{}} \PY{l+m+mi}{6}\PY{p}{]}\PY{p}{,} \PY{n}{x}\PY{p}{)}\PY{p}{)}
512\end{Verbatim}
513\end{tcolorbox}
514
515 \begin{Verbatim}[commandchars=\\\{\}]
516Simple inequality: [[x < -3], [x > 3]]
517System of inequalities:
518 [
519[3 < x, x < 6],
520[x < -3]
521]
522 \end{Verbatim}
523
524 In the last example (system of inequalities), Sage is telling us that
525the system \begin{align*}
526 \begin{cases}
527 x^2-9 > 9 \\
528 x < 6
529 \end{cases}
530\end{align*} has two solutions: * \(x\) is between \(3\) and \(6\); *
531\(x\) is less than \(-3\).
532
533Since in Sage (and in Python) expressions can have at most on relational
534operator like \texttt{\textless{}}, the first solution requires two
535expressions to be described. Hence the ``list of lists''.
536
537 \textbf{Exercise.} In the first exercise you were asked to solve a
538system of equations, but some of its solutions were complex numbers.
539Select only the real solutions and print them as pairs \((x,y)\).
540
541 When solving a system of equations (not inequalities), you can use the
542option \texttt{solution\_dict=True} to have the solutions arranged as a
543\emph{dictionary}, which is a type of Python collection that we did not
544treat in this course
545
546 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
547\prompt{In}{incolor}{44}{\boxspacing}
548\begin{Verbatim}[commandchars=\\\{\}]
549\PY{n}{solve}\PY{p}{(}\PY{p}{[}\PY{n}{x}\PY{o}{+}\PY{n}{y} \PY{o}{==} \PY{l+m+mi}{2}\PY{p}{,} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{x} \PY{o}{\PYZhy{}} \PY{n}{y} \PY{o}{==} \PY{l+m+mi}{6}\PY{p}{]}\PY{p}{,} \PY{p}{[}\PY{n}{x}\PY{p}{,}\PY{n}{y}\PY{p}{]}\PY{p}{,} \PY{n}{solution\PYZus{}dict}\PY{o}{=}\PY{k+kc}{True}\PY{p}{)}
550\end{Verbatim}
551\end{tcolorbox}
552
553 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
554\prompt{Out}{outcolor}{44}{\boxspacing}
555\begin{Verbatim}[commandchars=\\\{\}]
556[\{x: 8/3, y: -2/3\}]
557\end{Verbatim}
558\end{tcolorbox}
559
560 \hypertarget{alternative-method-for-real-roots-find_root}{%
561\subsubsection{\texorpdfstring{Alternative method for real roots:
562\texttt{find\_root()}}{Alternative method for real roots: find\_root()}}\label{alternative-method-for-real-roots-find_root}}
563
564The \texttt{solve()} method is very useful when solving \emph{symbolic}
565equations, for example when you have two variables and you want to solve
566for one of them in terms of the other. However, it does not always find
567explicit solutions.
568
569When you want to find an explicit, even if approximate, solution, it can
570be better to use \texttt{find\_root()}. This function works
571\emph{numerically}, which means that it finds an approximation of the
572root. It only works for real solutions and you need to specify an
573interval where you want the root to be searched:
574
575 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
576\prompt{In}{incolor}{52}{\boxspacing}
577\begin{Verbatim}[commandchars=\\\{\}]
578\PY{n}{f} \PY{o}{=} \PY{n}{e}\PY{o}{\PYZca{}}\PY{n}{x} \PY{o}{+} \PY{n}{x} \PY{o}{\PYZhy{}} \PY{l+m+mi}{10}
579\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Using solve():}\PY{l+s+se}{\PYZbs{}n}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{solve}\PY{p}{(}\PY{n}{f}\PY{p}{,} \PY{n}{x}\PY{p}{)}\PY{p}{)}
580\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Using find\PYZus{}root():}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{f}\PY{o}{.}\PY{n}{find\PYZus{}root}\PY{p}{(}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mi}{100}\PY{p}{)}\PY{p}{)}
581\end{Verbatim}
582\end{tcolorbox}
583
584 \begin{Verbatim}[commandchars=\\\{\}]
585Using solve():
586 [
587x == -e\^{}x + 10
588]
589Using find\_root(): 2.070579904980303
590 \end{Verbatim}
591
592 \hypertarget{evaluating-functions}{%
593\subsection{Evaluating functions}\label{evaluating-functions}}
594
595If an expression contains only one variable you can evaluate it easily,
596even if it is not a function.
597
598 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
599\prompt{In}{incolor}{21}{\boxspacing}
600\begin{Verbatim}[commandchars=\\\{\}]
601\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{y}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
602\PY{n}{f} \PY{o}{=} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{o}{\PYZhy{}}\PY{l+m+mi}{3}
603\PY{n}{g} \PY{o}{=} \PY{n}{x} \PY{o}{\PYZgt{}} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}
604
605\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{)}
606\PY{n+nb}{print}\PY{p}{(}\PY{n}{g}\PY{p}{(}\PY{l+m+mi}{3}\PY{o}{+}\PY{n}{y}\PY{p}{)}\PY{p}{)}
607\end{Verbatim}
608\end{tcolorbox}
609
610 \begin{Verbatim}[commandchars=\\\{\}]
6111
612y + 3 > (y + 3)\^{}2
613 \end{Verbatim}
614
615 If an expression contains more than one variable, you can specify a
616value for each of them and they will be substituted in alphabetic order.
617You can also specify a value only for some of the variables.
618
619 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
620\prompt{In}{incolor}{38}{\boxspacing}
621\begin{Verbatim}[commandchars=\\\{\}]
622\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{y}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{z}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
623
624\PY{n}{f} \PY{o}{=} \PY{n}{y}\PY{o}{*}\PY{n}{z}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{\PYZhy{}} \PY{n}{y} \PY{o}{==} \PY{n}{z}
625\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{)}\PY{p}{)}
626\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{p}{(}\PY{n}{z}\PY{o}{=}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{)}
627\end{Verbatim}
628\end{tcolorbox}
629
630 \begin{Verbatim}[commandchars=\\\{\}]
631-2 == 0
6323*y == 2
633 \end{Verbatim}
634
635 \hypertarget{symbolic-computations}{%
636\subsection{Symbolic computations}\label{symbolic-computations}}
637
638Sage can understand and simplify symbolic expressions such as sums
639(finite or infinite) and products. In the following cell, we compute the
640following sums using the
641\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.sum}{\texttt{sum()}}
642function:
643
644\begin{align*}
645 \begin{array}{llcc}
646 (1) & \sum_{k=0}^nk &=&\frac{n^2+n}{2}\\
647 (2) & \sum_{k=0}^nk^4 &=&\frac{6n^5+15n^4+10n^3-n}{30}\\
648 (3) & \sum_{k=0}^n\binom nk &=& 2^n\\
649 (4) & \sum_{k=0}^\infty \frac1{k^2} &=& \frac{\pi^2}{6}
650 \end{array}
651\end{align*}
652
653 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
654\prompt{In}{incolor}{22}{\boxspacing}
655\begin{Verbatim}[commandchars=\\\{\}]
656\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{k}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{n}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} \PY{c+c1}{\PYZsh{} Remember to declare all variables}
657
658\PY{n}{s} \PY{o}{=} \PY{p}{[}\PY{p}{]}
659\PY{n}{s}\PY{o}{.}\PY{n}{append}\PY{p}{(} \PY{n+nb}{sum}\PY{p}{(}\PY{n}{k}\PY{p}{,} \PY{n}{k}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{n}\PY{p}{)} \PY{p}{)}
660\PY{n}{s}\PY{o}{.}\PY{n}{append}\PY{p}{(} \PY{n+nb}{sum}\PY{p}{(}\PY{n}{k}\PY{o}{\PYZca{}}\PY{l+m+mi}{4}\PY{p}{,} \PY{n}{k}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{n}\PY{p}{)} \PY{p}{)}
661\PY{n}{s}\PY{o}{.}\PY{n}{append}\PY{p}{(} \PY{n+nb}{sum}\PY{p}{(}\PY{n}{binomial}\PY{p}{(}\PY{n}{n}\PY{p}{,}\PY{n}{k}\PY{p}{)}\PY{p}{,} \PY{n}{k}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{n}\PY{p}{)} \PY{p}{)}
662\PY{n}{s}\PY{o}{.}\PY{n}{append}\PY{p}{(} \PY{n+nb}{sum}\PY{p}{(}\PY{l+m+mi}{1}\PY{o}{/}\PY{n}{k}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{p}{,} \PY{n}{k}\PY{p}{,} \PY{l+m+mi}{1}\PY{p}{,} \PY{n}{infinity}\PY{p}{)} \PY{p}{)}
663
664\PY{k}{for} \PY{n}{i} \PY{o+ow}{in} \PY{n+nb}{range}\PY{p}{(}\PY{n+nb}{len}\PY{p}{(}\PY{n}{s}\PY{p}{)}\PY{p}{)}\PY{p}{:}
665 \PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{(}\PY{l+s+si}{\PYZob{}\PYZcb{}}\PY{l+s+s2}{) }\PY{l+s+si}{\PYZob{}\PYZcb{}}\PY{l+s+s2}{\PYZdq{}}\PY{o}{.}\PY{n}{format}\PY{p}{(}\PY{n}{i}\PY{o}{+}\PY{l+m+mi}{1}\PY{p}{,} \PY{n}{s}\PY{p}{[}\PY{n}{i}\PY{p}{]}\PY{p}{)}\PY{p}{)}
666\end{Verbatim}
667\end{tcolorbox}
668
669 \begin{Verbatim}[commandchars=\\\{\}]
670(1) 1/2*n\^{}2 + 1/2*n
671(2) 1/5*n\^{}5 + 1/2*n\^{}4 + 1/3*n\^{}3 - 1/30*n
672(3) 2\^{}n
673(4) 1/6*pi\^{}2
674 \end{Verbatim}
675
676 An alternative notation is \texttt{expression.sum(k,\ a,\ b)}. There is
677an analogous
678\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.prod}{\texttt{prod()}}
679for products.
680
681 Sometimes Sage tries to keep an expression in its original form without
682expanding out sums and products. To change this behavior you can use the
683\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.expand}{\texttt{expand()}}
684function:
685
686 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
687\prompt{In}{incolor}{30}{\boxspacing}
688\begin{Verbatim}[commandchars=\\\{\}]
689\PY{n}{f} \PY{o}{=} \PY{p}{(}\PY{n}{x}\PY{o}{+}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{\PYZhy{}} \PY{p}{(}\PY{n}{x}\PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}
690\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{p}{)}
691\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{o}{.}\PY{n}{expand}\PY{p}{(}\PY{p}{)}\PY{p}{)}
692\end{Verbatim}
693\end{tcolorbox}
694
695 \begin{Verbatim}[commandchars=\\\{\}]
696(x + 1)\^{}2 - (x - 1)\^{}2
6974*x
698 \end{Verbatim}
699
700 \hypertarget{the-symbolic-ring}{%
701\subsubsection{The Symbolic Ring}\label{the-symbolic-ring}}
702
703\textbf{Reference:}
704{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html}{3}{]}
705
706The symbolic expressions that we have seen so far live in a ring called
707\emph{symbolic ring} and denoted by \texttt{SR} in Sage. This ring works
708like the ring \texttt{ZZ} of integers or \texttt{RR} of reals numbers.
709In particular, you can define matrices and other objects using it as a
710``basis''.
711
712 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
713\prompt{In}{incolor}{45}{\boxspacing}
714\begin{Verbatim}[commandchars=\\\{\}]
715\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{a}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{b}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{c}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{d}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
716
717\PY{n}{M} \PY{o}{=} \PY{n}{matrix}\PY{p}{(}\PY{p}{[}\PY{p}{[}\PY{n}{a}\PY{p}{,}\PY{n}{b}\PY{p}{]}\PY{p}{,} \PY{p}{[}\PY{n}{c}\PY{p}{,}\PY{n}{d}\PY{p}{]}\PY{p}{]}\PY{p}{)}
718\PY{n+nb}{print}\PY{p}{(}\PY{n}{M}\PY{o}{.}\PY{n}{determinant}\PY{p}{(}\PY{p}{)}\PY{p}{)}
719
720\PY{n}{polring}\PY{o}{.}\PY{o}{\PYZlt{}}\PY{n}{x}\PY{o}{\PYZgt{}} \PY{o}{=} \PY{n}{SR}\PY{p}{[}\PY{p}{]}
721\PY{n}{f} \PY{o}{=} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{a}\PY{o}{*}\PY{n}{x} \PY{o}{+} \PY{n}{a}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}
722\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{o}{.}\PY{n}{roots}\PY{p}{(}\PY{p}{)}\PY{p}{)}
723\end{Verbatim}
724\end{tcolorbox}
725
726 \begin{Verbatim}[commandchars=\\\{\}]
727-b*c + a*d
728[(-a, 2)]
729 \end{Verbatim}
730
731 \textbf{Exercise.} Compute the eigenvalues of the matrix \begin{align*}
732\begin{pmatrix}
733\cos \alpha & \sin \alpha\\
734-\sin\alpha & \cos \alpha
735\end{pmatrix}
736\end{align*}
737
738 \hypertarget{calculus}{%
739\section{Calculus}\label{calculus}}
740
741\textbf{Reference:}
742{[}\href{https://doc.sagemath.org/html/en/reference/calculus/index.html}{4}{]}
743for an overview, but most functions are described in
744{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html}{1}{]}
745
746 \hypertarget{limits-and-series}{%
747\subsection{Limits and series}\label{limits-and-series}}
748
749\textbf{References:}
750{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/calculus.html\#sage.calculus.calculus.limit}{5}{]}
751for limits,
752{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.series}{6}{]}
753for series
754
755You can compute limits
756
757 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
758\prompt{In}{incolor}{54}{\boxspacing}
759\begin{Verbatim}[commandchars=\\\{\}]
760\PY{n}{f} \PY{o}{=} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{o}{/}\PY{n}{x}
761\PY{c+c1}{\PYZsh{} print(f(0)) \PYZsh{} This one gives an error}
762\PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{limit}\PY{p}{(}\PY{n}{x}\PY{o}{=}\PY{l+m+mi}{0}\PY{p}{)} \PY{p}{)}
763
764\PY{n+nb}{print}\PY{p}{(} \PY{p}{(}\PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{p}{)}\PY{p}{)}\PY{o}{.}\PY{n}{limit}\PY{p}{(}\PY{n}{x}\PY{o}{=}\PY{n}{infinity}\PY{p}{)} \PY{p}{)}
765\end{Verbatim}
766\end{tcolorbox}
767
768 \begin{Verbatim}[commandchars=\\\{\}]
7691
7700
771 \end{Verbatim}
772
773 \textbf{Exercise.} Compute the constant \(e\) using a limit.
774
775 You can also specify a direction for the limit. If you don't, Sage
776assumes that you want to take a two-sided limit.
777
778 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
779\prompt{In}{incolor}{55}{\boxspacing}
780\begin{Verbatim}[commandchars=\\\{\}]
781\PY{n}{f} \PY{o}{=} \PY{n+nb}{abs}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{o}{/}\PY{n}{x} \PY{c+c1}{\PYZsh{} 1 if x\PYZgt{}0, \PYZhy{}1 if x\PYZlt{}0}
782\PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{limit}\PY{p}{(}\PY{n}{x}\PY{o}{=}\PY{l+m+mi}{0}\PY{p}{)} \PY{p}{)} \PY{c+c1}{\PYZsh{} undefined}
783\PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{limit}\PY{p}{(}\PY{n}{x}\PY{o}{=}\PY{l+m+mi}{0}\PY{p}{,} \PY{n+nb}{dir}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{+}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)} \PY{p}{)}
784\PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{limit}\PY{p}{(}\PY{n}{x}\PY{o}{=}\PY{l+m+mi}{0}\PY{p}{,} \PY{n+nb}{dir}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{\PYZhy{}}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)} \PY{p}{)}
785\end{Verbatim}
786\end{tcolorbox}
787
788 \begin{Verbatim}[commandchars=\\\{\}]
789und
7901
791-1
792 \end{Verbatim}
793
794 There is also the alternative notation \texttt{limit(f,\ x,\ dir)} which
795does the same as \texttt{f.limit(x,\ dir)}.
796
797 You can also compute series expansions up to any order. \textbf{Watch
798out:} the notation uses \texttt{==} instead of \texttt{=} as
799\texttt{limit()} does.
800
801 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
802\prompt{In}{incolor}{56}{\boxspacing}
803\begin{Verbatim}[commandchars=\\\{\}]
804\PY{n}{f} \PY{o}{=} \PY{n}{e}\PY{o}{\PYZca{}}\PY{n}{x}
805\PY{n}{g} \PY{o}{=} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)} \PY{o}{\PYZhy{}} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{cos}\PY{p}{(}\PY{n}{x}\PY{p}{)}
806\PY{n}{h} \PY{o}{=} \PY{n}{log}\PY{p}{(}\PY{n}{x}\PY{p}{)}
807
808\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{o}{.}\PY{n}{series}\PY{p}{(}\PY{n}{x}\PY{o}{==}\PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)}
809\PY{n+nb}{print}\PY{p}{(}\PY{n}{g}\PY{o}{.}\PY{n}{series}\PY{p}{(}\PY{n}{x}\PY{o}{==}\PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{7}\PY{p}{)}\PY{p}{)}
810\PY{n+nb}{print}\PY{p}{(}\PY{n}{h}\PY{o}{.}\PY{n}{series}\PY{p}{(}\PY{n}{x}\PY{o}{==}\PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)}
811\end{Verbatim}
812\end{tcolorbox}
813
814 \begin{Verbatim}[commandchars=\\\{\}]
8151 + 1*x + 1/2*x\^{}2 + Order(x\^{}3)
816(-2) + 1*x + 1*x\^{}2 + (-1/6)*x\^{}3 + (-1/12)*x\^{}4 + 1/120*x\^{}5 + 1/360*x\^{}6 +
817Order(x\^{}7)
8181*(x - 1) + (-1/2)*(x - 1)\^{}2 + Order((x - 1)\^{}3)
819 \end{Verbatim}
820
821 \hypertarget{derivatives}{%
822\subsection{Derivatives}\label{derivatives}}
823
824\textbf{References:}
825{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.derivative}{7}{]}
826and
827{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functional.html\#sage.calculus.functional.derivative}{8}{]}
828for derivatives,
829{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functions.html\#sage.calculus.functions.jacobian}{9}{]}
830for the Jacobian matrix and
831{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.hessian}{10}{]}
832for the Hessian.
833
834 When computing derivatives, you need to specify with respect to which
835variables you want to derive, except in case there is only one.
836
837 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
838\prompt{In}{incolor}{57}{\boxspacing}
839\begin{Verbatim}[commandchars=\\\{\}]
840\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{y}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
841\PY{n+nb}{print}\PY{p}{(} \PY{p}{(}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{o}{+}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{4}\PY{p}{)}\PY{o}{.}\PY{n}{derivative}\PY{p}{(}\PY{n}{y}\PY{p}{)} \PY{p}{)} \PY{c+c1}{\PYZsh{} Alternative: derivative(f, y)}
842\PY{n+nb}{print}\PY{p}{(} \PY{p}{(}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{3}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{o}{+}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{.}\PY{n}{derivative}\PY{p}{(}\PY{p}{)} \PY{p}{)}
843\end{Verbatim}
844\end{tcolorbox}
845
846 \begin{Verbatim}[commandchars=\\\{\}]
8478*y\^{}3
8486*x\^{}2 - 1
849 \end{Verbatim}
850
851 You can also compute higher order derivatives:
852
853 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
854\prompt{In}{incolor}{58}{\boxspacing}
855\begin{Verbatim}[commandchars=\\\{\}]
856\PY{n+nb}{print}\PY{p}{(} \PY{p}{(}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{3}\PY{p}{)}\PY{o}{.}\PY{n}{derivative}\PY{p}{(}\PY{n}{x}\PY{p}{,} \PY{n}{x}\PY{p}{)} \PY{p}{)} \PY{c+c1}{\PYZsh{} Same as (x\PYZca{}3).derivative(x, 2)}
857
858\PY{n}{f} \PY{o}{=} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{7}\PY{o}{*}\PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{4}\PY{o}{*}\PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{\PYZhy{}} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{3} \PY{o}{+} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{5} \PY{o}{+} \PY{n}{y} \PY{o}{+} \PY{l+m+mi}{2}
859\PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{derivative}\PY{p}{(}\PY{n}{x}\PY{p}{,} \PY{n}{x}\PY{p}{,} \PY{n}{y}\PY{p}{)} \PY{p}{)} \PY{c+c1}{\PYZsh{} Twice in x, once in y}
860\PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{derivative}\PY{p}{(}\PY{n}{x}\PY{p}{,} \PY{l+m+mi}{4}\PY{p}{,} \PY{n}{y}\PY{p}{,} \PY{l+m+mi}{2}\PY{p}{)} \PY{p}{)} \PY{c+c1}{\PYZsh{} 4 times in x, twice in y}
861\end{Verbatim}
862\end{tcolorbox}
863
864 \begin{Verbatim}[commandchars=\\\{\}]
8656*x
86684*x\^{}5*y + 10*y\^{}4 + 24*x\^{}2*y
8671680*x\^{}3 + 48
868 \end{Verbatim}
869
870 Jacobian and Hessian matrices are also easy to compute:
871
872 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
873\prompt{In}{incolor}{59}{\boxspacing}
874\begin{Verbatim}[commandchars=\\\{\}]
875\PY{n}{f} \PY{o}{=} \PY{p}{(}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{x}\PY{o}{*}\PY{n}{y}\PY{p}{,} \PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{3}\PY{p}{,} \PY{n}{x}\PY{o}{+}\PY{n}{y}\PY{o}{+}\PY{n}{x}\PY{o}{*}\PY{n}{y}\PY{p}{)}
876\PY{n+nb}{print}\PY{p}{(} \PY{n}{jacobian}\PY{p}{(}\PY{n}{f}\PY{p}{,} \PY{p}{[}\PY{n}{x}\PY{p}{,}\PY{n}{y}\PY{p}{]}\PY{p}{)}\PY{p}{,} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+se}{\PYZbs{}n}\PY{l+s+s2}{\PYZdq{}} \PY{p}{)}
877
878\PY{n}{g} \PY{o}{=} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{n}{x}\PY{o}{*}\PY{n}{y} \PY{o}{+} \PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{3} \PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{x}\PY{o}{*}\PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{\PYZhy{}}\PY{l+m+mi}{3}
879\PY{n+nb}{print}\PY{p}{(} \PY{n}{g}\PY{o}{.}\PY{n}{hessian}\PY{p}{(}\PY{p}{)} \PY{p}{)}
880\end{Verbatim}
881\end{tcolorbox}
882
883 \begin{Verbatim}[commandchars=\\\{\}]
884[-2*x + 2*y 2*x]
885[ 0 3*y\^{}2]
886[ y + 1 x + 1]
887
888[ 2 -4*y + 1]
889[ -4*y + 1 -4*x + 6*y]
890 \end{Verbatim}
891
892 \emph{Note:} the notation \texttt{f.jacobian({[}x,y{]})} is also valid,
893but only if you specify that \texttt{f} is vector by declaring it as
894\texttt{f\ =\ vector({[}...{]})}.
895
896 \hypertarget{integrals}{%
897\subsection{Integrals}\label{integrals}}
898
899\textbf{References:}
900{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/integration/integral.html}{11}{]}
901for symbolic integration and
902{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html}{12}{]}
903for numerical methods.
904
905You should remember from high school or from your first
906calculus/analysis course that derivatives are easy, but integrals are
907hard. When using a computer software to solve your integrals, you have
908two choices:
909
910\begin{enumerate}
911\def\labelenumi{\arabic{enumi}.}
912\tightlist
913\item
914 You can try to compute a primitive function exactly, and then (if you
915 are computing a definite integral) substitute the endpoints of your
916 integration interval to get the result. We can call this
917 \emph{symbolic integration}.
918\item
919 You can get an \emph{approximated} result with a \emph{numerical
920 method}. This method always gives some kind of result, but it cannot
921 be used to compute indefinite integrals.
922\end{enumerate}
923
924Sage can do both of these things, although people that work in numerical
925analysis and use often the second method tend to prefer other programs,
926such as Matlab (or its open-source clone Octave).
927
928 \hypertarget{symbolic-integration}{%
929\subsubsection{Symbolic integration}\label{symbolic-integration}}
930
931Symbolic integrals work more or less like derivatives. You must specify
932an integration variable, but the endpoints of the integration interval
933are optional. If they are not given you get an indefinite integral.
934
935 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
936\prompt{In}{incolor}{60}{\boxspacing}
937\begin{Verbatim}[commandchars=\\\{\}]
938\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{a}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{b}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
939\PY{n}{f} \PY{o}{=} \PY{n}{x} \PY{o}{+} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)}
940\PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{integral}\PY{p}{(}\PY{n}{x}\PY{p}{)} \PY{p}{)} \PY{c+c1}{\PYZsh{} Alternative: integral(f, x)}
941\PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{integral}\PY{p}{(}\PY{n}{x}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mi}{10}\PY{p}{,} \PY{l+m+mi}{10}\PY{p}{)} \PY{p}{)}
942\PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{integral}\PY{p}{(}\PY{n}{x}\PY{p}{,} \PY{n}{a}\PY{p}{,} \PY{n}{b}\PY{p}{)} \PY{p}{)}
943\end{Verbatim}
944\end{tcolorbox}
945
946 \begin{Verbatim}[commandchars=\\\{\}]
9471/2*x\^{}2 - cos(x)
9480
949-1/2*a\^{}2 + 1/2*b\^{}2 + cos(a) - cos(b)
950 \end{Verbatim}
951
952 Your endpoints can also be \(\pm\infty\):
953
954 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
955\prompt{In}{incolor}{61}{\boxspacing}
956\begin{Verbatim}[commandchars=\\\{\}]
957\PY{n+nb}{print}\PY{p}{(} \PY{n}{integral}\PY{p}{(}\PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{p}{)}\PY{p}{,} \PY{n}{x}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{infinity}\PY{p}{)} \PY{p}{)}
958\PY{n+nb}{print}\PY{p}{(} \PY{n}{integral}\PY{p}{(}\PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{,} \PY{n}{x}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{n}{infinity}\PY{p}{,} \PY{n}{infinity}\PY{p}{)} \PY{p}{)}
959\end{Verbatim}
960\end{tcolorbox}
961
962 \begin{Verbatim}[commandchars=\\\{\}]
9631
964sqrt(pi)
965 \end{Verbatim}
966
967 The last function is also an example of an integral that perhaps you
968might want to compute numerically. In fact:
969
970 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
971\prompt{In}{incolor}{65}{\boxspacing}
972\begin{Verbatim}[commandchars=\\\{\}]
973\PY{n+nb}{print}\PY{p}{(} \PY{n}{integral}\PY{p}{(}\PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{,} \PY{n}{x}\PY{p}{)} \PY{p}{)}
974\PY{n+nb}{print}\PY{p}{(} \PY{n}{integral}\PY{p}{(}\PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{,} \PY{n}{x}\PY{p}{,} \PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{2}\PY{p}{)} \PY{p}{)}
975\end{Verbatim}
976\end{tcolorbox}
977
978 \begin{Verbatim}[commandchars=\\\{\}]
9791/2*sqrt(pi)*erf(x)
9801/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1)
981 \end{Verbatim}
982
983 Here \texttt{erf(x)} denotes the
984\href{https://en.wikipedia.org/wiki/Error_function}{error function}.
985
986 \hypertarget{numerical-integration}{%
987\subsubsection{Numerical integration}\label{numerical-integration}}
988
989In order to get an explicit value for the computations above, we can use
990a \emph{numerical} method.
991
992The word ``numerical'' does not have much to do with numbers, but it
993refers to the fact that we are trying to compute explicit results rather
994than symbolic or algebraic ones.
995\href{https://en.wikipedia.org/wiki/Numerical_analysis}{Numerical
996analysis} is the branch of mathematics that studies methods to
997approximate computations over the real or complex numbers. With these
998methods there is usually a trade-off between speed and precision.
999
1000The Sage function
1001\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html\#sage.calculus.integration.numerical_integral}{\texttt{numerical\_integral()}}
1002takes as a parameter a real-valued one-variable function and the
1003integration endpoints, and it returns both an approximate value for the
1004integral and an error estimate.
1005
1006 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1007\prompt{In}{incolor}{40}{\boxspacing}
1008\begin{Verbatim}[commandchars=\\\{\}]
1009\PY{n}{numerical\PYZus{}integral}\PY{p}{(}\PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{,} \PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{2}\PY{p}{)}
1010\end{Verbatim}
1011\end{tcolorbox}
1012
1013 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
1014\prompt{Out}{outcolor}{40}{\boxspacing}
1015\begin{Verbatim}[commandchars=\\\{\}]
1016(0.13525725794999466, 1.5016572202374808e-15)
1017\end{Verbatim}
1018\end{tcolorbox}
1019
1020 The result above means, in symbols \begin{align*}
1021\int_1^2 e^{-x^2}\mathrm dx = 0.13525725794999466 \pm 1.5016572202374808\times 10^{-15}
1022\end{align*}
1023
1024There is also a
1025\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html\#sage.calculus.integration.monte_carlo_integral}{\texttt{monte\_carlo\_integral()}}
1026method for functions with more than one variable.
1027
1028 \textbf{Exercise.} Compute the area of the ellipse of equation
1029\(y^2+\left(\frac x3\right)^2=1\).
1030
1031 \hypertarget{differential-equations}{%
1032\subsection{Differential equations}\label{differential-equations}}
1033
1034\textbf{Reference:}
1035{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html}{13}{]}
1036
1037A
1038\href{https://en.wikipedia.org/wiki/Differential_equation}{differential
1039equation} is an equation involving an unknwon function and its
1040derivatives. They can be of two kinds: \emph{ordinary} differential
1041equations
1042(\href{https://en.wikipedia.org/wiki/Ordinary_differential_equation}{ODE})
1043and \emph{partial} differential equations
1044(\href{https://en.wikipedia.org/wiki/Partial_differential_equation}{PDE}).
1045The latter involve multivariate functions and their partial derivatives.
1046
1047Differential equations are in general hard to solve \emph{exactly} (or
1048\emph{symbolically}): even a simple equation of the form \(f'(x)=g(x)\),
1049where \(g(x)\) is someknown function, requires solving the integral
1050\(\int g(x)\mathrm{d}x\) in order to find \(f\), which as we know is not
1051always easy!
1052
1053Theoretical results on differential equations usually ensure the
1054existence and/or uniquess of a solution under certain conditions, but in
1055general they do not give a way to solve them. There exits many methods
1056to find approximate solutions, and some of them are implemented in Sage
1057as well (see
1058{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html}{13}{]}).
1059However we will focus on the simple ODEs that can be solved exactly.
1060
1061Let's start with a simple example. Let's find all functions \(f(x)\)
1062such that \(f'(x)=f(x)\). In order to do so, we need to use the
1063\texttt{function()} construct, which allows us to define an ``unknwon''
1064function inside Sage, like we define variables with \texttt{var()}.
1065
1066 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1067\prompt{In}{incolor}{4}{\boxspacing}
1068\begin{Verbatim}[commandchars=\\\{\}]
1069\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{x}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
1070\PY{n}{function}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{f}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
1071\PY{n}{equation} \PY{o}{=} \PY{n}{derivative}\PY{p}{(}\PY{n}{f}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{)} \PY{o}{==} \PY{n}{f}\PY{p}{(}\PY{n}{x}\PY{p}{)}
1072\PY{n}{desolve}\PY{p}{(}\PY{n}{equation}\PY{p}{,} \PY{n}{f}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{)} \PY{c+c1}{\PYZsh{} f is the unknown function}
1073\end{Verbatim}
1074\end{tcolorbox}
1075
1076 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
1077\prompt{Out}{outcolor}{4}{\boxspacing}
1078\begin{Verbatim}[commandchars=\\\{\}]
1079\_C*e\^{}x
1080\end{Verbatim}
1081\end{tcolorbox}
1082
1083 As you can expect, they are all the functions \(Ce^x\) for some constant
1084\(C\). The constant \(C\) plays the same role as the constant in the
1085solution of an integral, but in this case Sage writes it explicitly.
1086
1087We can also specify \emph{initial conditions} for our function. For
1088example we can impose that \(f(0)=3\) as follows:
1089
1090 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1091\prompt{In}{incolor}{5}{\boxspacing}
1092\begin{Verbatim}[commandchars=\\\{\}]
1093\PY{n}{desolve}\PY{p}{(}\PY{n}{equation}\PY{p}{,} \PY{n}{f}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)}
1094\end{Verbatim}
1095\end{tcolorbox}
1096
1097 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
1098\prompt{Out}{outcolor}{5}{\boxspacing}
1099\begin{Verbatim}[commandchars=\\\{\}]
11003*e\^{}x
1101\end{Verbatim}
1102\end{tcolorbox}
1103
1104 You can also solve \emph{second order} equations, that is equations
1105where the second derivative also appears. In this case if you want to
1106specify an initial condition you should write the triple of values
1107\((x_0, f(x_0), f'(x_0))\).
1108
1109 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1110\prompt{In}{incolor}{6}{\boxspacing}
1111\begin{Verbatim}[commandchars=\\\{\}]
1112\PY{n}{equation} \PY{o}{=} \PY{n}{derivative}\PY{p}{(}\PY{n}{f}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{,} \PY{n}{x}\PY{p}{,} \PY{l+m+mi}{2}\PY{p}{)} \PY{o}{+} \PY{n}{x}\PY{o}{*}\PY{n}{derivative}\PY{p}{(}\PY{n}{f}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{)} \PY{o}{==} \PY{l+m+mi}{1}
1113\PY{n}{desolve}\PY{p}{(}\PY{n}{equation}\PY{p}{,} \PY{n}{f}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{)}\PY{p}{)}
1114\end{Verbatim}
1115\end{tcolorbox}
1116
1117 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
1118\prompt{Out}{outcolor}{6}{\boxspacing}
1119\begin{Verbatim}[commandchars=\\\{\}]
1120-1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e\^{}(-1/2*x\^{}2), x)
1121\end{Verbatim}
1122\end{tcolorbox}
1123
1124 \textbf{Exercise.} Use Sage to find out the functions \(f(x)\) that
1125satisfy \begin{align*}
1126 \begin{array}{rlcrl}
1127 (A) &
1128 \begin{cases}
1129 f(0) &= 1\\
1130 f'(0) &= 0\\
1131 f''(x) &= -f(x)
1132 \end{cases}
1133 & \qquad \qquad &
1134 (B) &
1135 \begin{cases}
1136 f(0) &= 0\\
1137 f'(0) &= 1\\
1138 f''(x) &= -f(x)
1139 \end{cases}
1140 \end{array}
1141\end{align*}
1142
1143 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1144\prompt{In}{incolor}{ }{\boxspacing}
1145\begin{Verbatim}[commandchars=\\\{\}]
1146
1147\end{Verbatim}
1148\end{tcolorbox}
1149
1150 \hypertarget{a-real-world-example}{%
1151\subsubsection{A real-world example}\label{a-real-world-example}}
1152
1153Differential equations have countless applications in Science, so it
1154would be a shame not to see at least a simple one.
1155
1156Consider an object moving with constant acceleration \(a\). Its velocity
1157at time \(t\) is described by the formula \(v(t) = v(0) + at\). For
1158example an object falling from the sky has acceleration
1159\(g\sim 9.8 m/s^2\) towards the ground, so its velocity is
1160\(v(t) = -gt\).
1161
1162However in the real world you need to take into account the air's
1163resistance, which depends (among other things) on the velocity of the
1164object. In this case the acceleration \(a(t)\) is not constant anymore,
1165and it satisfies an equation of the form \(a(t)=-g -kv(t)\), where \(k\)
1166is some constant that may depend on the shape and mass of the object (in
1167practice it may be more complicated than this).
1168
1169Since the acceleration is the derivative of the velocity, we have a
1170differential equation \begin{align*}
1171 v'(t) = -g -kv(t)
1172\end{align*} and we can try to solve it with Sage!
1173
1174 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1175\prompt{In}{incolor}{7}{\boxspacing}
1176\begin{Verbatim}[commandchars=\\\{\}]
1177\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{t}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
1178\PY{n}{function}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{v}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
1179\PY{n}{g} \PY{o}{=} \PY{l+m+mf}{9.8}
1180\PY{n}{k} \PY{o}{=} \PY{l+m+mf}{1.5}
1181\PY{n}{conditions} \PY{o}{=} \PY{p}{(}\PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{)} \PY{c+c1}{\PYZsh{} Start with velocity 0}
1182\PY{n}{desolve}\PY{p}{(}\PY{n}{derivative}\PY{p}{(}\PY{n}{v}\PY{p}{(}\PY{n}{t}\PY{p}{)}\PY{p}{)} \PY{o}{==} \PY{o}{\PYZhy{}}\PY{n}{g} \PY{o}{\PYZhy{}}\PY{n}{k}\PY{o}{*}\PY{n}{v}\PY{p}{(}\PY{n}{t}\PY{p}{)}\PY{p}{,} \PY{n}{v}\PY{p}{(}\PY{n}{t}\PY{p}{)}\PY{p}{,} \PY{n}{conditions}\PY{p}{)}
1183\end{Verbatim}
1184\end{tcolorbox}
1185
1186 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
1187\prompt{Out}{outcolor}{7}{\boxspacing}
1188\begin{Verbatim}[commandchars=\\\{\}]
1189-98/15*(e\^{}(3/2*t) - 1)*e\^{}(-3/2*t)
1190\end{Verbatim}
1191\end{tcolorbox}
1192
1193 If you want to solve this equation symbolically (that is, keeping \(g\)
1194and \(k\) in symbols) you need to specify that \(t\) is the
1195\emph{independent variable} of the equation:
1196
1197 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1198\prompt{In}{incolor}{10}{\boxspacing}
1199\begin{Verbatim}[commandchars=\\\{\}]
1200\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{t}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{g}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{k}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
1201\PY{n}{function}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{v}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
1202\PY{n}{conditions} \PY{o}{=} \PY{p}{(}\PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{)} \PY{c+c1}{\PYZsh{} Start with velocity 0}
1203\PY{n}{desolve}\PY{p}{(}\PY{n}{derivative}\PY{p}{(}\PY{n}{v}\PY{p}{(}\PY{n}{t}\PY{p}{)}\PY{p}{)} \PY{o}{==} \PY{o}{\PYZhy{}}\PY{n}{g} \PY{o}{\PYZhy{}}\PY{n}{k}\PY{o}{*}\PY{n}{v}\PY{p}{(}\PY{n}{t}\PY{p}{)}\PY{p}{,} \PY{n}{v}\PY{p}{(}\PY{n}{t}\PY{p}{)}\PY{p}{,} \PY{n}{conditions}\PY{p}{,} \PY{n}{ivar}\PY{o}{=}\PY{n}{t}\PY{p}{)}
1204\end{Verbatim}
1205\end{tcolorbox}
1206
1207 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
1208\prompt{Out}{outcolor}{10}{\boxspacing}
1209\begin{Verbatim}[commandchars=\\\{\}]
1210-(g*e\^{}(k*t) - g)*e\^{}(-k*t)/k
1211\end{Verbatim}
1212\end{tcolorbox}
1213
1214 \hypertarget{basic-data-analysis-and-visualization}{%
1215\section{Basic data analysis and
1216visualization}\label{basic-data-analysis-and-visualization}}
1217
1218\hypertarget{statistics}{%
1219\subsection{Statistics}\label{statistics}}
1220
1221\textbf{References:}
1222{[}\href{https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html}{14}{]}
1223
1224Sage includes the most basic functions for statistical analysis.
1225
1226 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1227\prompt{In}{incolor}{20}{\boxspacing}
1228\begin{Verbatim}[commandchars=\\\{\}]
1229\PY{n}{L} \PY{o}{=} \PY{p}{[}\PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{2}\PY{p}{,} \PY{l+m+mi}{3}\PY{p}{,} \PY{l+m+mi}{3}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mi}{6}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{p}{,} \PY{l+m+mi}{4}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{2}\PY{p}{,} \PY{l+m+mi}{3}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mi}{4}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{]}
1230
1231\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Values:}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{L}\PY{p}{)}
1232
1233\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Mean:}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{mean}\PY{p}{(}\PY{n}{L}\PY{p}{)}\PY{p}{)}
1234\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Median:}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{median}\PY{p}{(}\PY{n}{L}\PY{p}{)}\PY{p}{)}
1235\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Mode:}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{mode}\PY{p}{(}\PY{n}{L}\PY{p}{)}\PY{p}{)}
1236
1237\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Standard deviation:}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{std}\PY{p}{(}\PY{n}{L}\PY{p}{)}\PY{p}{)}
1238\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Variance:}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{variance}\PY{p}{(}\PY{n}{L}\PY{p}{)}\PY{p}{)}
1239
1240\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Moving average (5):}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{moving\PYZus{}average}\PY{p}{(}\PY{n}{L}\PY{p}{,}\PY{l+m+mi}{5}\PY{p}{)}\PY{p}{)}
1241\end{Verbatim}
1242\end{tcolorbox}
1243
1244 \begin{Verbatim}[commandchars=\\\{\}]
1245Values: [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]
1246Mean: 5/13
1247Median: 1
1248Mode: [3]
1249Standard deviation: 2*sqrt(29/13)
1250Variance: 116/13
1251Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5]
1252 \end{Verbatim}
1253
1254 You can also compare your data to a probability distribution, see
1255\href{https://doc.sagemath.org/html/en/reference/probability/sage/probability/probability_distribution.html}{this
1256page}. If you need to do more advanced statistics you should consider
1257using \href{https://www.r-project.org/}{R}; you can also use it inside
1258Sage.
1259
1260 \hypertarget{plotting}{%
1261\subsection{Plotting}\label{plotting}}
1262
1263\textbf{Reference:}
1264{[}\href{https://doc.sagemath.org/html/en/reference/plotting/index.html}{15}{]},
1265more specifically the subsection
1266{[}\href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html}{16}{]}.
1267
1268Some Sage objects can be plotted:
1269
1270 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1271\prompt{In}{incolor}{21}{\boxspacing}
1272\begin{Verbatim}[commandchars=\\\{\}]
1273\PY{n}{f} \PY{o}{=} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)}
1274\PY{n}{plot}\PY{p}{(}\PY{n}{f}\PY{p}{)}
1275\end{Verbatim}
1276\end{tcolorbox}
1277
1278
1279\prompt{Out}{outcolor}{21}{}
1280
1281 \begin{center}
1282 \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_75_0.png}
1283 \end{center}
1284 { \hspace*{\fill} \\}
1285
1286
1287 Sage's plotting functions are based on Python's
1288\href{https://matplotlib.org/}{matplotlib}.
1289
1290You can give a number of options to adjust the aspect of your plot, see
1291\href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html\#sage.plot.plot.plot}{here}.
1292Let's see some of them:
1293
1294 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1295\prompt{In}{incolor}{67}{\boxspacing}
1296\begin{Verbatim}[commandchars=\\\{\}]
1297\PY{n}{f} \PY{o}{=} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)}
1298\PY{n}{plot}\PY{p}{(}\PY{n}{f}\PY{p}{,}
1299 \PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{pi}\PY{p}{,} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{pi}\PY{p}{,} \PY{c+c1}{\PYZsh{} bounds for x}
1300 \PY{n}{ymin} \PY{o}{=} \PY{o}{\PYZhy{}}\PY{l+m+mf}{0.7}\PY{p}{,} \PY{n}{ymax} \PY{o}{=} \PY{l+m+mf}{0.7}\PY{p}{,} \PY{c+c1}{\PYZsh{} bounds for y}
1301 \PY{n}{color} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{red}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,}
1302 \PY{n}{title} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{The sin function}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,}
1303 \PY{p}{)}
1304\end{Verbatim}
1305\end{tcolorbox}
1306
1307
1308\prompt{Out}{outcolor}{67}{}
1309
1310 \begin{center}
1311 \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_77_0.png}
1312 \end{center}
1313 { \hspace*{\fill} \\}
1314
1315
1316 Some of the options are not described precisely in Sage's documentation,
1317but you can find them on
1318\href{https://matplotlib.org/stable/contents.html}{matplotlib's
1319documentation}. You can find many examples online for adjusting your
1320plot as you like!
1321
1322 If you need to plot more than one object at the time, you can sum two
1323plots and show them together with \texttt{show()}:
1324
1325 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1326\prompt{In}{incolor}{36}{\boxspacing}
1327\begin{Verbatim}[commandchars=\\\{\}]
1328\PY{n}{cosine} \PY{o}{=} \PY{n}{plot}\PY{p}{(}\PY{n}{cos}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{n}{x}\PY{p}{,}\PY{o}{\PYZhy{}}\PY{n}{pi}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{,}\PY{n}{pi}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{,} \PY{n}{color}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{red}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}
1329\PY{n}{exponential} \PY{o}{=} \PY{n}{plot}\PY{p}{(}\PY{n}{exp}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{n}{x}\PY{p}{,}\PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mf}{0.5}\PY{p}{)}\PY{p}{)}
1330
1331\PY{n}{show}\PY{p}{(}\PY{n}{cosine} \PY{o}{+} \PY{n}{exponential}\PY{p}{)}
1332\end{Verbatim}
1333\end{tcolorbox}
1334
1335 \begin{center}
1336 \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_80_0.png}
1337 \end{center}
1338 { \hspace*{\fill} \\}
1339
1340 Finally, there are other types of plots that you can use, like
1341\href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/scatter_plot.html\#sage.plot.scatter_plot.scatter_plot}{scatter
1342plots} and
1343\href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/bar_chart.html\#sage.plot.bar_chart.bar_chart}{bar
1344charts}. You can also add
1345\href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/text.html\#sage.plot.text.text}{text}
1346to your plot:
1347
1348 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1349\prompt{In}{incolor}{53}{\boxspacing}
1350\begin{Verbatim}[commandchars=\\\{\}]
1351\PY{n}{b} \PY{o}{=} \PY{n}{bar\PYZus{}chart}\PY{p}{(}\PY{n+nb}{range}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{10}\PY{p}{)}\PY{p}{)}
1352\PY{n}{s} \PY{o}{=} \PY{n}{scatter\PYZus{}plot}\PY{p}{(}\PY{p}{[}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{5}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{4}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{8}\PY{p}{,}\PY{l+m+mi}{8}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{4}\PY{p}{,}\PY{l+m+mi}{7}\PY{p}{)}\PY{p}{]}\PY{p}{,}
1353 \PY{n}{marker} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{*}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{c+c1}{\PYZsh{} symbol}
1354 \PY{n}{markersize} \PY{o}{=} \PY{l+m+mi}{100}\PY{p}{,}
1355 \PY{n}{edgecolor} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{black}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,}
1356 \PY{n}{facecolor} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{red}\PY{l+s+s2}{\PYZdq{}}
1357 \PY{p}{)}
1358\PY{n}{t} \PY{o}{=} \PY{n}{text}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{wow, such plot!}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{8}\PY{p}{)}\PY{p}{,} \PY{n}{color}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{black}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{fontsize}\PY{o}{=}\PY{l+m+mi}{20}\PY{p}{)}
1359\PY{n}{show}\PY{p}{(}\PY{n}{b} \PY{o}{+} \PY{n}{s} \PY{o}{+} \PY{n}{t}\PY{p}{)}
1360\end{Verbatim}
1361\end{tcolorbox}
1362
1363 \begin{center}
1364 \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_82_0.png}
1365 \end{center}
1366 { \hspace*{\fill} \\}
1367
1368 \hypertarget{interpolation}{%
1369\subsection{Interpolation}\label{interpolation}}
1370
1371\textbf{References:}
1372{[}\href{https://doc.sagemath.org/html/en/reference/polynomial_rings/sage/rings/polynomial/polynomial_ring.html\#sage.rings.polynomial.polynomial_ring.PolynomialRing_field.lagrange_polynomial}{17}{]}
1373and
1374{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/interpolation.html}{18}{]}.
1375
1376When you need to work with a discrete set of data, like measurements of
1377real-world quantities, it can be useful to visualize a ``smoothed out''
1378version of this data, for example by plotting a function that
1379approximates it.
1380
1381One way to do so is finding the lowest-degree polynomial that passes
1382through all your points. This is called
1383\href{https://en.wikipedia.org/wiki/Lagrange_polynomial}{Lagrange
1384Polynomial}.
1385
1386 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1387\prompt{In}{incolor}{65}{\boxspacing}
1388\begin{Verbatim}[commandchars=\\\{\}]
1389\PY{n}{points} \PY{o}{=} \PY{p}{[} \PY{p}{(}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mf}{1.5}\PY{p}{,}\PY{l+m+mi}{0}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{4}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{5}\PY{p}{)} \PY{p}{]}
1390\PY{n}{polring}\PY{o}{.}\PY{o}{\PYZlt{}}\PY{n}{x}\PY{o}{\PYZgt{}} \PY{o}{=} \PY{n}{QQ}\PY{p}{[}\PY{p}{]} \PY{c+c1}{\PYZsh{} you need to specify a polynomial ring}
1391\PY{n}{lp} \PY{o}{=} \PY{n}{polring}\PY{o}{.}\PY{n}{lagrange\PYZus{}polynomial}\PY{p}{(}\PY{n}{points}\PY{p}{)}
1392\PY{n}{show}\PY{p}{(}\PY{n}{scatter\PYZus{}plot}\PY{p}{(}\PY{n}{points}\PY{p}{,} \PY{n}{facecolor}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{red}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}
1393 \PY{o}{+} \PY{n}{plot}\PY{p}{(}\PY{n}{lp}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{3}\PY{p}{)} \PY{c+c1}{\PYZsh{} slightly different notation for polynomials}
1394 \PY{o}{+} \PY{n}{text}\PY{p}{(}\PY{n}{lp}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{8}\PY{p}{)}\PY{p}{,} \PY{n}{color}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{black}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}
1395 \PY{p}{)}
1396\end{Verbatim}
1397\end{tcolorbox}
1398
1399 \begin{center}
1400 \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_84_0.png}
1401 \end{center}
1402 { \hspace*{\fill} \\}
1403
1404 One can compute the Lagrange Polynomial over any base ring, and it has
1405the advantage that it is a very ``nice'' function (continuous and
1406differentiable as much as you like, with easily computable derivatives
1407and primitives).
1408
1409However, it does not always give you good approximation of your data:
1410
1411 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1412\prompt{In}{incolor}{2}{\boxspacing}
1413\begin{Verbatim}[commandchars=\\\{\}]
1414\PY{n}{R} \PY{o}{=} \PY{p}{[}\PY{n}{x}\PY{o}{/}\PY{l+m+mi}{10} \PY{k}{for} \PY{n}{x} \PY{o+ow}{in} \PY{n+nb}{range}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{l+m+mi}{10}\PY{p}{,}\PY{l+m+mi}{10}\PY{p}{)}\PY{p}{]}
1415\PY{n}{L} \PY{o}{=} \PY{p}{[}\PY{l+m+mi}{1}\PY{o}{/}\PY{p}{(}\PY{l+m+mi}{1}\PY{o}{+}\PY{l+m+mi}{25}\PY{o}{*}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{p}{)} \PY{k}{for} \PY{n}{x} \PY{o+ow}{in} \PY{n}{R}\PY{p}{]}
1416\PY{n}{points} \PY{o}{=} \PY{p}{[}\PY{p}{(}\PY{n}{R}\PY{p}{[}\PY{n}{i}\PY{p}{]}\PY{p}{,} \PY{n}{L}\PY{p}{[}\PY{n}{i}\PY{p}{]}\PY{p}{)} \PY{k}{for} \PY{n}{i} \PY{o+ow}{in} \PY{n+nb}{range}\PY{p}{(}\PY{n+nb}{len}\PY{p}{(}\PY{n}{L}\PY{p}{)}\PY{p}{)}\PY{p}{]}
1417\PY{n}{polring}\PY{o}{.}\PY{o}{\PYZlt{}}\PY{n}{x}\PY{o}{\PYZgt{}} \PY{o}{=} \PY{n}{RR}\PY{p}{[}\PY{p}{]}
1418\PY{n}{lp} \PY{o}{=} \PY{n}{polring}\PY{o}{.}\PY{n}{lagrange\PYZus{}polynomial}\PY{p}{(}\PY{n}{points}\PY{p}{)}
1419
1420\PY{n}{show}\PY{p}{(}\PY{n}{plot}\PY{p}{(}\PY{n}{lp}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mf}{0.82}\PY{p}{,} \PY{l+m+mf}{0.72}\PY{p}{)} \PY{o}{+} \PY{n}{scatter\PYZus{}plot}\PY{p}{(}\PY{n}{points}\PY{p}{)}\PY{p}{)}
1421\end{Verbatim}
1422\end{tcolorbox}
1423
1424 \begin{center}
1425 \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_86_0.png}
1426 \end{center}
1427 { \hspace*{\fill} \\}
1428
1429 This particular example is called
1430\href{https://en.wikipedia.org/wiki/Runge\%27s_phenomenon}{Runge's
1431phenomenon}. For a better approximation you can use a
1432\href{https://en.wikipedia.org/wiki/Spline_(mathematics)}{spline}, which
1433is a \emph{piecewise} polynomial function:
1434
1435 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1436\prompt{In}{incolor}{90}{\boxspacing}
1437\begin{Verbatim}[commandchars=\\\{\}]
1438\PY{n}{show}\PY{p}{(}\PY{n}{plot}\PY{p}{(}\PY{n}{spline}\PY{p}{(}\PY{n}{points}\PY{p}{)}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{1}\PY{p}{)} \PY{o}{+} \PY{n}{scatter\PYZus{}plot}\PY{p}{(}\PY{n}{points}\PY{p}{)}\PY{p}{)}
1439\end{Verbatim}
1440\end{tcolorbox}
1441
1442 \begin{center}
1443 \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_88_0.png}
1444 \end{center}
1445 { \hspace*{\fill} \\}
1446
1447 A detailed explanation of splines is a good topic for a course of
1448numerical analysis. For this course it is enough that you know that they
1449exist and they can be plotted.
1450
1451
1452 % Add a bibliography block to the postdoc
1453
1454
1455
1456\end{document}
diff --git a/src/Lecture6/notebook/9-SageLatex.aux b/src/Lecture6/notebook/9-SageLatex.aux
new file mode 100644
index 0000000..1220a33
--- /dev/null
+++ b/src/Lecture6/notebook/9-SageLatex.aux
@@ -0,0 +1,32 @@
1\relax
2\providecommand\hyper@newdestlabel[2]{}
3\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
4\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
5\global\let\oldcontentsline\contentsline
6\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
7\global\let\oldnewlabel\newlabel
8\gdef\newlabel#1#2{\newlabelxx{#1}#2}
9\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
10\AtEndDocument{\ifx\hyper@anchor\@undefined
11\let\contentsline\oldcontentsline
12\let\newlabel\oldnewlabel
13\fi}
14\fi}
15\global\let\hyper@last\relax
16\gdef\HyperFirstAtBeginDocument#1{#1}
17\providecommand\HyField@AuxAddToFields[1]{}
18\providecommand\HyField@AuxAddToCoFields[2]{}
19\providecommand \oddpage@label [2]{}
20\@writefile{toc}{\contentsline {section}{\numberline {1}The \texttt {show()} command}{1}{section.1}\protected@file@percent }
21\newlabel{the-show-command}{{1}{1}{\texorpdfstring {The \texttt {show()} command}{The show() command}}{section.1}{}}
22\@writefile{toc}{\contentsline {section}{\numberline {2}The \texttt {latex()} command}{2}{section.2}\protected@file@percent }
23\newlabel{the-latex-command}{{2}{2}{\texorpdfstring {The \texttt {latex()} command}{The latex() command}}{section.2}{}}
24\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}A Latex name for your variables}{2}{subsection.2.1}\protected@file@percent }
25\newlabel{a-latex-name-for-your-variables}{{2.1}{2}{A Latex name for your variables}{subsection.2.1}{}}
26\@writefile{toc}{\contentsline {section}{\numberline {3}From Jupyter to Latex}{3}{section.3}\protected@file@percent }
27\newlabel{from-jupyter-to-latex}{{3}{3}{From Jupyter to Latex}{section.3}{}}
28\@writefile{toc}{\contentsline {section}{\numberline {4}SageTex}{3}{section.4}\protected@file@percent }
29\newlabel{sagetex}{{4}{3}{SageTex}{section.4}{}}
30\@writefile{toc}{\contentsline {section}{\numberline {5}The Latex \texttt {listings} package}{3}{section.5}\protected@file@percent }
31\newlabel{the-latex-listings-package}{{5}{3}{\texorpdfstring {The Latex \texttt {listings} package}{The Latex listings package}}{section.5}{}}
32\gdef \@abspage@last{4}
diff --git a/src/Lecture6/notebook/9-SageLatex.ipynb b/src/Lecture6/notebook/9-SageLatex.ipynb
new file mode 100644
index 0000000..63ea8c6
--- /dev/null
+++ b/src/Lecture6/notebook/9-SageLatex.ipynb
@@ -0,0 +1,346 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "It can happen that you need to include the results of your Sage computations and/or Sage code inside a LaTeX document. Luckily Sage provides some functions to translate its objects into LaTeX, and the listings package for LaTeX can be used to include any code (Sage, Python or any other language) in a LaTeX document.\n",
8 "\n",
9 "In this document we will describe some of these interactions between LaTeX and Sage."
10 ]
11 },
12 {
13 "cell_type": "markdown",
14 "metadata": {},
15 "source": [
16 "# The `show()` command\n",
17 "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/repl/sage/repl/display/pretty_print.html)] (`show()` is just an alternative name for `pretty_print()`).\n",
18 "\n",
19 "With this command Sage will generate a picture displaying the object. The result depends on the object itself: most of them will be typeset in Latex, but for example graphics primitives (such as plots) will be displayed as pictures.\n",
20 "\n",
21 "You can see it as an alternative to `print()`."
22 ]
23 },
24 {
25 "cell_type": "code",
26 "execution_count": 4,
27 "metadata": {},
28 "outputs": [
29 {
30 "name": "stdout",
31 "output_type": "stream",
32 "text": [
33 "1 + 1*x + 1/2*x^2 + 1/6*x^3 + Order(x^4)\n"
34 ]
35 },
36 {
37 "data": {
38 "text/html": [
39 "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}1 + 1 x + \\frac{1}{2} x^{2} + \\frac{1}{6} x^{3} + \\mathcal{O}\\left(x^{4}\\right)</script></html>"
40 ],
41 "text/latex": [
42 "\\begin{math}\n",
43 "\\newcommand{\\Bold}[1]{\\mathbf{#1}}1 + 1 x + \\frac{1}{2} x^{2} + \\frac{1}{6} x^{3} + \\mathcal{O}\\left(x^{4}\\right)\n",
44 "\\end{math}"
45 ],
46 "text/plain": [
47 "1 + 1*x + 1/2*x^2 + 1/6*x^3 + Order(x^4)"
48 ]
49 },
50 "metadata": {},
51 "output_type": "display_data"
52 },
53 {
54 "name": "stdout",
55 "output_type": "stream",
56 "text": [
57 "[ 1 2 3]\n",
58 "[ 4 5 6]\n",
59 "[ 8 9 10]\n"
60 ]
61 },
62 {
63 "data": {
64 "text/html": [
65 "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n",
66 "1 & 2 & 3 \\\\\n",
67 "4 & 5 & 6 \\\\\n",
68 "8 & 9 & 10\n",
69 "\\end{array}\\right)</script></html>"
70 ],
71 "text/latex": [
72 "\\begin{math}\n",
73 "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n",
74 "1 & 2 & 3 \\\\\n",
75 "4 & 5 & 6 \\\\\n",
76 "8 & 9 & 10\n",
77 "\\end{array}\\right)\n",
78 "\\end{math}"
79 ],
80 "text/plain": [
81 "[ 1 2 3]\n",
82 "[ 4 5 6]\n",
83 "[ 8 9 10]"
84 ]
85 },
86 "metadata": {},
87 "output_type": "display_data"
88 },
89 {
90 "name": "stdout",
91 "output_type": "stream",
92 "text": [
93 "pi\n"
94 ]
95 },
96 {
97 "data": {
98 "text/html": [
99 "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\pi</script></html>"
100 ],
101 "text/latex": [
102 "\\begin{math}\n",
103 "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\pi\n",
104 "\\end{math}"
105 ],
106 "text/plain": [
107 "pi"
108 ]
109 },
110 "metadata": {},
111 "output_type": "display_data"
112 }
113 ],
114 "source": [
115 "s = (e^x).series(x==0, 4)\n",
116 "M = matrix([[1,2,3],[4,5,6],[8,9,10]])\n",
117 "print(s)\n",
118 "show(s)\n",
119 "print(M)\n",
120 "show(M)\n",
121 "print(pi)\n",
122 "show(pi)"
123 ]
124 },
125 {
126 "cell_type": "markdown",
127 "metadata": {},
128 "source": [
129 "In a Jupyter notebook, the results above are displayed using [MathJax](https://www.mathjax.org/).\n",
130 "\n",
131 "If you are running this code in an interactive console (terminal) instead of a Jupyter notebook, you will get the Latex source code for those objects. You can force this behavior by using the `latex()` command."
132 ]
133 },
134 {
135 "cell_type": "markdown",
136 "metadata": {},
137 "source": [
138 "# The `latex()` command\n",
139 "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/misc/sage/misc/latex.html)]\n",
140 "\n",
141 "This command is potentially very useful if you need to include the results of Sage computations in a Latex file, especially with complex objects like matrices or very large polynomials.\n",
142 "\n",
143 "Technically, this is a function that returns a string, so you need to `print()` it to see the result."
144 ]
145 },
146 {
147 "cell_type": "code",
148 "execution_count": 5,
149 "metadata": {},
150 "outputs": [
151 {
152 "name": "stdout",
153 "output_type": "stream",
154 "text": [
155 "1 + 1 x + \\frac{1}{2} x^{2} + \\frac{1}{6} x^{3} + \\mathcal{O}\\left(x^{4}\\right)\n",
156 "\n",
157 "\n",
158 "\\left(\\begin{array}{rrr}\n",
159 "1 & 2 & 3 \\\\\n",
160 "4 & 5 & 6 \\\\\n",
161 "8 & 9 & 10\n",
162 "\\end{array}\\right)\n"
163 ]
164 }
165 ],
166 "source": [
167 "print(latex(s))\n",
168 "print(\"\\n\")\n",
169 "print(latex(M))"
170 ]
171 },
172 {
173 "cell_type": "markdown",
174 "metadata": {},
175 "source": [
176 "Interestingly, Sage can use matplotlib's PGF backend to generate Latex code for a plot. (PGF is the graphics language underlying TikZ, like TeX is the language underlying Latex)."
177 ]
178 },
179 {
180 "cell_type": "code",
181 "execution_count": 15,
182 "metadata": {},
183 "outputs": [],
184 "source": [
185 "#latex(plot(x^2)) # The output is more than 20 pages long"
186 ]
187 },
188 {
189 "cell_type": "markdown",
190 "metadata": {},
191 "source": [
192 "It is probably easier to just generate the picture and include that in your Latex document with `\\includegraphics`."
193 ]
194 },
195 {
196 "cell_type": "markdown",
197 "metadata": {},
198 "source": [
199 "## A Latex name for your variables\n",
200 "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/var.html)]\n",
201 "\n",
202 "Sometimes you might want to use variables and functions that have, for example, a Greek letter as a name. You can tell Sage that you want them displayed this way when you declare them:"
203 ]
204 },
205 {
206 "cell_type": "code",
207 "execution_count": 16,
208 "metadata": {},
209 "outputs": [
210 {
211 "name": "stdout",
212 "output_type": "stream",
213 "text": [
214 "phi1(epsilon)\n"
215 ]
216 },
217 {
218 "data": {
219 "text/html": [
220 "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}e^{{\\varepsilon}} + \\phi_1\\left({\\varepsilon}\\right)</script></html>"
221 ],
222 "text/latex": [
223 "\\begin{math}\n",
224 "\\newcommand{\\Bold}[1]{\\mathbf{#1}}e^{{\\varepsilon}} + \\phi_1\\left({\\varepsilon}\\right)\n",
225 "\\end{math}"
226 ],
227 "text/plain": [
228 "e^epsilon + phi1(epsilon)"
229 ]
230 },
231 "metadata": {},
232 "output_type": "display_data"
233 },
234 {
235 "data": {
236 "text/plain": [
237 "e^{{\\varepsilon}} + \\phi_1\\left({\\varepsilon}\\right)"
238 ]
239 },
240 "execution_count": 16,
241 "metadata": {},
242 "output_type": "execute_result"
243 }
244 ],
245 "source": [
246 "var('epsilon', latex_name=\"\\\\varepsilon\")\n",
247 "function('phi1', latex_name=\"\\\\phi_1\")\n",
248 "\n",
249 "print(phi1(epsilon))\n",
250 "show(phi1(epsilon) + e^epsilon)\n",
251 "latex(phi1(epsilon) + e^epsilon)"
252 ]
253 },
254 {
255 "cell_type": "markdown",
256 "metadata": {},
257 "source": [
258 "**Warning:** You need to use two backspaces `\\\\`. The reason is that in Python (like in many other programming languages) the backslash symbol inside a string is used to print special characters, such as a newline `\\n`."
259 ]
260 },
261 {
262 "cell_type": "markdown",
263 "metadata": {},
264 "source": [
265 "# From Jupyter to Latex\n",
266 "**Reference:** [[4](https://nbconvert.readthedocs.io/en/latest/)]\n",
267 "\n",
268 "From the Jupyter menu `File > Download as` you can choose to download your work in many formats, among which there are also Latex and pdf. Personally I prefer downloading the .tex file, so then I can change the title, add an author name and make any other change I like before compiling it into a pdf file.\n",
269 "\n",
270 "If you choose to download the pdf file, you might need to install some extra packages. For example I had to install [`pandoc`](https://pandoc.org/), `texlive-XeTeX` and `texlive-Xdvi`, but this depends on your operating system and Latex distribution."
271 ]
272 },
273 {
274 "cell_type": "markdown",
275 "metadata": {},
276 "source": [
277 "# SageTex\n",
278 "**Reference:** [[5](https://doc.sagemath.org/html/en/tutorial/sagetex.html)]\n",
279 "\n",
280 "With SageTex it is possible to run Sage commands directly inside Latex, using the `\\sage{}` command. In this way you don't need to run your Sage code first and then copy the results in Latex. It can be useful especially for short Sage commands.\n",
281 "\n",
282 "You might need to take some extra steps to make this work on your system, see the link above."
283 ]
284 },
285 {
286 "cell_type": "markdown",
287 "metadata": {},
288 "source": [
289 "# The Latex `listings` package\n",
290 "**References:** [[6](https://en.wikibooks.org/wiki/LaTeX/Source_Code_Listings)] and [[7](https://ftp.snt.utwente.nl/pub/software/tex/macros/latex/contrib/listings/listings.pdf)]\n",
291 "\n",
292 "If you want to include some code (Sage, Python or anything else) in a Latex document you can use the listings package.\n",
293 "\n",
294 "```\n",
295 "\\usepackage{listings}\n",
296 "\n",
297 "...\n",
298 "\n",
299 "\\begin{lstlisting}[language=Python]\n",
300 "for i in range(0,100):\n",
301 " if i%5 == 0:\n",
302 " print(\"Multiple of 5!\")\n",
303 "\\end{lstlisting}\n",
304 "```\n",
305 "\n",
306 "You need to specify the language you are using with the `language=` option. This option can also be set at the beginning of the document using the `\\lstset{language=Python}` command.\n",
307 "\n",
308 "As an alternative, you can include a file directly without copying the code into the tex file, like you would do for a picture:\n",
309 "\n",
310 "```\n",
311 "\\lstinputlisting[language=Python]{file.py}\n",
312 "```\n",
313 "\n",
314 "It is technically possible to include Latex listings in a markdown cell of the Jupyter notebook using [this package](https://jupyter-contrib-nbextensions.readthedocs.io/en/latest/nbextensions/latex_envs/README.html), but it does not make much sense. So we will move to a Latex editor for the examples."
315 ]
316 },
317 {
318 "cell_type": "code",
319 "execution_count": null,
320 "metadata": {},
321 "outputs": [],
322 "source": []
323 }
324 ],
325 "metadata": {
326 "kernelspec": {
327 "display_name": "SageMath 9.2",
328 "language": "sage",
329 "name": "sagemath"
330 },
331 "language_info": {
332 "codemirror_mode": {
333 "name": "ipython",
334 "version": 3
335 },
336 "file_extension": ".py",
337 "mimetype": "text/x-python",
338 "name": "python",
339 "nbconvert_exporter": "python",
340 "pygments_lexer": "ipython3",
341 "version": "3.8.5"
342 }
343 },
344 "nbformat": 4,
345 "nbformat_minor": 4
346}
diff --git a/src/Lecture6/notebook/9-SageLatex.log b/src/Lecture6/notebook/9-SageLatex.log
new file mode 100644
index 0000000..ebe95af
--- /dev/null
+++ b/src/Lecture6/notebook/9-SageLatex.log
@@ -0,0 +1,954 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/VoidLinux) (preloaded format=pdflatex 2021.4.20) 7 MAY 2021 18:09
2entering extended mode
3 \write18 enabled.
4 %&-line parsing enabled.
5**9-SageLatex.tex
6(./9-SageLatex.tex
7LaTeX2e <2020-10-01> patch level 2
8L3 programming layer <2020-12-03> xparse <2020-03-03>
9(/usr/share/texmf-dist/tex/latex/base/article.cls
10Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
11(/usr/share/texmf-dist/tex/latex/base/size11.clo
12File: size11.clo 2020/04/10 v1.4m Standard LaTeX file (size option)
13)
14\c@part=\count177
15\c@section=\count178
16\c@subsection=\count179
17\c@subsubsection=\count180
18\c@paragraph=\count181
19\c@subparagraph=\count182
20\c@figure=\count183
21\c@table=\count184
22\abovecaptionskip=\skip47
23\belowcaptionskip=\skip48
24\bibindent=\dimen138
25)
26(/usr/share/texmf-dist/tex/latex/tcolorbox/tcolorbox.sty
27Package: tcolorbox 2020/10/09 version 4.42 text color boxes
28
29(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
30(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
31(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
32\pgfutil@everybye=\toks15
33\pgfutil@tempdima=\dimen139
34\pgfutil@tempdimb=\dimen140
35
36(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex))
37(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
38\pgfutil@abb=\box47
39)
40(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
41(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex)
42Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a)
43))
44Package: pgf 2020/12/01 v3.1.7a (3.1.7a)
45
46(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
47(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty
48Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR)
49
50(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty
51Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
52\KV@toks@=\toks16
53)
54(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty
55Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR)
56
57(/usr/share/texmf-dist/tex/latex/graphics/trig.sty
58Package: trig 2016/01/03 v1.10 sin cos tan (DPC)
59)
60(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
61File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration
62)
63Package graphics Info: Driver file: pdftex.def on input line 105.
64
65(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def
66File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex
67))
68\Gin@req@height=\dimen141
69\Gin@req@width=\dimen142
70)
71(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
72(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
73Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a)
74
75(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
76\pgfkeys@pathtoks=\toks17
77\pgfkeys@temptoks=\toks18
78
79(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex
80\pgfkeys@tmptoks=\toks19
81))
82\pgf@x=\dimen143
83\pgf@y=\dimen144
84\pgf@xa=\dimen145
85\pgf@ya=\dimen146
86\pgf@xb=\dimen147
87\pgf@yb=\dimen148
88\pgf@xc=\dimen149
89\pgf@yc=\dimen150
90\pgf@xd=\dimen151
91\pgf@yd=\dimen152
92\w@pgf@writea=\write3
93\r@pgf@reada=\read2
94\c@pgf@counta=\count185
95\c@pgf@countb=\count186
96\c@pgf@countc=\count187
97\c@pgf@countd=\count188
98\t@pgf@toka=\toks20
99\t@pgf@tokb=\toks21
100\t@pgf@tokc=\toks22
101\pgf@sys@id@count=\count189
102
103(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
104File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a)
105)
106Driver file for pgf: pgfsys-pdftex.def
107
108(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
109File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a)
110
111(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def
112File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a)
113)))
114(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
115File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a)
116\pgfsyssoftpath@smallbuffer@items=\count190
117\pgfsyssoftpath@bigbuffer@items=\count191
118)
119(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
120File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a)
121))
122(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty
123Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
124
125(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg
126File: color.cfg 2016/01/02 v1.6 sample color configuration
127)
128Package xcolor Info: Driver file: pdftex.def on input line 225.
129Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
130Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
131Package xcolor Info: Model `RGB' extended on input line 1364.
132Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
133Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
134Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
135Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
136Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
137Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
138)
139(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
140Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a)
141
142(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
143(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
144(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex)
145(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
146\pgfmath@dimen=\dimen153
147\pgfmath@count=\count192
148\pgfmath@box=\box48
149\pgfmath@toks=\toks23
150\pgfmath@stack@operand=\toks24
151\pgfmath@stack@operation=\toks25
152)
153(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex
154(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex)
155(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code
156.tex)
157(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex)
158(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te
159x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex)
160(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex)
161(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex)
162(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics
163.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
164\c@pgfmathroundto@lastzeros=\count193
165)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex)
166(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex
167File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a)
168\pgf@picminx=\dimen154
169\pgf@picmaxx=\dimen155
170\pgf@picminy=\dimen156
171\pgf@picmaxy=\dimen157
172\pgf@pathminx=\dimen158
173\pgf@pathmaxx=\dimen159
174\pgf@pathminy=\dimen160
175\pgf@pathmaxy=\dimen161
176\pgf@xx=\dimen162
177\pgf@xy=\dimen163
178\pgf@yx=\dimen164
179\pgf@yy=\dimen165
180\pgf@zx=\dimen166
181\pgf@zy=\dimen167
182)
183(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex
184File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a)
185\pgf@path@lastx=\dimen168
186\pgf@path@lasty=\dimen169
187) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex
188File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
189\pgf@shorten@end@additional=\dimen170
190\pgf@shorten@start@additional=\dimen171
191)
192(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex
193File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
194\pgfpic=\box49
195\pgf@hbox=\box50
196\pgf@layerbox@main=\box51
197\pgf@picture@serial@count=\count194
198)
199(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex
200File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a)
201\pgflinewidth=\dimen172
202)
203(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t
204ex
205File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a)
206\pgf@pt@x=\dimen173
207\pgf@pt@y=\dimen174
208\pgf@pt@temp=\dimen175
209) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
210File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a)
211)
212(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex
213File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a)
214)
215(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te
216x
217File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a)
218) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex
219File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a)
220\pgfarrowsep=\dimen176
221)
222(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
223File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a)
224\pgf@max=\dimen177
225\pgf@sys@shading@range@num=\count195
226\pgf@shadingcount=\count196
227)
228(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
229File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
230
231(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex
232File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a)
233\pgfexternal@startupbox=\box52
234))
235(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex
236File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a)
237)
238(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex
239File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a)
240) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex
241File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a)
242)
243(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
244File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a)
245)))
246(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
247File: pgfmoduleshapes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
248\pgfnodeparttextbox=\box53
249)
250(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
251File: pgfmoduleplot.code.tex 2020/12/01 v3.1.7a (3.1.7a)
252)
253(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
254Package: pgfcomp-version-0-65 2020/12/01 v3.1.7a (3.1.7a)
255\pgf@nodesepstart=\dimen178
256\pgf@nodesepend=\dimen179
257)
258(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
259Package: pgfcomp-version-1-18 2020/12/01 v3.1.7a (3.1.7a)
260))
261(/usr/share/texmf-dist/tex/latex/tools/verbatim.sty
262Package: verbatim 2020-07-07 v1.5u LaTeX2e package for verbatim enhancements
263\every@verbatim=\toks26
264\verbatim@line=\toks27
265\verbatim@in@stream=\read3
266)
267(/usr/share/texmf-dist/tex/latex/environ/environ.sty
268Package: environ 2014/05/04 v0.3 A new way to define environments
269
270(/usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty
271Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list
272)
273\@envbody=\toks28
274)
275(/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty
276Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW)
277\etb@tempcnta=\count197
278)
279\tcb@titlebox=\box54
280\tcb@upperbox=\box55
281\tcb@lowerbox=\box56
282\tcb@phantombox=\box57
283\c@tcbbreakpart=\count198
284\c@tcblayer=\count199
285\c@tcolorbox@number=\count266
286\tcb@temp=\box58
287\tcb@temp=\box59
288\tcb@temp=\box60
289\tcb@temp=\box61
290\tcb@out=\write4
291\tcb@record@out=\write5
292
293(/usr/share/texmf-dist/tex/latex/tcolorbox/tcbbreakable.code.tex
294Library (tcolorbox): 'tcbbreakable.code.tex' version '4.42'
295(/usr/share/texmf-dist/tex/generic/oberdiek/pdfcol.sty
296Package: pdfcol 2019/12/29 v1.6 Handle new color stacks for pdfTeX (HO)
297
298(/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
299Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO)
300)
301(/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty
302Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO)
303)
304(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty
305Package: iftex 2020/03/06 v1.0d TeX engine tests
306))
307Package pdfcol Info: New color stack `tcb@breakable' = 1 on input line 23.
308\tcb@testbox=\box62
309\tcb@totalupperbox=\box63
310\tcb@totallowerbox=\box64
311))
312(/usr/share/texmf-dist/tex/latex/parskip/parskip.sty
313Package: parskip 2020-06-15 v2.0f non-zero parskip adjustments
314
315(/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty
316Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO)
317
318(/usr/share/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
319Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO)
320)))
321(/usr/share/texmf-dist/tex/latex/base/fontenc.sty
322Package: fontenc 2020/08/10 v2.0s Standard LaTeX package
323)
324(/usr/share/texmf-dist/tex/latex/psnfss/mathpazo.sty
325Package: mathpazo 2020/03/25 PSNFSS-v9.3 Palatino w/ Pazo Math (D.Puga, WaS)
326\symupright=\mathgroup4
327)
328(/usr/share/texmf-dist/tex/latex/caption/caption.sty
329Package: caption 2020/10/26 v3.5g Customizing captions (AR)
330
331(/usr/share/texmf-dist/tex/latex/caption/caption3.sty
332Package: caption3 2020/10/21 v2.2e caption3 kernel (AR)
333\captionmargin=\dimen180
334\captionmargin@=\dimen181
335\captionwidth=\dimen182
336\caption@tempdima=\dimen183
337\caption@indent=\dimen184
338\caption@parindent=\dimen185
339\caption@hangindent=\dimen186
340Package caption Info: Standard document class detected.
341)
342\c@caption@flags=\count267
343\c@continuedfloat=\count268
344)
345(/usr/share/texmf-dist/tex/latex/adjustbox/adjustbox.sty
346Package: adjustbox 2020/08/19 v1.3 Adjusting TeX boxes (trim, clip, ...)
347
348(/usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty
349Package: xkeyval 2020/11/20 v2.8 package option processing (HA)
350
351(/usr/share/texmf-dist/tex/generic/xkeyval/xkeyval.tex
352(/usr/share/texmf-dist/tex/generic/xkeyval/xkvutils.tex
353\XKV@toks=\toks29
354\XKV@tempa@toks=\toks30
355)
356\XKV@depth=\count269
357File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA)
358))
359(/usr/share/texmf-dist/tex/latex/adjustbox/adjcalc.sty
360Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back
361-ends (calc, etex, pgfmath)
362)
363(/usr/share/texmf-dist/tex/latex/adjustbox/trimclip.sty
364Package: trimclip 2020/08/19 v1.2 Trim and clip general TeX material
365
366(/usr/share/texmf-dist/tex/latex/collectbox/collectbox.sty
367Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes
368\collectedbox=\box65
369)
370\tc@llx=\dimen187
371\tc@lly=\dimen188
372\tc@urx=\dimen189
373\tc@ury=\dimen190
374Package trimclip Info: Using driver 'tc-pdftex.def'.
375
376(/usr/share/texmf-dist/tex/latex/adjustbox/tc-pdftex.def
377File: tc-pdftex.def 2019/01/04 v2.2 Clipping driver for pdftex
378))
379\adjbox@Width=\dimen191
380\adjbox@Height=\dimen192
381\adjbox@Depth=\dimen193
382\adjbox@Totalheight=\dimen194
383\adjbox@pwidth=\dimen195
384\adjbox@pheight=\dimen196
385\adjbox@pdepth=\dimen197
386\adjbox@ptotalheight=\dimen198
387
388(/usr/share/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty
389Package: ifoddpage 2016/04/23 v1.1 Conditionals for odd/even page detection
390\c@checkoddpage=\count270
391)
392(/usr/share/texmf-dist/tex/latex/varwidth/varwidth.sty
393Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages
394\@vwid@box=\box66
395\sift@deathcycles=\count271
396\@vwid@loff=\dimen199
397\@vwid@roff=\dimen256
398))
399(/usr/share/texmf-dist/tex/latex/float/float.sty
400Package: float 2001/11/08 v1.3d Float enhancements (AL)
401\c@float@type=\count272
402\float@exts=\toks31
403\float@box=\box67
404\@float@everytoks=\toks32
405\@floatcapt=\box68
406)
407(/usr/share/texmf-dist/tex/latex/tools/enumerate.sty
408Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC)
409\@enLab=\toks33
410)
411(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty
412Package: geometry 2020/01/02 v5.9 Page Geometry
413
414(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty
415Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
416)
417\Gm@cnth=\count273
418\Gm@cntv=\count274
419\c@Gm@tempcnt=\count275
420\Gm@bindingoffset=\dimen257
421\Gm@wd@mp=\dimen258
422\Gm@odd@mp=\dimen259
423\Gm@even@mp=\dimen260
424\Gm@layoutwidth=\dimen261
425\Gm@layoutheight=\dimen262
426\Gm@layouthoffset=\dimen263
427\Gm@layoutvoffset=\dimen264
428\Gm@dimlist=\toks34
429)
430(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty
431Package: amsmath 2020/09/23 v2.17i AMS math features
432\@mathmargin=\skip49
433
434For additional information on amsmath, use the `?' option.
435(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty
436Package: amstext 2000/06/29 v2.01 AMS text
437
438(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty
439File: amsgen.sty 1999/11/30 v2.0 generic functions
440\@emptytoks=\toks35
441\ex@=\dimen265
442))
443(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty
444Package: amsbsy 1999/11/29 v1.2d Bold Symbols
445\pmbraise@=\dimen266
446)
447(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty
448Package: amsopn 2016/03/08 v2.02 operator names
449)
450\inf@bad=\count276
451LaTeX Info: Redefining \frac on input line 234.
452\uproot@=\count277
453\leftroot@=\count278
454LaTeX Info: Redefining \overline on input line 399.
455\classnum@=\count279
456\DOTSCASE@=\count280
457LaTeX Info: Redefining \ldots on input line 496.
458LaTeX Info: Redefining \dots on input line 499.
459LaTeX Info: Redefining \cdots on input line 620.
460\Mathstrutbox@=\box69
461\strutbox@=\box70
462\big@size=\dimen267
463LaTeX Font Info: Redeclaring font encoding OML on input line 743.
464LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
465\macc@depth=\count281
466\c@MaxMatrixCols=\count282
467\dotsspace@=\muskip16
468\c@parentequation=\count283
469\dspbrk@lvl=\count284
470\tag@help=\toks36
471\row@=\count285
472\column@=\count286
473\maxfields@=\count287
474\andhelp@=\toks37
475\eqnshift@=\dimen268
476\alignsep@=\dimen269
477\tagshift@=\dimen270
478\tagwidth@=\dimen271
479\totwidth@=\dimen272
480\lineht@=\dimen273
481\@envbody=\toks38
482\multlinegap=\skip50
483\multlinetaggap=\skip51
484\mathdisplay@stack=\toks39
485LaTeX Info: Redefining \[ on input line 2923.
486LaTeX Info: Redefining \] on input line 2924.
487)
488(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty
489Package: amssymb 2013/01/14 v3.01 AMS font symbols
490
491(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty
492Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
493\symAMSa=\mathgroup5
494\symAMSb=\mathgroup6
495LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
496LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
497(Font) U/euf/m/n --> U/euf/b/n on input line 106.
498))
499(/usr/share/texmf-dist/tex/latex/base/textcomp.sty
500Package: textcomp 2020/02/02 v2.0n Standard LaTeX package
501)
502(/usr/share/texmf-dist/tex/latex/upquote/upquote.sty
503Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba
504tim
505)
506(/usr/share/texmf-dist/tex/latex/eurosym/eurosym.sty
507Package: eurosym 1998/08/06 v1.1 European currency symbol ``Euro''
508\@eurobox=\box71
509)
510(/usr/share/texmf-dist/tex/latex/ucs/ucs.sty
511Package: ucs 2013/05/11 v2.2 UCS: Unicode input support
512
513(/usr/share/texmf-dist/tex/latex/ucs/data/uni-global.def
514File: uni-global.def 2013/05/13 UCS: Unicode global data
515)
516\uc@secondtry=\count288
517\uc@combtoks=\toks40
518\uc@combtoksb=\toks41
519\uc@temptokena=\toks42
520)
521(/usr/share/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty
522Package: fancyvrb 2020/05/03 v3.6 verbatim text (tvz,hv)
523\FV@CodeLineNo=\count289
524\FV@InFile=\read4
525\FV@TabBox=\box72
526\c@FancyVerbLine=\count290
527\FV@StepNumber=\count291
528\FV@OutFile=\write6
529)
530(/usr/share/texmf-dist/tex/latex/grffile/grffile.sty
531Package: grffile 2019/11/11 v2.1 Extended file name support for graphics (legac
532y)
533Package grffile Info: This package is an empty stub for compatibility on input
534line 40.
535)
536(/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty
537Package: hyperref 2020-05-15 v7.00e Hypertext links for LaTeX
538
539(/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
540Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO
541)
542Package pdftexcmds Info: \pdf@primitive is available.
543Package pdftexcmds Info: \pdf@ifprimitive is available.
544Package pdftexcmds Info: \pdfdraftmode found.
545)
546(/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
547Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO)
548)
549(/usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty
550Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO)
551)
552(/usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty
553Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO)
554)
555(/usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
556Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO)
557)
558(/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty
559Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO)
560)
561\@linkdim=\dimen274
562\Hy@linkcounter=\count292
563\Hy@pagecounter=\count293
564
565(/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def
566File: pd1enc.def 2020-05-15 v7.00e Hyperref: PDFDocEncoding definition (HO)
567Now handling font encoding PD1 ...
568... no UTF-8 mapping file for font encoding PD1
569)
570(/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty
571Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO)
572)
573(/usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty
574Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO)
575)
576\Hy@SavedSpaceFactor=\count294
577Package hyperref Info: Hyper figures OFF on input line 4464.
578Package hyperref Info: Link nesting OFF on input line 4469.
579Package hyperref Info: Hyper index ON on input line 4472.
580Package hyperref Info: Plain pages OFF on input line 4479.
581Package hyperref Info: Backreferencing OFF on input line 4484.
582Package hyperref Info: Implicit mode ON; LaTeX internals redefined.
583Package hyperref Info: Bookmarks ON on input line 4717.
584\c@Hy@tempcnt=\count295
585
586(/usr/share/texmf-dist/tex/latex/url/url.sty
587\Urlmuskip=\muskip17
588Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
589)
590LaTeX Info: Redefining \url on input line 5076.
591\XeTeXLinkMargin=\dimen275
592
593(/usr/share/texmf-dist/tex/generic/bitset/bitset.sty
594Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO)
595
596(/usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
597Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO
598)
599))
600\Fld@menulength=\count296
601\Field@Width=\dimen276
602\Fld@charsize=\dimen277
603Package hyperref Info: Hyper figures OFF on input line 6347.
604Package hyperref Info: Link nesting OFF on input line 6352.
605Package hyperref Info: Hyper index ON on input line 6355.
606Package hyperref Info: backreferencing OFF on input line 6362.
607Package hyperref Info: Link coloring OFF on input line 6367.
608Package hyperref Info: Link coloring with OCG OFF on input line 6372.
609Package hyperref Info: PDF/A mode OFF on input line 6377.
610LaTeX Info: Redefining \ref on input line 6417.
611LaTeX Info: Redefining \pageref on input line 6421.
612
613(/usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty
614Package: atbegshi-ltx 2020/08/17 v1.0a Emulation of the original atbegshi packa
615ge
616with kernel methods
617)
618\Hy@abspage=\count297
619\c@Item=\count298
620\c@Hfootnote=\count299
621)
622Package hyperref Info: Driver (autodetected): hpdftex.
623
624(/usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def
625File: hpdftex.def 2020-05-15 v7.00e Hyperref driver for pdfTeX
626
627(/usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty
628Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atvery packag
629e
630with kernel methods
631)
632\Fld@listcount=\count300
633\c@bookmark@seq@number=\count301
634
635(/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
636Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO)
637
638(/usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
639Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO)
640)
641Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2
64286.
643)
644\Hy@SectionHShift=\skip52
645)
646(/usr/share/texmf-dist/tex/latex/titling/titling.sty
647Package: titling 2009/09/04 v2.1d maketitle typesetting
648\thanksmarkwidth=\skip53
649\thanksmargin=\skip54
650\droptitle=\skip55
651)
652(/usr/share/texmf-dist/tex/latex/tools/longtable.sty
653Package: longtable 2020/01/07 v4.13 Multi-page Table package (DPC)
654\LTleft=\skip56
655\LTright=\skip57
656\LTpre=\skip58
657\LTpost=\skip59
658\LTchunksize=\count302
659\LTcapwidth=\dimen278
660\LT@head=\box73
661\LT@firsthead=\box74
662\LT@foot=\box75
663\LT@lastfoot=\box76
664\LT@cols=\count303
665\LT@rows=\count304
666\c@LT@tables=\count305
667\c@LT@chunks=\count306
668\LT@p@ftn=\toks43
669)
670(/usr/share/texmf-dist/tex/latex/booktabs/booktabs.sty
671Package: booktabs 2020/01/12 v1.61803398 Publication quality tables
672\heavyrulewidth=\dimen279
673\lightrulewidth=\dimen280
674\cmidrulewidth=\dimen281
675\belowrulesep=\dimen282
676\belowbottomsep=\dimen283
677\aboverulesep=\dimen284
678\abovetopsep=\dimen285
679\cmidrulesep=\dimen286
680\cmidrulekern=\dimen287
681\defaultaddspace=\dimen288
682\@cmidla=\count307
683\@cmidlb=\count308
684\@aboverulesep=\dimen289
685\@belowrulesep=\dimen290
686\@thisruleclass=\count309
687\@lastruleclass=\count310
688\@thisrulewidth=\dimen291
689)
690(/usr/share/texmf-dist/tex/latex/enumitem/enumitem.sty
691Package: enumitem 2019/06/20 v3.9 Customized lists
692\labelindent=\skip60
693\enit@outerparindent=\dimen292
694\enit@toks=\toks44
695\enit@inbox=\box77
696\enit@count@id=\count311
697\enitdp@description=\count312
698)
699(/usr/share/texmf-dist/tex/generic/ulem/ulem.sty
700\UL@box=\box78
701\UL@hyphenbox=\box79
702\UL@skip=\skip61
703\UL@hook=\toks45
704\UL@height=\dimen293
705\UL@pe=\count313
706\UL@pixel=\dimen294
707\ULC@box=\box80
708Package: ulem 2019/11/18
709\ULdepth=\dimen295
710)
711(/usr/share/texmf-dist/tex/latex/jknapltx/mathrsfs.sty
712Package: mathrsfs 1996/01/01 Math RSFS package v1.0 (jk)
713\symrsfs=\mathgroup7
714)
715\Wrappedcontinuationbox=\box81
716\Wrappedvisiblespacebox=\box82
717Package hyperref Info: Option `breaklinks' set `true' on input line 361.
718Package hyperref Info: Option `colorlinks' set `true' on input line 361.
719LaTeX Font Info: Trying to load font information for T1+ppl on input line 36
7208.
721
722(/usr/share/texmf-dist/tex/latex/psnfss/t1ppl.fd
723File: t1ppl.fd 2001/06/04 font definitions for T1/ppl.
724)
725(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
726File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX)
727\l__kernel_color_stack_int=\count314
728\l__pdf_internal_box=\box83
729)
730(./9-SageLatex.aux)
731\openout1 = `9-SageLatex.aux'.
732
733LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 368.
734LaTeX Font Info: ... okay on input line 368.
735LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 368.
736LaTeX Font Info: ... okay on input line 368.
737LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 368.
738LaTeX Font Info: ... okay on input line 368.
739LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 368.
740LaTeX Font Info: ... okay on input line 368.
741LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 368.
742LaTeX Font Info: ... okay on input line 368.
743LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 368.
744LaTeX Font Info: ... okay on input line 368.
745LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 368.
746LaTeX Font Info: ... okay on input line 368.
747LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 368.
748LaTeX Font Info: ... okay on input line 368.
749 (/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
750[Loading MPS to PDF converter (version 2006.09.02).]
751\scratchcounter=\count315
752\scratchdimen=\dimen296
753\scratchbox=\box84
754\nofMPsegments=\count316
755\nofMParguments=\count317
756\everyMPshowfont=\toks46
757\MPscratchCnt=\count318
758\MPscratchDim=\dimen297
759\MPnumerator=\count319
760\makeMPintoPDFobject=\count320
761\everyMPtoPDFconversion=\toks47
762) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
763Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
764Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
76585.
766
767(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
768File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
769e
770))
771Package caption Info: Begin \AtBeginDocument code.
772Package caption Info: float package is loaded.
773Package caption Info: hyperref package is loaded.
774Package caption Info: longtable package is loaded.
775
776(/usr/share/texmf-dist/tex/latex/caption/ltcaption.sty
777Package: ltcaption 2020/05/30 v1.4b longtable captions (AR)
778)
779Package caption Info: End \AtBeginDocument code.
780
781*geometry* driver: auto-detecting
782*geometry* detected driver: pdftex
783*geometry* verbose mode - [ preamble ] result:
784* driver: pdftex
785* paper: <default>
786* layout: <same size as paper>
787* layoutoffset:(h,v)=(0.0pt,0.0pt)
788* modes:
789* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt)
790* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt)
791* \paperwidth=614.295pt
792* \paperheight=794.96999pt
793* \textwidth=469.75502pt
794* \textheight=650.43001pt
795* \oddsidemargin=0.0pt
796* \evensidemargin=0.0pt
797* \topmargin=-37.0pt
798* \headheight=12.0pt
799* \headsep=25.0pt
800* \topskip=11.0pt
801* \footskip=30.0pt
802* \marginparwidth=59.0pt
803* \marginparsep=10.0pt
804* \columnsep=10.0pt
805* \skip\footins=10.0pt plus 4.0pt minus 2.0pt
806* \hoffset=0.0pt
807* \voffset=0.0pt
808* \mag=1000
809* \@twocolumnfalse
810* \@twosidefalse
811* \@mparswitchfalse
812* \@reversemarginfalse
813* (1in=72.27pt=25.4mm, 1cm=28.453pt)
814
815(/usr/share/texmf-dist/tex/latex/ucs/ucsencs.def
816File: ucsencs.def 2011/01/21 Fixes to fontencodings LGR, T3
817)
818Package hyperref Info: Link coloring ON on input line 368.
819
820(/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty
821Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section
822
823(/usr/share/texmf-dist/tex/latex/refcount/refcount.sty
824Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO)
825)
826(/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
827Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO)
828)
829\c@section@level=\count321
830)
831LaTeX Info: Redefining \ref on input line 368.
832LaTeX Info: Redefining \pageref on input line 368.
833LaTeX Info: Redefining \nameref on input line 368.
834
835(./9-SageLatex.out) (./9-SageLatex.out)
836\@outlinefile=\write7
837\openout7 = `9-SageLatex.out'.
838
839LaTeX Font Info: Trying to load font information for OT1+ppl on input line 3
84070.
841
842(/usr/share/texmf-dist/tex/latex/psnfss/ot1ppl.fd
843File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl.
844)
845LaTeX Font Info: Trying to load font information for OML+zplm on input line
846370.
847
848(/usr/share/texmf-dist/tex/latex/psnfss/omlzplm.fd
849File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm.
850)
851LaTeX Font Info: Trying to load font information for OMS+zplm on input line
852370.
853
854(/usr/share/texmf-dist/tex/latex/psnfss/omszplm.fd
855File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm.
856)
857LaTeX Font Info: Trying to load font information for OMX+zplm on input line
858370.
859
860(/usr/share/texmf-dist/tex/latex/psnfss/omxzplm.fd
861File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm.
862)
863LaTeX Font Info: Trying to load font information for OT1+zplm on input line
864370.
865
866(/usr/share/texmf-dist/tex/latex/psnfss/ot1zplm.fd
867File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm.
868)
869LaTeX Font Info: Font shape `U/msa/m/n' will be
870(Font) scaled to size 12.50409pt on input line 370.
871LaTeX Font Info: Font shape `U/msa/m/n' will be
872(Font) scaled to size 9.37807pt on input line 370.
873LaTeX Font Info: Font shape `U/msa/m/n' will be
874(Font) scaled to size 7.29405pt on input line 370.
875LaTeX Font Info: Font shape `U/msb/m/n' will be
876(Font) scaled to size 12.50409pt on input line 370.
877LaTeX Font Info: Font shape `U/msb/m/n' will be
878(Font) scaled to size 9.37807pt on input line 370.
879LaTeX Font Info: Font shape `U/msb/m/n' will be
880(Font) scaled to size 7.29405pt on input line 370.
881LaTeX Font Info: Trying to load font information for U+rsfs on input line 37
8820.
883
884(/usr/share/texmf-dist/tex/latex/jknapltx/ursfs.fd
885File: ursfs.fd 1998/03/24 rsfs font definition file (jk)
886)
887LaTeX Font Info: Trying to load font information for T1+cmtt on input line 3
88870.
889
890(/usr/share/texmf-dist/tex/latex/base/t1cmtt.fd
891File: t1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions
892)
893LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <14.4> not available
894(Font) Font shape `T1/cmtt/m/n' tried instead on input line 386.
895LaTeX Font Info: Font shape `U/msa/m/n' will be
896(Font) scaled to size 6.25204pt on input line 402.
897LaTeX Font Info: Font shape `U/msa/m/n' will be
898(Font) scaled to size 5.21004pt on input line 402.
899LaTeX Font Info: Font shape `U/msb/m/n' will be
900(Font) scaled to size 6.25204pt on input line 402.
901LaTeX Font Info: Font shape `U/msb/m/n' will be
902(Font) scaled to size 5.21004pt on input line 402.
903LaTeX Font Info: Font shape `U/msa/m/n' will be
904(Font) scaled to size 11.40997pt on input line 418.
905LaTeX Font Info: Font shape `U/msa/m/n' will be
906(Font) scaled to size 8.33606pt on input line 418.
907LaTeX Font Info: Font shape `U/msb/m/n' will be
908(Font) scaled to size 11.40997pt on input line 418.
909LaTeX Font Info: Font shape `U/msb/m/n' will be
910(Font) scaled to size 8.33606pt on input line 418.
911 [1
912
913{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
914LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <10.95> not available
915(Font) Font shape `T1/cmtt/m/n' tried instead on input line 473.
916LaTeX Font Info: Trying to load font information for TS1+cmtt on input line
917517.
918 (/usr/share/texmf-dist/tex/latex/base/ts1cmtt.fd
919File: ts1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions
920) [2] [3] [4] (./9-SageLatex.aux)
921Package rerunfilecheck Info: File `9-SageLatex.out' has not changed.
922(rerunfilecheck) Checksum: A41656EED8025F02B8135E03FFA75587;350.
923
924
925LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.
926
927 )
928Here is how much of TeX's memory you used:
929 21220 strings out of 479383
930 386846 string characters out of 5875798
931 697645 words of memory out of 5000000
932 37852 multiletter control sequences out of 15000+600000
933 439695 words of font info for 120 fonts, out of 8000000 for 9000
934 1141 hyphenation exceptions out of 8191
935 107i,8n,111p,504b,595s stack positions out of 5000i,500n,10000p,200000b,80000s
936{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}{/usr/share/
937texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc}{/usr/share/texmf-dist/font
938s/enc/dvips/base/8r.enc}</usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/c
939mex10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr
940/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-d
941ist/fonts/type1/public/mathpazo/fplmri.pfb></usr/share/texmf-dist/fonts/type1/p
942ublic/cm-super/sfit1095.pfb></usr/share/texmf-dist/fonts/type1/public/cm-super/
943sftt1095.pfb></usr/share/texmf-dist/fonts/type1/public/cm-super/sftt1200.pfb></
944usr/share/texmf-dist/fonts/type1/public/cm-super/sftt1440.pfb></usr/share/texmf
945-dist/fonts/type1/urw/palatino/uplb8a.pfb></usr/share/texmf-dist/fonts/type1/ur
946w/palatino/uplr8a.pfb></usr/share/texmf-dist/fonts/type1/urw/palatino/uplri8a.p
947fb>
948Output written on 9-SageLatex.pdf (4 pages, 183997 bytes).
949PDF statistics:
950 122 PDF objects out of 1000 (max. 8388607)
951 103 compressed objects within 2 object streams
952 17 named destinations out of 1000 (max. 500000)
953 61 words of extra memory for PDF output out of 10000 (max. 10000000)
954
diff --git a/src/Lecture6/notebook/9-SageLatex.out b/src/Lecture6/notebook/9-SageLatex.out
new file mode 100644
index 0000000..34ef397
--- /dev/null
+++ b/src/Lecture6/notebook/9-SageLatex.out
@@ -0,0 +1,6 @@
1\BOOKMARK [1][-]{section.1}{The show\(\) command}{}% 1
2\BOOKMARK [1][-]{section.2}{The latex\(\) command}{}% 2
3\BOOKMARK [2][-]{subsection.2.1}{A Latex name for your variables}{section.2}% 3
4\BOOKMARK [1][-]{section.3}{From Jupyter to Latex}{}% 4
5\BOOKMARK [1][-]{section.4}{SageTex}{}% 5
6\BOOKMARK [1][-]{section.5}{The Latex listings package}{}% 6
diff --git a/src/Lecture6/notebook/9-SageLatex.pdf b/src/Lecture6/notebook/9-SageLatex.pdf
new file mode 100644
index 0000000..3f81775
--- /dev/null
+++ b/src/Lecture6/notebook/9-SageLatex.pdf
Binary files differ
diff --git a/src/Lecture6/notebook/9-SageLatex.tex b/src/Lecture6/notebook/9-SageLatex.tex
new file mode 100644
index 0000000..ad59b25
--- /dev/null
+++ b/src/Lecture6/notebook/9-SageLatex.tex
@@ -0,0 +1,634 @@
1\documentclass[11pt]{article}
2
3 \usepackage[breakable]{tcolorbox}
4 \usepackage{parskip} % Stop auto-indenting (to mimic markdown behaviour)
5
6 \usepackage{iftex}
7 \ifPDFTeX
8 \usepackage[T1]{fontenc}
9 \usepackage{mathpazo}
10 \else
11 \usepackage{fontspec}
12 \fi
13
14 % Basic figure setup, for now with no caption control since it's done
15 % automatically by Pandoc (which extracts ![](path) syntax from Markdown).
16 \usepackage{graphicx}
17 % Maintain compatibility with old templates. Remove in nbconvert 6.0
18 \let\Oldincludegraphics\includegraphics
19 % Ensure that by default, figures have no caption (until we provide a
20 % proper Figure object with a Caption API and a way to capture that
21 % in the conversion process - todo).
22 \usepackage{caption}
23 \DeclareCaptionFormat{nocaption}{}
24 \captionsetup{format=nocaption,aboveskip=0pt,belowskip=0pt}
25
26 \usepackage[Export]{adjustbox} % Used to constrain images to a maximum size
27 \adjustboxset{max size={0.9\linewidth}{0.9\paperheight}}
28 \usepackage{float}
29 \floatplacement{figure}{H} % forces figures to be placed at the correct location
30 \usepackage{xcolor} % Allow colors to be defined
31 \usepackage{enumerate} % Needed for markdown enumerations to work
32 \usepackage{geometry} % Used to adjust the document margins
33 \usepackage{amsmath} % Equations
34 \usepackage{amssymb} % Equations
35 \usepackage{textcomp} % defines textquotesingle
36 % Hack from http://tex.stackexchange.com/a/47451/13684:
37 \AtBeginDocument{%
38 \def\PYZsq{\textquotesingle}% Upright quotes in Pygmentized code
39 }
40 \usepackage{upquote} % Upright quotes for verbatim code
41 \usepackage{eurosym} % defines \euro
42 \usepackage[mathletters]{ucs} % Extended unicode (utf-8) support
43 \usepackage{fancyvrb} % verbatim replacement that allows latex
44 \usepackage{grffile} % extends the file name processing of package graphics
45 % to support a larger range
46 \makeatletter % fix for grffile with XeLaTeX
47 \def\Gread@@xetex#1{%
48 \IfFileExists{"\Gin@base".bb}%
49 {\Gread@eps{\Gin@base.bb}}%
50 {\Gread@@xetex@aux#1}%
51 }
52 \makeatother
53
54 % The hyperref package gives us a pdf with properly built
55 % internal navigation ('pdf bookmarks' for the table of contents,
56 % internal cross-reference links, web links for URLs, etc.)
57 \usepackage{hyperref}
58 % The default LaTeX title has an obnoxious amount of whitespace. By default,
59 % titling removes some of it. It also provides customization options.
60 \usepackage{titling}
61 \usepackage{longtable} % longtable support required by pandoc >1.10
62 \usepackage{booktabs} % table support for pandoc > 1.12.2
63 \usepackage[inline]{enumitem} % IRkernel/repr support (it uses the enumerate* environment)
64 \usepackage[normalem]{ulem} % ulem is needed to support strikethroughs (\sout)
65 % normalem makes italics be italics, not underlines
66 \usepackage{mathrsfs}
67
68
69
70 % Colors for the hyperref package
71 \definecolor{urlcolor}{rgb}{0,.145,.698}
72 \definecolor{linkcolor}{rgb}{.71,0.21,0.01}
73 \definecolor{citecolor}{rgb}{.12,.54,.11}
74
75 % ANSI colors
76 \definecolor{ansi-black}{HTML}{3E424D}
77 \definecolor{ansi-black-intense}{HTML}{282C36}
78 \definecolor{ansi-red}{HTML}{E75C58}
79 \definecolor{ansi-red-intense}{HTML}{B22B31}
80 \definecolor{ansi-green}{HTML}{00A250}
81 \definecolor{ansi-green-intense}{HTML}{007427}
82 \definecolor{ansi-yellow}{HTML}{DDB62B}
83 \definecolor{ansi-yellow-intense}{HTML}{B27D12}
84 \definecolor{ansi-blue}{HTML}{208FFB}
85 \definecolor{ansi-blue-intense}{HTML}{0065CA}
86 \definecolor{ansi-magenta}{HTML}{D160C4}
87 \definecolor{ansi-magenta-intense}{HTML}{A03196}
88 \definecolor{ansi-cyan}{HTML}{60C6C8}
89 \definecolor{ansi-cyan-intense}{HTML}{258F8F}
90 \definecolor{ansi-white}{HTML}{C5C1B4}
91 \definecolor{ansi-white-intense}{HTML}{A1A6B2}
92 \definecolor{ansi-default-inverse-fg}{HTML}{FFFFFF}
93 \definecolor{ansi-default-inverse-bg}{HTML}{000000}
94
95 % commands and environments needed by pandoc snippets
96 % extracted from the output of `pandoc -s`
97 \providecommand{\tightlist}{%
98 \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
99 \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}}
100 % Add ',fontsize=\small' for more characters per line
101 \newenvironment{Shaded}{}{}
102 \newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}}
103 \newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{{#1}}}
104 \newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}}
105 \newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}}
106 \newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}}
107 \newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}}
108 \newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}}
109 \newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{{#1}}}}
110 \newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{{#1}}}
111 \newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}}
112 \newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{{#1}}}
113 \newcommand{\RegionMarkerTok}[1]{{#1}}
114 \newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}}
115 \newcommand{\NormalTok}[1]{{#1}}
116
117 % Additional commands for more recent versions of Pandoc
118 \newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{{#1}}}
119 \newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}}
120 \newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}}
121 \newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{{#1}}}
122 \newcommand{\ImportTok}[1]{{#1}}
123 \newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{{#1}}}}
124 \newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}}
125 \newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}}
126 \newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{{#1}}}
127 \newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}}
128 \newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{{#1}}}
129 \newcommand{\BuiltInTok}[1]{{#1}}
130 \newcommand{\ExtensionTok}[1]{{#1}}
131 \newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{{#1}}}
132 \newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{{#1}}}
133 \newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}}
134 \newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}}
135
136
137 % Define a nice break command that doesn't care if a line doesn't already
138 % exist.
139 \def\br{\hspace*{\fill} \\* }
140 % Math Jax compatibility definitions
141 \def\gt{>}
142 \def\lt{<}
143 \let\Oldtex\TeX
144 \let\Oldlatex\LaTeX
145 \renewcommand{\TeX}{\textrm{\Oldtex}}
146 \renewcommand{\LaTeX}{\textrm{\Oldlatex}}
147 % Document parameters
148 % Document title
149 \title{Sage and Latex interaction}
150 \author{Sebastiano Tronto - \texttt{sebastiano.tronto@uni.lu}}
151 \date{2021-05-07}
152
153
154
155
156
157% Pygments definitions
158\makeatletter
159\def\PY@reset{\let\PY@it=\relax \let\PY@bf=\relax%
160 \let\PY@ul=\relax \let\PY@tc=\relax%
161 \let\PY@bc=\relax \let\PY@ff=\relax}
162\def\PY@tok#1{\csname PY@tok@#1\endcsname}
163\def\PY@toks#1+{\ifx\relax#1\empty\else%
164 \PY@tok{#1}\expandafter\PY@toks\fi}
165\def\PY@do#1{\PY@bc{\PY@tc{\PY@ul{%
166 \PY@it{\PY@bf{\PY@ff{#1}}}}}}}
167\def\PY#1#2{\PY@reset\PY@toks#1+\relax+\PY@do{#2}}
168
169\expandafter\def\csname PY@tok@w\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}}
170\expandafter\def\csname PY@tok@c\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
171\expandafter\def\csname PY@tok@cp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.74,0.48,0.00}{##1}}}
172\expandafter\def\csname PY@tok@k\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
173\expandafter\def\csname PY@tok@kp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
174\expandafter\def\csname PY@tok@kt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}}
175\expandafter\def\csname PY@tok@o\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
176\expandafter\def\csname PY@tok@ow\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}}
177\expandafter\def\csname PY@tok@nb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
178\expandafter\def\csname PY@tok@nf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
179\expandafter\def\csname PY@tok@nc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
180\expandafter\def\csname PY@tok@nn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
181\expandafter\def\csname PY@tok@ne\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.82,0.25,0.23}{##1}}}
182\expandafter\def\csname PY@tok@nv\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
183\expandafter\def\csname PY@tok@no\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}}
184\expandafter\def\csname PY@tok@nl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.63,0.00}{##1}}}
185\expandafter\def\csname PY@tok@ni\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}}
186\expandafter\def\csname PY@tok@na\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.49,0.56,0.16}{##1}}}
187\expandafter\def\csname PY@tok@nt\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
188\expandafter\def\csname PY@tok@nd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}}
189\expandafter\def\csname PY@tok@s\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
190\expandafter\def\csname PY@tok@sd\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
191\expandafter\def\csname PY@tok@si\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}}
192\expandafter\def\csname PY@tok@se\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.13}{##1}}}
193\expandafter\def\csname PY@tok@sr\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}}
194\expandafter\def\csname PY@tok@ss\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
195\expandafter\def\csname PY@tok@sx\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
196\expandafter\def\csname PY@tok@m\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
197\expandafter\def\csname PY@tok@gh\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}}
198\expandafter\def\csname PY@tok@gu\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}}
199\expandafter\def\csname PY@tok@gd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}}
200\expandafter\def\csname PY@tok@gi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}}
201\expandafter\def\csname PY@tok@gr\endcsname{\def\PY@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}}
202\expandafter\def\csname PY@tok@ge\endcsname{\let\PY@it=\textit}
203\expandafter\def\csname PY@tok@gs\endcsname{\let\PY@bf=\textbf}
204\expandafter\def\csname PY@tok@gp\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}}
205\expandafter\def\csname PY@tok@go\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.53,0.53}{##1}}}
206\expandafter\def\csname PY@tok@gt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}}
207\expandafter\def\csname PY@tok@err\endcsname{\def\PY@bc##1{\setlength{\fboxsep}{0pt}\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}}
208\expandafter\def\csname PY@tok@kc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
209\expandafter\def\csname PY@tok@kd\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
210\expandafter\def\csname PY@tok@kn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
211\expandafter\def\csname PY@tok@kr\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
212\expandafter\def\csname PY@tok@bp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
213\expandafter\def\csname PY@tok@fm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
214\expandafter\def\csname PY@tok@vc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
215\expandafter\def\csname PY@tok@vg\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
216\expandafter\def\csname PY@tok@vi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
217\expandafter\def\csname PY@tok@vm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
218\expandafter\def\csname PY@tok@sa\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
219\expandafter\def\csname PY@tok@sb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
220\expandafter\def\csname PY@tok@sc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
221\expandafter\def\csname PY@tok@dl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
222\expandafter\def\csname PY@tok@s2\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
223\expandafter\def\csname PY@tok@sh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
224\expandafter\def\csname PY@tok@s1\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
225\expandafter\def\csname PY@tok@mb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
226\expandafter\def\csname PY@tok@mf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
227\expandafter\def\csname PY@tok@mh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
228\expandafter\def\csname PY@tok@mi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
229\expandafter\def\csname PY@tok@il\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
230\expandafter\def\csname PY@tok@mo\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
231\expandafter\def\csname PY@tok@ch\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
232\expandafter\def\csname PY@tok@cm\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
233\expandafter\def\csname PY@tok@cpf\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
234\expandafter\def\csname PY@tok@c1\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
235\expandafter\def\csname PY@tok@cs\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
236
237\def\PYZbs{\char`\\}
238\def\PYZus{\char`\_}
239\def\PYZob{\char`\{}
240\def\PYZcb{\char`\}}
241\def\PYZca{\char`\^}
242\def\PYZam{\char`\&}
243\def\PYZlt{\char`\<}
244\def\PYZgt{\char`\>}
245\def\PYZsh{\char`\#}
246\def\PYZpc{\char`\%}
247\def\PYZdl{\char`\$}
248\def\PYZhy{\char`\-}
249\def\PYZsq{\char`\'}
250\def\PYZdq{\char`\"}
251\def\PYZti{\char`\~}
252% for compatibility with earlier versions
253\def\PYZat{@}
254\def\PYZlb{[}
255\def\PYZrb{]}
256\makeatother
257
258
259 % For linebreaks inside Verbatim environment from package fancyvrb.
260 \makeatletter
261 \newbox\Wrappedcontinuationbox
262 \newbox\Wrappedvisiblespacebox
263 \newcommand*\Wrappedvisiblespace {\textcolor{red}{\textvisiblespace}}
264 \newcommand*\Wrappedcontinuationsymbol {\textcolor{red}{\llap{\tiny$\m@th\hookrightarrow$}}}
265 \newcommand*\Wrappedcontinuationindent {3ex }
266 \newcommand*\Wrappedafterbreak {\kern\Wrappedcontinuationindent\copy\Wrappedcontinuationbox}
267 % Take advantage of the already applied Pygments mark-up to insert
268 % potential linebreaks for TeX processing.
269 % {, <, #, %, $, ' and ": go to next line.
270 % _, }, ^, &, >, - and ~: stay at end of broken line.
271 % Use of \textquotesingle for straight quote.
272 \newcommand*\Wrappedbreaksatspecials {%
273 \def\PYGZus{\discretionary{\char`\_}{\Wrappedafterbreak}{\char`\_}}%
274 \def\PYGZob{\discretionary{}{\Wrappedafterbreak\char`\{}{\char`\{}}%
275 \def\PYGZcb{\discretionary{\char`\}}{\Wrappedafterbreak}{\char`\}}}%
276 \def\PYGZca{\discretionary{\char`\^}{\Wrappedafterbreak}{\char`\^}}%
277 \def\PYGZam{\discretionary{\char`\&}{\Wrappedafterbreak}{\char`\&}}%
278 \def\PYGZlt{\discretionary{}{\Wrappedafterbreak\char`\<}{\char`\<}}%
279 \def\PYGZgt{\discretionary{\char`\>}{\Wrappedafterbreak}{\char`\>}}%
280 \def\PYGZsh{\discretionary{}{\Wrappedafterbreak\char`\#}{\char`\#}}%
281 \def\PYGZpc{\discretionary{}{\Wrappedafterbreak\char`\%}{\char`\%}}%
282 \def\PYGZdl{\discretionary{}{\Wrappedafterbreak\char`\$}{\char`\$}}%
283 \def\PYGZhy{\discretionary{\char`\-}{\Wrappedafterbreak}{\char`\-}}%
284 \def\PYGZsq{\discretionary{}{\Wrappedafterbreak\textquotesingle}{\textquotesingle}}%
285 \def\PYGZdq{\discretionary{}{\Wrappedafterbreak\char`\"}{\char`\"}}%
286 \def\PYGZti{\discretionary{\char`\~}{\Wrappedafterbreak}{\char`\~}}%
287 }
288 % Some characters . , ; ? ! / are not pygmentized.
289 % This macro makes them "active" and they will insert potential linebreaks
290 \newcommand*\Wrappedbreaksatpunct {%
291 \lccode`\~`\.\lowercase{\def~}{\discretionary{\hbox{\char`\.}}{\Wrappedafterbreak}{\hbox{\char`\.}}}%
292 \lccode`\~`\,\lowercase{\def~}{\discretionary{\hbox{\char`\,}}{\Wrappedafterbreak}{\hbox{\char`\,}}}%
293 \lccode`\~`\;\lowercase{\def~}{\discretionary{\hbox{\char`\;}}{\Wrappedafterbreak}{\hbox{\char`\;}}}%
294 \lccode`\~`\:\lowercase{\def~}{\discretionary{\hbox{\char`\:}}{\Wrappedafterbreak}{\hbox{\char`\:}}}%
295 \lccode`\~`\?\lowercase{\def~}{\discretionary{\hbox{\char`\?}}{\Wrappedafterbreak}{\hbox{\char`\?}}}%
296 \lccode`\~`\!\lowercase{\def~}{\discretionary{\hbox{\char`\!}}{\Wrappedafterbreak}{\hbox{\char`\!}}}%
297 \lccode`\~`\/\lowercase{\def~}{\discretionary{\hbox{\char`\/}}{\Wrappedafterbreak}{\hbox{\char`\/}}}%
298 \catcode`\.\active
299 \catcode`\,\active
300 \catcode`\;\active
301 \catcode`\:\active
302 \catcode`\?\active
303 \catcode`\!\active
304 \catcode`\/\active
305 \lccode`\~`\~
306 }
307 \makeatother
308
309 \let\OriginalVerbatim=\Verbatim
310 \makeatletter
311 \renewcommand{\Verbatim}[1][1]{%
312 %\parskip\z@skip
313 \sbox\Wrappedcontinuationbox {\Wrappedcontinuationsymbol}%
314 \sbox\Wrappedvisiblespacebox {\FV@SetupFont\Wrappedvisiblespace}%
315 \def\FancyVerbFormatLine ##1{\hsize\linewidth
316 \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@
317 \doublehyphendemerits\z@\finalhyphendemerits\z@
318 \strut ##1\strut}%
319 }%
320 % If the linebreak is at a space, the latter will be displayed as visible
321 % space at end of first line, and a continuation symbol starts next line.
322 % Stretch/shrink are however usually zero for typewriter font.
323 \def\FV@Space {%
324 \nobreak\hskip\z@ plus\fontdimen3\font minus\fontdimen4\font
325 \discretionary{\copy\Wrappedvisiblespacebox}{\Wrappedafterbreak}
326 {\kern\fontdimen2\font}%
327 }%
328
329 % Allow breaks at special characters using \PYG... macros.
330 \Wrappedbreaksatspecials
331 % Breaks at punctuation characters . , ; ? ! and / need catcode=\active
332 \OriginalVerbatim[#1,codes*=\Wrappedbreaksatpunct]%
333 }
334 \makeatother
335
336 % Exact colors from NB
337 \definecolor{incolor}{HTML}{303F9F}
338 \definecolor{outcolor}{HTML}{D84315}
339 \definecolor{cellborder}{HTML}{CFCFCF}
340 \definecolor{cellbackground}{HTML}{F7F7F7}
341
342 % prompt
343 \makeatletter
344 \newcommand{\boxspacing}{\kern\kvtcb@left@rule\kern\kvtcb@boxsep}
345 \makeatother
346 \newcommand{\prompt}[4]{
347 \ttfamily\llap{{\color{#2}[#3]:\hspace{3pt}#4}}\vspace{-\baselineskip}
348 }
349
350
351
352 % Prevent overflowing lines due to hard-to-break entities
353 \sloppy
354 % Setup hyperref package
355 \hypersetup{
356 breaklinks=true, % so long urls are correctly broken across lines
357 colorlinks=true,
358 urlcolor=urlcolor,
359 linkcolor=linkcolor,
360 citecolor=citecolor,
361 }
362 % Slightly bigger margins than the latex defaults
363
364 \geometry{verbose,tmargin=1in,bmargin=1in,lmargin=1in,rmargin=1in}
365
366
367
368\begin{document}
369
370 \maketitle
371
372
373
374
375 It can happen that you need to include the results of your Sage
376computations and/or Sage code inside a LaTeX document. Luckily Sage
377provides some functions to translate its objects into LaTeX, and the
378listings package for LaTeX can be used to include any code (Sage, Python
379or any other language) in a LaTeX document.
380
381In this document we will describe some of these interactions between
382LaTeX and Sage.
383
384 \hypertarget{the-show-command}{%
385\section{\texorpdfstring{The \texttt{show()}
386command}{The show() command}}\label{the-show-command}}
387
388\textbf{Reference:}
389{[}\href{https://doc.sagemath.org/html/en/reference/repl/sage/repl/display/pretty_print.html}{1}{]}
390(\texttt{show()} is just an alternative name for
391\texttt{pretty\_print()}).
392
393With this command Sage will generate a picture displaying the object.
394The result depends on the object itself: most of them will be typeset in
395Latex, but for example graphics primitives (such as plots) will be
396displayed as pictures.
397
398You can see it as an alternative to \texttt{print()}.
399
400 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
401\prompt{In}{incolor}{4}{\boxspacing}
402\begin{Verbatim}[commandchars=\\\{\}]
403\PY{n}{s} \PY{o}{=} \PY{p}{(}\PY{n}{e}\PY{o}{\PYZca{}}\PY{n}{x}\PY{p}{)}\PY{o}{.}\PY{n}{series}\PY{p}{(}\PY{n}{x}\PY{o}{==}\PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{4}\PY{p}{)}
404\PY{n}{M} \PY{o}{=} \PY{n}{matrix}\PY{p}{(}\PY{p}{[}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{]}\PY{p}{,}\PY{p}{[}\PY{l+m+mi}{4}\PY{p}{,}\PY{l+m+mi}{5}\PY{p}{,}\PY{l+m+mi}{6}\PY{p}{]}\PY{p}{,}\PY{p}{[}\PY{l+m+mi}{8}\PY{p}{,}\PY{l+m+mi}{9}\PY{p}{,}\PY{l+m+mi}{10}\PY{p}{]}\PY{p}{]}\PY{p}{)}
405\PY{n+nb}{print}\PY{p}{(}\PY{n}{s}\PY{p}{)}
406\PY{n}{show}\PY{p}{(}\PY{n}{s}\PY{p}{)}
407\PY{n+nb}{print}\PY{p}{(}\PY{n}{M}\PY{p}{)}
408\PY{n}{show}\PY{p}{(}\PY{n}{M}\PY{p}{)}
409\PY{n+nb}{print}\PY{p}{(}\PY{n}{pi}\PY{p}{)}
410\PY{n}{show}\PY{p}{(}\PY{n}{pi}\PY{p}{)}
411\end{Verbatim}
412\end{tcolorbox}
413
414 \begin{Verbatim}[commandchars=\\\{\}]
4151 + 1*x + 1/2*x\^{}2 + 1/6*x\^{}3 + Order(x\^{}4)
416 \end{Verbatim}
417
418 \begin{math}
419\newcommand{\Bold}[1]{\mathbf{#1}}1 + 1 x + \frac{1}{2} x^{2} + \frac{1}{6} x^{3} + \mathcal{O}\left(x^{4}\right)
420\end{math}
421
422
423 \begin{Verbatim}[commandchars=\\\{\}]
424[ 1 2 3]
425[ 4 5 6]
426[ 8 9 10]
427 \end{Verbatim}
428
429 \begin{math}
430\newcommand{\Bold}[1]{\mathbf{#1}}\left(\begin{array}{rrr}
4311 & 2 & 3 \\
4324 & 5 & 6 \\
4338 & 9 & 10
434\end{array}\right)
435\end{math}
436
437
438 \begin{Verbatim}[commandchars=\\\{\}]
439pi
440 \end{Verbatim}
441
442 \begin{math}
443\newcommand{\Bold}[1]{\mathbf{#1}}\pi
444\end{math}
445
446
447 In a Jupyter notebook, the results above are displayed using
448\href{https://www.mathjax.org/}{MathJax}.
449
450If you are running this code in an interactive console (terminal)
451instead of a Jupyter notebook, you will get the Latex source code for
452those objects. You can force this behavior by using the \texttt{latex()}
453command.
454
455 \hypertarget{the-latex-command}{%
456\section{\texorpdfstring{The \texttt{latex()}
457command}{The latex() command}}\label{the-latex-command}}
458
459\textbf{Reference:}
460{[}\href{https://doc.sagemath.org/html/en/reference/misc/sage/misc/latex.html}{2}{]}
461
462This command is potentially very useful if you need to include the
463results of Sage computations in a Latex file, especially with complex
464objects like matrices or very large polynomials.
465
466Technically, this is a function that returns a string, so you need to
467\texttt{print()} it to see the result.
468
469 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
470\prompt{In}{incolor}{5}{\boxspacing}
471\begin{Verbatim}[commandchars=\\\{\}]
472\PY{n+nb}{print}\PY{p}{(}\PY{n}{latex}\PY{p}{(}\PY{n}{s}\PY{p}{)}\PY{p}{)}
473\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+se}{\PYZbs{}n}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}
474\PY{n+nb}{print}\PY{p}{(}\PY{n}{latex}\PY{p}{(}\PY{n}{M}\PY{p}{)}\PY{p}{)}
475\end{Verbatim}
476\end{tcolorbox}
477
478 \begin{Verbatim}[commandchars=\\\{\}]
4791 + 1 x + \textbackslash{}frac\{1\}\{2\} x\^{}\{2\} + \textbackslash{}frac\{1\}\{6\} x\^{}\{3\} + \textbackslash{}mathcal\{O\}\textbackslash{}left(x\^{}\{4\}\textbackslash{}right)
480
481
482\textbackslash{}left(\textbackslash{}begin\{array\}\{rrr\}
4831 \& 2 \& 3 \textbackslash{}\textbackslash{}
4844 \& 5 \& 6 \textbackslash{}\textbackslash{}
4858 \& 9 \& 10
486\textbackslash{}end\{array\}\textbackslash{}right)
487 \end{Verbatim}
488
489 Interestingly, Sage can use matplotlib's PGF backend to generate Latex
490code for a plot. (PGF is the graphics language underlying TikZ, like TeX
491is the language underlying Latex).
492
493 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
494\prompt{In}{incolor}{15}{\boxspacing}
495\begin{Verbatim}[commandchars=\\\{\}]
496\PY{c+c1}{\PYZsh{}latex(plot(x\PYZca{}2)) \PYZsh{} The output is more than 20 pages long}
497\end{Verbatim}
498\end{tcolorbox}
499
500 It is probably easier to just generate the picture and include that in
501your Latex document with \texttt{\textbackslash{}includegraphics}.
502
503 \hypertarget{a-latex-name-for-your-variables}{%
504\subsection{A Latex name for your
505variables}\label{a-latex-name-for-your-variables}}
506
507\textbf{Reference:}
508{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/var.html}{3}{]}
509
510Sometimes you might want to use variables and functions that have, for
511example, a Greek letter as a name. You can tell Sage that you want them
512displayed this way when you declare them:
513
514 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
515\prompt{In}{incolor}{16}{\boxspacing}
516\begin{Verbatim}[commandchars=\\\{\}]
517\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{epsilon}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{n}{latex\PYZus{}name}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+se}{\PYZbs{}\PYZbs{}}\PY{l+s+s2}{varepsilon}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}
518\PY{n}{function}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{phi1}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{n}{latex\PYZus{}name}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+se}{\PYZbs{}\PYZbs{}}\PY{l+s+s2}{phi\PYZus{}1}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}
519
520\PY{n+nb}{print}\PY{p}{(}\PY{n}{phi1}\PY{p}{(}\PY{n}{epsilon}\PY{p}{)}\PY{p}{)}
521\PY{n}{show}\PY{p}{(}\PY{n}{phi1}\PY{p}{(}\PY{n}{epsilon}\PY{p}{)} \PY{o}{+} \PY{n}{e}\PY{o}{\PYZca{}}\PY{n}{epsilon}\PY{p}{)}
522\PY{n}{latex}\PY{p}{(}\PY{n}{phi1}\PY{p}{(}\PY{n}{epsilon}\PY{p}{)} \PY{o}{+} \PY{n}{e}\PY{o}{\PYZca{}}\PY{n}{epsilon}\PY{p}{)}
523\end{Verbatim}
524\end{tcolorbox}
525
526 \begin{Verbatim}[commandchars=\\\{\}]
527phi1(epsilon)
528 \end{Verbatim}
529
530 \begin{math}
531\newcommand{\Bold}[1]{\mathbf{#1}}e^{{\varepsilon}} + \phi_1\left({\varepsilon}\right)
532\end{math}
533
534
535 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
536\prompt{Out}{outcolor}{16}{\boxspacing}
537\begin{Verbatim}[commandchars=\\\{\}]
538e\^{}\{\{\textbackslash{}varepsilon\}\} + \textbackslash{}phi\_1\textbackslash{}left(\{\textbackslash{}varepsilon\}\textbackslash{}right)
539\end{Verbatim}
540\end{tcolorbox}
541
542 \textbf{Warning:} You need to use two backspaces
543\texttt{\textbackslash{}\textbackslash{}}. The reason is that in Python
544(like in many other programming languages) the backslash symbol inside a
545string is used to print special characters, such as a newline
546\texttt{\textbackslash{}n}.
547
548 \hypertarget{from-jupyter-to-latex}{%
549\section{From Jupyter to Latex}\label{from-jupyter-to-latex}}
550
551\textbf{Reference:}
552{[}\href{https://nbconvert.readthedocs.io/en/latest/}{4}{]}
553
554From the Jupyter menu \texttt{File\ \textgreater{}\ Download\ as} you
555can choose to download your work in many formats, among which there are
556also Latex and pdf. Personally I prefer downloading the .tex file, so
557then I can change the title, add an author name and make any other
558change I like before compiling it into a pdf file.
559
560If you choose to download the pdf file, you might need to install some
561extra packages. For example I had to install
562\href{https://pandoc.org/}{\texttt{pandoc}}, \texttt{texlive-XeTeX} and
563\texttt{texlive-Xdvi}, but this depends on your operating system and
564Latex distribution.
565
566 \hypertarget{sagetex}{%
567\section{SageTex}\label{sagetex}}
568
569\textbf{Reference:}
570{[}\href{https://doc.sagemath.org/html/en/tutorial/sagetex.html}{5}{]}
571
572With SageTex it is possible to run Sage commands directly inside Latex,
573using the \texttt{\textbackslash{}sage\{\}} command. In this way you
574don't need to run your Sage code first and then copy the results in
575Latex. It can be useful especially for short Sage commands.
576
577You might need to take some extra steps to make this work on your
578system, see the link above.
579
580 \hypertarget{the-latex-listings-package}{%
581\section{\texorpdfstring{The Latex \texttt{listings}
582package}{The Latex listings package}}\label{the-latex-listings-package}}
583
584\textbf{References:}
585{[}\href{https://en.wikibooks.org/wiki/LaTeX/Source_Code_Listings}{6}{]}
586and
587{[}\href{https://ftp.snt.utwente.nl/pub/software/tex/macros/latex/contrib/listings/listings.pdf}{7}{]}
588
589If you want to include some code (Sage, Python or anything else) in a
590Latex document you can use the listings package.
591
592\begin{verbatim}
593\usepackage{listings}
594
595...
596
597\begin{lstlisting}[language=Python]
598for i in range(0,100):
599 if i%5 == 0:
600 print("Multiple of 5!")
601\end{lstlisting}
602\end{verbatim}
603
604You need to specify the language you are using with the
605\texttt{language=} option. This option can also be set at the beginning
606of the document using the
607\texttt{\textbackslash{}lstset\{language=Python\}} command.
608
609As an alternative, you can include a file directly without copying the
610code into the tex file, like you would do for a picture:
611
612\begin{verbatim}
613\lstinputlisting[language=Python]{file.py}
614\end{verbatim}
615
616It is technically possible to include Latex listings in a markdown cell
617of the Jupyter notebook using
618\href{https://jupyter-contrib-nbextensions.readthedocs.io/en/latest/nbextensions/latex_envs/README.html}{this
619package}, but it does not make much sense. So we will move to a Latex
620editor for the examples.
621
622 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
623\prompt{In}{incolor}{ }{\boxspacing}
624\begin{Verbatim}[commandchars=\\\{\}]
625
626\end{Verbatim}
627\end{tcolorbox}
628
629
630 % Add a bibliography block to the postdoc
631
632
633
634\end{document}
diff --git a/src/Lecture6/notebook/output_75_0.png b/src/Lecture6/notebook/output_75_0.png
new file mode 100644
index 0000000..72089d8
--- /dev/null
+++ b/src/Lecture6/notebook/output_75_0.png
Binary files differ
diff --git a/src/Lecture6/notebook/output_77_0.png b/src/Lecture6/notebook/output_77_0.png
new file mode 100644
index 0000000..28dbdee
--- /dev/null
+++ b/src/Lecture6/notebook/output_77_0.png
Binary files differ
diff --git a/src/Lecture6/notebook/output_80_0.png b/src/Lecture6/notebook/output_80_0.png
new file mode 100644
index 0000000..7009f70
--- /dev/null
+++ b/src/Lecture6/notebook/output_80_0.png
Binary files differ
diff --git a/src/Lecture6/notebook/output_82_0.png b/src/Lecture6/notebook/output_82_0.png
new file mode 100644
index 0000000..d20de74
--- /dev/null
+++ b/src/Lecture6/notebook/output_82_0.png
Binary files differ
diff --git a/src/Lecture6/notebook/output_84_0.png b/src/Lecture6/notebook/output_84_0.png
new file mode 100644
index 0000000..e0508ae
--- /dev/null
+++ b/src/Lecture6/notebook/output_84_0.png
Binary files differ
diff --git a/src/Lecture6/notebook/output_86_0.png b/src/Lecture6/notebook/output_86_0.png
new file mode 100644
index 0000000..a8ddcc5
--- /dev/null
+++ b/src/Lecture6/notebook/output_86_0.png
Binary files differ
diff --git a/src/Lecture6/notebook/output_88_0.png b/src/Lecture6/notebook/output_88_0.png
new file mode 100644
index 0000000..259045d
--- /dev/null
+++ b/src/Lecture6/notebook/output_88_0.png
Binary files differ

Generated with cgit - Back to sebastiano.tronto.net