From d6c61d988bfa4255baf9cdae42db59ebee38363f Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Tue, 25 May 2021 17:10:49 +0200 Subject: Added files --- src/Lecture6/live/8-SageCalculus-modified.ipynb | 1614 ++++++++++++++++++++ .../8-SageCalculus-checkpoint.ipynb | 1372 +++++++++++++++++ .../8-SageCalculus-modified-checkpoint.ipynb | 1614 ++++++++++++++++++++ .../9-SageLatex-checkpoint.ipynb | 339 ++++ src/Lecture6/notebook/8-SageCalculus.aux | 58 + src/Lecture6/notebook/8-SageCalculus.ipynb | 1372 +++++++++++++++++ src/Lecture6/notebook/8-SageCalculus.log | 1106 ++++++++++++++ src/Lecture6/notebook/8-SageCalculus.out | 19 + src/Lecture6/notebook/8-SageCalculus.pdf | Bin 0 -> 323733 bytes src/Lecture6/notebook/8-SageCalculus.tex | 1456 ++++++++++++++++++ src/Lecture6/notebook/9-SageLatex.aux | 32 + src/Lecture6/notebook/9-SageLatex.ipynb | 346 +++++ src/Lecture6/notebook/9-SageLatex.log | 954 ++++++++++++ src/Lecture6/notebook/9-SageLatex.out | 6 + src/Lecture6/notebook/9-SageLatex.pdf | Bin 0 -> 183997 bytes src/Lecture6/notebook/9-SageLatex.tex | 634 ++++++++ src/Lecture6/notebook/output_75_0.png | Bin 0 -> 16225 bytes src/Lecture6/notebook/output_77_0.png | Bin 0 -> 19822 bytes src/Lecture6/notebook/output_80_0.png | Bin 0 -> 20185 bytes src/Lecture6/notebook/output_82_0.png | Bin 0 -> 11723 bytes src/Lecture6/notebook/output_84_0.png | Bin 0 -> 22962 bytes src/Lecture6/notebook/output_86_0.png | Bin 0 -> 21648 bytes src/Lecture6/notebook/output_88_0.png | Bin 0 -> 17372 bytes 23 files changed, 10922 insertions(+) create mode 100644 src/Lecture6/live/8-SageCalculus-modified.ipynb create mode 100644 src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-checkpoint.ipynb create mode 100644 src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-modified-checkpoint.ipynb create mode 100644 src/Lecture6/notebook/.ipynb_checkpoints/9-SageLatex-checkpoint.ipynb create mode 100644 src/Lecture6/notebook/8-SageCalculus.aux create mode 100644 src/Lecture6/notebook/8-SageCalculus.ipynb create mode 100644 src/Lecture6/notebook/8-SageCalculus.log create mode 100644 src/Lecture6/notebook/8-SageCalculus.out create mode 100644 src/Lecture6/notebook/8-SageCalculus.pdf create mode 100644 src/Lecture6/notebook/8-SageCalculus.tex create mode 100644 src/Lecture6/notebook/9-SageLatex.aux create mode 100644 src/Lecture6/notebook/9-SageLatex.ipynb create mode 100644 src/Lecture6/notebook/9-SageLatex.log create mode 100644 src/Lecture6/notebook/9-SageLatex.out create mode 100644 src/Lecture6/notebook/9-SageLatex.pdf create mode 100644 src/Lecture6/notebook/9-SageLatex.tex create mode 100644 src/Lecture6/notebook/output_75_0.png create mode 100644 src/Lecture6/notebook/output_77_0.png create mode 100644 src/Lecture6/notebook/output_80_0.png create mode 100644 src/Lecture6/notebook/output_82_0.png create mode 100644 src/Lecture6/notebook/output_84_0.png create mode 100644 src/Lecture6/notebook/output_86_0.png create mode 100644 src/Lecture6/notebook/output_88_0.png (limited to 'src/Lecture6') diff --git a/src/Lecture6/live/8-SageCalculus-modified.ipynb b/src/Lecture6/live/8-SageCalculus-modified.ipynb new file mode 100644 index 0000000..5933058 --- /dev/null +++ b/src/Lecture6/live/8-SageCalculus-modified.ipynb @@ -0,0 +1,1614 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Symbolic expressions\n", + "\n", + "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n", + "\n", + "Last time we saw the basics of symbolic expressions:\n", + "* How to define and manipulate symbolic expressions\n", + "* How to introduce new variables (in the Mathematical sense) with `var()`\n", + "* How to solve equations and inequalities\n", + "* Some of the Mathematical constants that are included in Sage, and how to approximate them using `n()`\n", + "\n", + "Here are some examples to remind you of these basic things:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\n", + "x == -sqrt(-pi),\n", + "x == sqrt(-pi)\n", + "]\n", + "[\n", + "z == -sqrt(pi + x^2),\n", + "z == sqrt(pi + x^2)\n", + "]\n", + "[[y < -2], [y > 1]]\n", + "2*pi + e is approximately 9.00146713563863\n" + ] + } + ], + "source": [ + "var('y', 'z') # Define new variables (x is already defined by Sage)\n", + "f = x^2 + pi\n", + "g = y^2 + y - 2 > 0\n", + "print( solve(f==0, x) )\n", + "print( solve(z^2 - f, z) )\n", + "print( solve(g, y) )\n", + "print( 2*pi + e, \"is approximately\", n(2*pi + e) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we will see some more details about solving equations and manipulating their solutions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solving equations and inequalities\n", + "\n", + "**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", + "\n", + "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", + "\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " x + y = 2 \\\\\n", + " 2x - y = 6\n", + " \\end{cases}\n", + "\\end{align*}\n", + "\n", + "Can be solved as" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[x == (8/3), y == (-2/3)]]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solve([x+y == 2, 2*x - y == 6], [x,y])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Find the intersection of the circle of radius $2$ centered in the origin and the parabula of equation $y=x^2-2x+1$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Solution:** the system is\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " y^2 = x^2 - 2x +1\\\\\n", + " x^2 + y^2 = 4\n", + " \\end{cases}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[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]]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('y')\n", + "eq1 = y^2 == x^2-2*x+1\n", + "eq2 = x^2 + y^2 == 4\n", + "solve([eq1, eq2], [x,y])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The set of solutions\n", + "\n", + "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)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-3\n" + ] + } + ], + "source": [ + "solutions = solve(x^2-9 == 0, x)\n", + "solutions[0] # This is the expression 'x == -3'\n", + "\n", + "# Using rhs() explained below\n", + "print(solutions[0].rhs())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "rhs: -y + 2\n", + "lhs: x^2 + y\n" + ] + } + ], + "source": [ + "f = x^2+y <= 2-y\n", + "print(\"rhs:\", f.rhs())\n", + "print(\"lhs:\", f.lhs())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Simple inequality: [[x < -3], [x > 3]]\n", + "System of inequalities:\n", + " [\n", + "[3 < x, x < 6],\n", + "[x < -3]\n", + "]\n" + ] + } + ], + "source": [ + "print(\"Simple inequality:\", solve(x^2-9 > 0, x))\n", + "print(\"System of inequalities:\\n\", solve([x^2-9 > 0, x < 6], x))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the last example (system of inequalities), Sage is telling us that the system\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " x^2-9 > 9 \\\\\n", + " x < 6\n", + " \\end{cases}\n", + "\\end{align*}\n", + "has two solutions:\n", + "* $x$ is between $3$ and $6$;\n", + "* $x$ is less than $-3$.\n", + "\n", + "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" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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)$." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "All solutions:\n", + "[\n", + "[x == (-1/2*I + 1/2), y == -sqrt(1/2*I + 4)],\n", + "[x == (-1/2*I + 1/2), y == sqrt(1/2*I + 4)],\n", + "[x == (1/2*I + 1/2), y == -sqrt(-1/2*I + 4)],\n", + "[x == (1/2*I + 1/2), y == sqrt(-1/2*I + 4)]\n", + "]\n" + ] + } + ], + "source": [ + "# We use a different equation because the first exercise only\n", + "# had real solutions.\n", + "var('y')\n", + "eq1 = y^2 == x^2-2*x+5\n", + "eq2 = x^2 + y^2 == 4\n", + "solutions = solve([eq1, eq2], [x,y])\n", + "\n", + "print(\"All solutions:\")\n", + "print(solutions)\n", + "\n", + "for s in solutions:\n", + " #print(\"One solutions is:\", s)\n", + " x0 = s[0].rhs()\n", + " y0 = s[1].rhs()\n", + " if x0 in RR and y0 in RR:\n", + " print((x0, y0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{x: 8/3, y: -2/3}]" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solve([x+y == 2, 2*x - y == 6], [x,y], solution_dict=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Alternative method for real roots: `find_root()`\n", + "\n", + "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", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using solve():\n", + " [\n", + "x == -e^x + 10\n", + "]\n", + "Using find_root(): 2.070579904980303\n" + ] + } + ], + "source": [ + "f = e^x + x - 10\n", + "print(\"Using solve():\\n\", solve(f, x))\n", + "print(\"Using find_root():\", f.find_root(0,10))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluating functions\n", + "\n", + "If an expression contains only one variable you can evaluate it easily, even if it is not a function." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "y + 3 > (y + 3)^2\n" + ] + } + ], + "source": [ + "var('y')\n", + "f = x^2-3\n", + "g = x > x^2\n", + "\n", + "print(f(2))\n", + "print(g(3+y))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-2 == 0\n", + "3*y == 2\n" + ] + } + ], + "source": [ + "var('y','z')\n", + "\n", + "f = y*z^2 - y == z\n", + "print(f(2, 0))\n", + "print(f(z = 2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Symbolic computations\n", + "\n", + "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", + "\n", + "\\begin{align*}\n", + " \\begin{array}{llcc}\n", + " (1) & \\sum_{k=0}^nk &=&\\frac{n^2+n}{2}\\\\\n", + " (2) & \\sum_{k=0}^nk^4 &=&\\frac{6n^5+15n^4+10n^3-n}{30}\\\\\n", + " (3) & \\sum_{k=0}^n\\binom nk &=& 2^n\\\\\n", + " (4) & \\sum_{k=0}^\\infty \\frac1{k^2} &=& \\frac{\\pi^2}{6}\n", + " \\end{array}\n", + "\\end{align*}\n", + "Recall that $\\binom nk=\\frac{n!}{k!(n-k)!}$" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1) 1/2*n^2 + 1/2*n\n", + "(2) 1/5*n^5 + 1/2*n^4 + 1/3*n^3 - 1/30*n\n", + "(3) 2^n\n", + "(4) 1/6*pi^2\n" + ] + } + ], + "source": [ + "var('k', 'n') # Remember to declare all variables\n", + "\n", + "s = []\n", + "s.append( sum(k, k, 0, n) )\n", + "s.append( sum(k^4, k, 0, n) )\n", + "s.append( sum(binomial(n,k), k, 0, n) )\n", + "s.append( sum(1/k^2, k, 1, infinity) )\n", + "\n", + "for i in range(len(s)):\n", + " print(\"({}) {}\".format(i+1, s[i]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "factorial(n)^2" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(x^2).prod(x, 1, n)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(x + 1)^2 - (x - 1)^2\n", + "4*x\n" + ] + } + ], + "source": [ + "f = (x+1)^2 - (x-1)^2\n", + "print(f)\n", + "print(f.expand())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The Symbolic Ring\n", + "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html)]\n", + "\n", + "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\"." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-b*c + a*d\n", + "[(-a, 2)]\n" + ] + } + ], + "source": [ + "var('a', 'b', 'c', 'd')\n", + "\n", + "M = matrix([[a,b], [c,d]])\n", + "print(M.determinant())\n", + "\n", + "polring. = SR[]\n", + "f = x^2 + 2*a*x + a^2\n", + "print(f.roots())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the eigenvalues of the matrix\n", + "\\begin{align*}\n", + "\\begin{pmatrix}\n", + "\\cos \\alpha & \\sin \\alpha\\\\\n", + "-\\sin\\alpha & \\cos \\alpha\n", + "\\end{pmatrix}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-I\n" + ] + } + ], + "source": [ + "var('a')\n", + "M = matrix([[cos(a), sin(a)], [-sin(a), cos(a)]])\n", + "M.eigenvalues()\n", + "lam = M.eigenvalues()[0]\n", + "print(lam(pi/2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Calculus\n", + "**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)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Limits and series\n", + "\n", + "**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", + "\n", + "You can compute limits" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "+Infinity\n" + ] + } + ], + "source": [ + "var('x')\n", + "f = sin(x)/x\n", + "#print(f(0)) # This one gives an error\n", + "print( f.limit(x=0) )\n", + "\n", + "print( (e^(-x)).limit(x=-infinity) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the constant $e$ using a limit." + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "e^x" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "expression = (1+x/n)^n\n", + "expression.limit(n=infinity)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also specify a direction for the limit. If you don't, Sage assumes that you want to take a two-sided limit." + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "und\n", + "1\n", + "-1\n" + ] + }, + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = abs(x)/x # 1 if x>0, -1 if x<0\n", + "print( f.limit(x=0) ) # undefined\n", + "print( f.limit(x=0, dir=\"+\") )\n", + "print( f.limit(x=0, dir=\"-\") )\n", + "plot(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+Infinity\n", + "+Infinity\n", + "+Infinity\n" + ] + }, + { + "data": { + "image/png": "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HADFy8pmJypMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAPJKPB5XNBpVLBYLeigA0MmybTvXY3M+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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = 1/x^2\n", + "print( f.limit(x=0) )\n", + "print( f.limit(x=0, dir=\"+\") )\n", + "print( f.limit(x=0, dir=\"-\") )\n", + "plot(f, (x, -10, 10), ymax = 10, ymin = -10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is also the alternative notation `limit(f, x, dir)` which does the same as `f.limit(x, dir)`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also compute series expansions up to any order. **Watch out:** the notation uses `==` instead of `=` as `limit()` does." + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1*(x - 1) + (-1/2)*(x - 1)^2 + 1/3*(x - 1)^3 + Order((x - 1)^4)\n", + "1*x^2 + (-5/6)*x^4 + Order(x^6)\n" + ] + } + ], + "source": [ + "f = e^x\n", + "g = sin(x) - 2*cos(x)\n", + "h = log(x)\n", + "\n", + "#print(f.series(x==0, 5))\n", + "#print(g.series(x==0, 7))\n", + "print(h.series(x==1, 4))\n", + "\n", + "print((sin(x)^2*cos(x)).series(x==0, 6))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Derivatives\n", + "**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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When computing derivatives, you need to specify with respect to which variables you want to derive, except in case there is only one." + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8*y^3\n", + "6*x^2 - 1\n" + ] + } + ], + "source": [ + "var('y')\n", + "print( (x^2+2*y^4).derivative(y) ) # Alternative: derivative(f, y)\n", + "print( (2*x^3-x+2).derivative() )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also compute higher order derivatives:" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6*x\n", + "84*x^5*y + 10*y^4 + 24*x^2*y\n", + "1680*x^3 + 48\n" + ] + } + ], + "source": [ + "print( (x^3).derivative(x, x) ) # Same as (x^3).derivative(x, 2)\n", + "\n", + "f = x^7*y^2 + x^4*y^2 - 2*x^3 + x^2*y^5 + y + 2\n", + "print( f.derivative(x, x, y) ) # Twice in x, once in y\n", + "print( f.derivative(x, 4, y, 2) ) # 4 times in x, twice in y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jacobian and Hessian matrices are also easy to compute:" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-2*x + 2*y 2*x]\n", + "[ 0 3*y^2]\n", + "[ y + 1 x + 1] \n", + "\n", + "[ 2 -4*y + 1]\n", + "[ -4*y + 1 -4*x + 6*y]\n" + ] + } + ], + "source": [ + "f = (-x^2 + 2*x*y, y^3, x+y+x*y)\n", + "print( jacobian(f, [x,y]), \"\\n\" )\n", + "\n", + "g = x^2 + x*y + y^3 -2*x*y^2 -3\n", + "print( g.hessian() )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*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([...])`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Integrals\n", + "**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", + "\n", + "You should remember from high school or from your first calculus/analysis course that derivatives are easy, but integrals are hard.\n", + "When using a computer software to solve your integrals, you have two choices:\n", + "\n", + "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", + "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", + "\n", + "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)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Symbolic integration\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/2*x^2 - cos(x)\n", + "0\n", + "1/2*pi^2 + 2\n" + ] + } + ], + "source": [ + "var('a', 'b')\n", + "f = x + sin(x)\n", + "print( f.integral(x) ) # Alternative: integral(f, x)\n", + "print( f.integral(x, -10, 10) )\n", + "print( f.integral(x, 0, pi) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Your endpoints can also be $\\pm\\infty$:" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "sqrt(pi)\n" + ] + } + ], + "source": [ + "print( integral(e^(-x), x, 0, infinity) )\n", + "print( integral(e^(-x^2), x, -infinity, infinity) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The last function is also an example of an integral that perhaps you might want to compute numerically. In fact:" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/2*sqrt(pi)*erf(x)\n", + "1/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1)\n" + ] + } + ], + "source": [ + "print( integral(e^(-x^2), x) )\n", + "print( integral(e^(-x^2), x, 1, 2) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here `erf(x)` denotes the [error function](https://en.wikipedia.org/wiki/Error_function)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Numerical integration\n", + "\n", + "In order to get an explicit value for the computations above, we can use a *numerical* method.\n", + "\n", + "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", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.13525725794999466, 1.5016572202374808e-15)" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numerical_integral(e^(-x^2), 1, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result above means, in symbols\n", + "\\begin{align*}\n", + "\\int_1^2 e^{-x^2}\\mathrm dx = 0.13525725794999466 \\pm 1.5016572202374808\\times 10^{-15}\n", + "\\end{align*}\n", + "\n", + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the area of the ellipse of equation $y^2+\\left(\\frac x3\\right)^2=1$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Solution:** First, rewrite the equation as:\n", + "\\begin{align*}\n", + "y = \\sqrt{1- \\left(\\frac{x}{3}\\right)^2}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "3/2*pi" + ] + }, + "execution_count": 104, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y = sqrt(1-(x/3)^2)\n", + "show(plot(y, xmin=-3.1, xmax=3.1, ymin=-0.2, ymax=1.1))\n", + "integral(y, x, -3, 3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Differential equations\n", + "**Reference:** [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]\n", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "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()`." + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "_C*e^x" + ] + }, + "execution_count": 108, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('x')\n", + "function('f')\n", + "equation = derivative(f(x)) == f(x)\n", + "desolve(equation, f(x)) # f(x) is the unknown function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "We can also specify *initial conditions* for our function. For example we can impose that $f(0)=3$ as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3*e^x" + ] + }, + "execution_count": 109, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "desolve(equation, f(x), (0,3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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))$." + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e^(-1/2*x^2), x)" + ] + }, + "execution_count": 112, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "equation = derivative(f(x), x, 2) + x*derivative(f(x)) == 1\n", + "desolve(equation, f(x), (0, 0, 0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Use Sage to find out the functions $f(x)$ that satisfy\n", + "\\begin{align*}\n", + " \\begin{array}{rlcrl}\n", + " (A) &\n", + " \\begin{cases}\n", + " f(0) &= 1\\\\\n", + " f'(0) &= 0\\\\\n", + " f''(x) &= -f(x)\n", + " \\end{cases}\n", + " & \\qquad \\qquad &\n", + " (B) &\n", + " \\begin{cases}\n", + " f(0) &= 0\\\\\n", + " f'(0) &= 1\\\\\n", + " f''(x) &= -f(x)\n", + " \\end{cases}\n", + " \\end{array}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cos(x)\n", + "sin(x)\n", + "_K2*cos(x) + _K1*sin(x)\n" + ] + } + ], + "source": [ + "eq = derivative(f(x), x, 2) == -f(x)\n", + "conditions1 = (0,1,0)\n", + "conditions2 = (0,0,1)\n", + "print( desolve(eq, f(x), conditions1) )\n", + "print( desolve(eq, f(x), conditions2) )\n", + "print( desolve(eq, f(x)) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### A real-world example\n", + "\n", + "Differential equations have countless applications in Science, so it would be a shame not to see at least a simple one.\n", + "\n", + "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", + "\n", + "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", + "\n", + "Since the acceleration is the derivative of the velocity, we have a differential equation\n", + "\\begin{align*}\n", + " v'(t) = -g -kv(t)\n", + "\\end{align*}\n", + "and we can try to solve it with Sage!" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": {}, + "outputs": [], + "source": [ + "var('t')\n", + "function('v')\n", + "g = 9.8\n", + "k = 1.5\n", + "conditions = (0, 0) # Start with velocity 0\n", + "sol = desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions)\n", + "#plot(sol, xmin=0, xmax = 100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-(g*e^(k*t) - g)*e^(-k*t)/k" + ] + }, + "execution_count": 121, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('t', 'g', 'k')\n", + "function('v')\n", + "conditions = (0, 0) # Start with velocity 0\n", + "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions, ivar=t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic data analysis and visualization\n", + "\n", + "## Statistics\n", + "**References:** [[14](https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html)]\n", + "\n", + "Sage includes the most basic functions for statistical analysis." + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Values:\t [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n", + "Mean:\t\t\t 5/13\n", + "Median:\t\t\t 1\n", + "Mode:\t\t\t [3]\n", + "Standard deviation:\t 2*sqrt(29/13)\n", + "Variance:\t\t 116/13\n", + "Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5]\n" + ] + } + ], + "source": [ + "L = [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n", + "\n", + "print(\"Values:\\t\", L)\n", + "\n", + "print(\"Mean:\\t\\t\\t\", mean(L))\n", + "print(\"Median:\\t\\t\\t\", median(L))\n", + "print(\"Mode:\\t\\t\\t\", mode(L))\n", + "\n", + "print(\"Standard deviation:\\t\", std(L))\n", + "print(\"Variance:\\t\\t\", variance(L))\n", + "\n", + "print(\"Moving average (5):\", moving_average(L,5))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotting\n", + "**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", + "\n", + "Some Sage objects can be plotted:" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 123, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = sin(x)\n", + "plot(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sage's plotting functions are based on Python's [matplotlib](https://matplotlib.org/).\n", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hello\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "f = sin(x)\n", + "p = plot(f,\n", + " -2*pi, 2*pi, # bounds for x\n", + " ymin = -1.1, ymax = 1.1, # bounds for y\n", + " color = \"red\",\n", + " title = \"The sin function\",\n", + " )\n", + "print(\"hello\")\n", + "show(p)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you need to plot more than one object at the time, you can sum two plots and show them together with `show()`:" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "cosine = plot(cos(x), (x,-pi/2,pi/2), color=\"red\")\n", + "exponential = plot(exp(x), (x,-2,0.5))\n", + "\n", + "show(cosine + exponential) # works like print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 3 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "b = bar_chart(range(1,10))\n", + "s = scatter_plot([(1,5), (4,2), (8,8), (4,7)],\n", + " marker = \"*\", # symbol\n", + " markersize = 100,\n", + " edgecolor = \"green\",\n", + " facecolor = \"red\"\n", + " )\n", + "t = text(\"wow, such plot!\", (1, 8), color=\"black\", fontsize=20)\n", + "show(b + s + t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Interpolation\n", + "**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", + "\n", + "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", + "\n", + "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)." + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "metadata": {}, + "outputs": [ + { + "data": { + "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+++a1q2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\n", + "text/plain": [ + "Graphics object consisting of 3 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "points = [ (0,1), (1,2), (1.5,0), (2,4), (3,5) ]\n", + "polring. = QQ[] # you need to specify a polynomial ring\n", + "lp = polring.lagrange_polynomial(points)\n", + "show(scatter_plot(points, facecolor=\"red\")\n", + " + plot(lp, 0, 3) # slightly different notation for polynomials\n", + " + text(lp, (1,8), color=\"black\")\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "However, it does not always give you good approximation of your data:" + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "metadata": {}, + "outputs": [ + { + "data": { + "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+ji7Tbc0OjAZY3ZI2hGDWtStWze1b99eixYt0oABAyTZfud3331X9957b8TbITAlnrZt26pt27Zhn3fWWWcpEAjoX//6lwYPHixJev/99xUIBHT22WdHvL+dO3dq8+bNhwVvAM1Xq1atNHDgQC1atEgXX3xx7eOLFi3SuHHjIt7OBx984LnjyvHHS9nZNjD9+MfObjsQsEuCeUFMxzAVFxdr9erVKi4uVlVVlVavXq3Vq1drX02ikXTaaadp7ty5kmxT6ZQpU3TPPfdo7ty5+uSTT3TttdeqdevWuvLKKyPe7759UmqqnV0UyaV3794aPXq0Jk6cqBUrVmjFihWaOHGiLrzwQvXq1av2eYd+bvbt26dbb71Vy5cv16ZNm/TOO+9o7Nixatu27WEHRgDN2y233KI5c+boySef1Nq1azV16lQVFxdr0qRJkqRp06bpRz/6Ue3zZ86cqXnz5unzzz/XmjVrNG3aNL3yyiuaPHmyW28hZgYPtuvKOS0Y9E5giunSKL/+9a/19NNP1/67ptVo8eLFGjFihCQ7v0UgEKh9zu23365QKKQbb7xRu3fv1pAhQ/TWW28poxELw9UMMmONtuT03HPP6aabbqq9muX73/++Zs2addhzDv3cpKam6uOPP9YzzzyjPXv2qEOHDho5cqRefPHFRn1uAHjb5Zdfrp07d+q3v/2ttm3bpj59+uj1119Xly5dJEnbtm07bE6myspK3XrrrdqyZYvS09N1+umn6+9//7u+F6t1RFw0cKD03HN24menGhuMsS1MmZnObM9tPhP9sPgYjKuPzvTp0pw50ldfuV0JADcEg0H5/X4FAgFleuVoDcTQ8uV2EsuVK214csI339jGi+eekxrRSeSGiJpXEmpaAad46TJGAABirV8/OyfTqlXObTMYtPde6ZIjMAEA0My1bm0HfjsZmGpG2xCYEhiBCQCAxhk4MDaBySu94gQmAACggQOljz+WKiud2R5dckmAwAQAQOMMHGjD0iefOLM9uuSSAIEJAIDG6d/f2YHfNYHJK7O7EJgAAIBat5Z693YuMAWD9lycmurM9tzm2cB07LFuVwEAQHLp31/68ENntuWlZVEkjwamsjICEwAAjdWvnx34XV0d/bYITEmgrMw2LQJoXvLz85Wdna2cnBy3SwGSUr9+dobu9euj35aXlkWRPBiYjCEwAc1VXl6eioqKVFhY6HYpQFLq18/eO9Et56WFdyUPBqaKChuaCEwAADROu3b25kRgoksuwZWV2XsCEwAAjdevH4GpLgQmAABQy6nAtGcPgSmhEZgAAGi6fv2k4mJp9+7otrNrl9SmjTM1JQICEwAAqFUz8Pvjj5u+jepqG7hOPNGZmhIBgQkAANTq1Utq1Sq6brlAwIYmWpgSGIEJAICma9lSOv306ALTrl32nhamBEZgAgAgOtEO/CYwJQECEwAA0enXT/rkE+nAgaa9fudOe09gSmA1gSk93d06AABIVv36SeXl0uefN+31tDAlgbIyKS1NSk11uxIAAJJTtEuk7Nplz8Ve6u3xZGDy0i8IAIB4O/FE6eSTmx6Ydu602/D5nK3LTQQmAABwlGgGfu/a5a3uOInABMBD8vPzlZ2drZycHLdLAZIegelwBCYAnpGXl6eioiIVFha6XQqQ9Pr1k7ZulXbsaPxrCUxJgMAEAED0ohn4XTOGyUsITAAA4CinnGKn6GlKYNqxQ2rb1vma3ERgAgAAR0lNlfr2bVpgKi2V2rVzviY3EZgAAECdmjLwu6xM2rePwJTwCEwAADijXz+pqEiqrIz8Ndu32/usrNjU5BYCEwAAqFO/ftL+/dLatZG/prTU3tPClOAITAAAOOOMM+x9Y7rlCExJgsAEAIAzMjOlbt0aH5h8Pq6SS3gEJgAAnNPYgd/bt0tt2kgtWsSuJjcQmAAklE2bNum6665Tt27dlJ6erh49eug3v/mNKhsz6hSAY2oCkzGRPd+LUwpIkqfyX1WVVFFBYAKS2aeffqrq6mo99thjOuWUU/TJJ59o4sSJ+uabb/TAAw+4XR7Q7PTrZyei3LZNOumk8M8vLfXeFXKSxwJTKGTvCUxA8ho9erRGjx5d++/u3btr3bp1KigoIDABLjh0iZRIAtOWLXbck9d4qkuurMzeE5gAbwkEAjrRawtTAUmia1cpIyPycUxffSV16hTTklzhqRYmAhPgPevXr9cjjzyiBx98sN7nVFRUqKKiovbfwWAwHqUBzUJKip1eIJLAVFVlW5hOPjn2dcUbLUwA4mL69Ony+XwN3lauXHnYa7Zu3arRo0frsssu04QJE+rd9owZM+T3+2tvnbz49RZwUaRXypWWSgcOeLOFyWciHfZev6g34JSVK6WcHOnf/5YGDHC7GgCH2rFjh3bs2NHgc7p27apjjjlGkg1LI0eO1JAhQ/SnP/1JKSn1f7+rq4WpU6dOCgQCyszMdOYNAM3Yk09KEyZIgYDtnqvP++9LQ4dKH3wg9e8ft/Ki5YvkSZ7qkisvt/fp6e7WAeBobdu2VdsIZ7LbsmWLRo4cqYEDB+qpp55qMCxJUlpamtLS0pwoE0AdBg+20wqsWiWNGFH/8776yt57sYXJU11yNVfJEZiA5LV161aNGDFCnTp10gMPPKCvv/5aJSUlKikpcbs0oNnq3Vs67jjpX/9q+HmbN9tzsBev0fBkC9N/WvQBJKG33npLX3zxhb744gudfMTIUQeGEABogtRUadCgyAJTp052aRSv8VQLE4EJSH7XXnutjDF13gC4Z/BgO0apIV98IfXoEZ964s1TgYkuOQAAYmPwYDtGaevW+p/z+efSKafEr6Z48lRgKi+3zYAtW7pdCQAA3jJkiL2vr1uuqkpav1469dT41RRPngtM6ene7DsFAMBNHTvaCSmXLq3755s3S5WVBKakEAoxfgkAgFjw+aSRI6XFi+v++Wef2XsCUxIoLycwAQAQK9/5jp2Ucteuo3/24YfSscd6c+FdyYOBiQHfAADExsiRdgLL9947+merV9slVMLMM5u0PPW26JIDACB2unSRuneX/vGPo3/24Yc2MHmVpwITXXIAAMTWqFHS3/9uW5pqBALS2rXSmWe6V1eseS4w0SUHAEDsjB8vbdxoF7qvsXSpVF3d8Dpzyc5TgYkuOaB5y8/PV3Z2tnJyctwuBfCsESOkNm2kF188+Ng//mGnHfDqLN+SxwITXXJA85aXl6eioiIVFha6XQrgWS1aSFdeKT35pFRWZluWXnpJGjfO2/MgeiowhUJ0yQEAEGtTpki7d0t/+IM0d65dMuWaa9yuKrZauF2Ak2hhAgAg9rp3l269VfrVr6RWraQxY6ShQ92uKrY8F5hoYQIAIPbuvlvKypK+/lq64w63q4k9TwUmBn0DABAfLVpIP/+521XEj6fGMNElBwAAYsFzgYkuOQAA4DRPBSa65AAAQCx4KjDRJQcAAGLBc4GJLjkAAOA0zwSm/fulqipamAAAgPM8E5jKy+09gQkAADjNM4EpFLL3dMkBAACneSYw0cIEAABixXOBiRYmAADgNM8EppouOVqYgOYrPz9f2dnZysnJcbsUAB7jM8ZEu42oN+CE99+3KyV/9JHUt6/b1QBwUzAYlN/vVyAQUGZmptvlAEhsvkie5JkWJrrkAABArHgmMNElBwAAYsUzgYmr5AAAQKx4LjDRJQcAAJzmmcBU0yWXluZuHQAAwHs8E5jKy6UWLewNAADASZ4JTKEQ3XEAACA2PBOYyssZ8A0AAGLDU4GJFiYAABALnglMoRAtTAAAIDY8E5jokgMAALHiqcBElxwAAIgFzwQmuuQAAECseCYwlZczaSXQ3OXn5ys7O1s5OTlulwLAY3zGmGi3EfUGnDB2rJSSIs2f73YlANwWDAbl9/sVCASUmZnpdjkAEpsvkid5poWpooIWJgAAEBsEJgAAgDAITAAAAGEQmAAAAMLwTGDiKjkAABArnglMtDABAIBYITABAACEQWACAAAIw1OBiaVRAABALHgqMNHCBHhLRUWF+vfvL5/Pp9WrV7tdDoBmzBOBqbpa2r+fwAR4ze23366TTjrJ7TIAwBuBqbLS3hOYAO9444039NZbb+mBBx5wuxQAUAu3C3BCRYW9JzAB3lBaWqqJEydq3rx5at26tdvlAIA3AlN5ub0nMAHJzxija6+9VpMmTdKgQYO0adOmsK+pqKhQRc03J0nBYDCGFQJojjzRJUcLE5D4pk+fLp/P1+Bt5cqVeuSRRxQMBjVt2rSItz1jxgz5/f7aW6dOnWL4TgA0Rz5jTLTbiHoD0fr8c6lnT2nxYmnECLerAVCXHTt2aMeOHQ0+p2vXrrriiiv02muvyefz1T5eVVWl1NRUXXXVVXr66aePel1dLUydOnVSIBBQZmamc28CgBf5wj/FI4Hpk0+kvn2lf/5TOusst6sBEI3i4uLDutS2bt2q888/Xy+//LKGDBmik08+Oew2gsGg/H4/gQlAJCIKTJ4Yw0SXHOAdnTt3Puzfxx13nCSpR48eEYUlAIgFxjABAACE4akWJpZGAbyna9eucmDoAABEhRYmAACAMAhMAAAAYXgiMDFxJQAAiCVPBCZamAAAQCx5KjC1auVuHQAAwJs8E5hatZJ8EU09BQAA0DieCUx0xwEAgFghMAEAAIRBYAIAAAiDwATAM/Lz85Wdna2cnBy3SwHgMT4Hlhxwfc2CqVOlt96S1qxxuxIAiSAYDMrv9ysQCCgzM9PtcgAktoguGfNEC1N5OS1MAAAgdjwRmOiSAwAAsURgAgAACIPABAAAEAaBCQAAIAwCEwAAQBgEJgAAgDAITAAAAGEQmAAAAMLwRGAqL5eOOcbtKgAAgFd5IjDRwgQAAGKJwAQAABAGgQkAACAMAhMAAEAYBCYAnpGfn6/s7Gzl5OS4XQoAj/EZY6LdRtQbiEZ1tZSaKj3xhDRhgpuVAEgUwWBQfr9fgUBAmZmZbpcDILH5InlS0rcwVVbae1qYAABArCR9YKqosPcEJgAAECtJH5hSU6XJk6WePd2uBAAAeFXSj2ECgCMxhglAIzSPMUwAAACxRmACAAAIg8AEAAAQBoEJAAAgDAITAABAGE5cJQcACcXn82VKCkjyG2OCbtcDIPkRmAB4js/n80nKkLTXcJAD4AACEwAAQBiMYQIAAAiDwAQAABAGgQkAACAMAhMAAEAYBCYAAIAwCEwAAABhEJgAAADC+H+SrSjyT9J1kwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "R = [x/10 for x in range(-10,10)]\n", + "L = [1/(1+25*x^2) for x in R]\n", + "points = [(R[i], L[i]) for i in range(len(L))]\n", + "polring. = RR[]\n", + "lp = polring.lagrange_polynomial(points)\n", + "\n", + "show(plot(lp, -0.92, 0.82) + scatter_plot(points))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show(plot(spline(points), -1, 1) + scatter_plot(points))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} 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 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Symbolic expressions\n", + "\n", + "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n", + "\n", + "Last time we saw the basics of symbolic expressions:\n", + "* How to define and manipulate symbolic expressions\n", + "* How to introduce new variables (in the Mathematical sense) with `var()`\n", + "* How to solve equations and inequalities\n", + "* Some of the Mathematical constants that are included in Sage, and how to approximate them using `n()`\n", + "\n", + "Here are some examples to remind you of these basic things:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\n", + "x == -sqrt(-pi),\n", + "x == sqrt(-pi)\n", + "]\n", + "[\n", + "z == -sqrt(pi + x^2),\n", + "z == sqrt(pi + x^2)\n", + "]\n", + "[[y < -2], [y > 1]]\n", + "2*pi + e is approximately 9.00146713563863\n" + ] + } + ], + "source": [ + "var('y', 'z') # Define new variables (x is already defined by Sage)\n", + "f = x^2 + pi\n", + "g = y^2 + y - 2 > 0\n", + "print( solve(f==0, x) )\n", + "print( solve(z^2 - f, z) )\n", + "print( solve(g, y) )\n", + "print( 2*pi + e, \"is approximately\", n(2*pi + e) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we will see some more details about solving equations and manipulating their solutions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solving equations and inequalities\n", + "\n", + "**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", + "\n", + "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", + "\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " x + y = 2 \\\\\n", + " 2x - y = 6\n", + " \\end{cases}\n", + "\\end{align*}\n", + "\n", + "Can be solved as" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[x == (8/3), y == (-2/3)]]" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solve([x+y == 2, 2*x - y == 6], [x,y])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The set of solutions\n", + "\n", + "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)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "x == -3" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solutions = solve(x^2-9 == 0, x)\n", + "solutions[0] # This is the expression 'x == -3'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "rhs: 2\n", + "lhs: x\n" + ] + } + ], + "source": [ + "f = x == 2\n", + "print(\"rhs:\", f.rhs())\n", + "print(\"lhs:\", f.lhs())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Simple inequality: [[x < -3], [x > 3]]\n", + "System of inequalities:\n", + " [\n", + "[3 < x, x < 6],\n", + "[x < -3]\n", + "]\n" + ] + } + ], + "source": [ + "print(\"Simple inequality:\", solve(x^2-9 > 0, x))\n", + "print(\"System of inequalities:\\n\", solve([x^2-9 > 0, x < 6], x))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the last example (system of inequalities), Sage is telling us that the system\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " x^2-9 > 9 \\\\\n", + " x < 6\n", + " \\end{cases}\n", + "\\end{align*}\n", + "has two solutions:\n", + "* $x$ is between $3$ and $6$;\n", + "* $x$ is less than $-3$.\n", + "\n", + "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" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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)$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{x: 8/3, y: -2/3}]" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solve([x+y == 2, 2*x - y == 6], [x,y], solution_dict=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Alternative method for real roots: `find_root()`\n", + "\n", + "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", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using solve():\n", + " [\n", + "x == -e^x + 10\n", + "]\n", + "Using find_root(): 2.070579904980303\n" + ] + } + ], + "source": [ + "f = e^x + x - 10\n", + "print(\"Using solve():\\n\", solve(f, x))\n", + "print(\"Using find_root():\", f.find_root(0,100))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluating functions\n", + "\n", + "If an expression contains only one variable you can evaluate it easily, even if it is not a function." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "y + 3 > (y + 3)^2\n" + ] + } + ], + "source": [ + "var('y')\n", + "f = x^2-3\n", + "g = x > x^2\n", + "\n", + "print(f(2))\n", + "print(g(3+y))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-2 == 0\n", + "3*y == 2\n" + ] + } + ], + "source": [ + "var('y','z')\n", + "\n", + "f = y*z^2 - y == z\n", + "print(f(2, 0))\n", + "print(f(z=2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Symbolic computations\n", + "\n", + "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", + "\n", + "\\begin{align*}\n", + " \\begin{array}{llcc}\n", + " (1) & \\sum_{k=0}^nk &=&\\frac{n^2+n}{2}\\\\\n", + " (2) & \\sum_{k=0}^nk^4 &=&\\frac{6n^5+15n^4+10n^3-n}{30}\\\\\n", + " (3) & \\sum_{k=0}^n\\binom nk &=& 2^n\\\\\n", + " (4) & \\sum_{k=0}^\\infty \\frac1{k^2} &=& \\frac{\\pi^2}{6}\n", + " \\end{array}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1) 1/2*n^2 + 1/2*n\n", + "(2) 1/5*n^5 + 1/2*n^4 + 1/3*n^3 - 1/30*n\n", + "(3) 2^n\n", + "(4) 1/6*pi^2\n" + ] + } + ], + "source": [ + "var('k', 'n') # Remember to declare all variables\n", + "\n", + "s = []\n", + "s.append( sum(k, k, 0, n) )\n", + "s.append( sum(k^4, k, 0, n) )\n", + "s.append( sum(binomial(n,k), k, 0, n) )\n", + "s.append( sum(1/k^2, k, 1, infinity) )\n", + "\n", + "for i in range(len(s)):\n", + " print(\"({}) {}\".format(i+1, s[i]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(x + 1)^2 - (x - 1)^2\n", + "4*x\n" + ] + } + ], + "source": [ + "f = (x+1)^2 - (x-1)^2\n", + "print(f)\n", + "print(f.expand())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The Symbolic Ring\n", + "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html)]\n", + "\n", + "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\"." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-b*c + a*d\n", + "[(-a, 2)]\n" + ] + } + ], + "source": [ + "var('a', 'b', 'c', 'd')\n", + "\n", + "M = matrix([[a,b], [c,d]])\n", + "print(M.determinant())\n", + "\n", + "polring. = SR[]\n", + "f = x^2 + 2*a*x + a^2\n", + "print(f.roots())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the eigenvalues of the matrix\n", + "\\begin{align*}\n", + "\\begin{pmatrix}\n", + "\\cos \\alpha & \\sin \\alpha\\\\\n", + "-\\sin\\alpha & \\cos \\alpha\n", + "\\end{pmatrix}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Calculus\n", + "**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)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Limits and series\n", + "\n", + "**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", + "\n", + "You can compute limits" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "0\n" + ] + } + ], + "source": [ + "f = sin(x)/x\n", + "# print(f(0)) # This one gives an error\n", + "print( f.limit(x=0) )\n", + "\n", + "print( (e^(-x)).limit(x=infinity) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the constant $e$ using a limit." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also specify a direction for the limit. If you don't, Sage assumes that you want to take a two-sided limit." + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "und\n", + "1\n", + "-1\n" + ] + } + ], + "source": [ + "f = abs(x)/x # 1 if x>0, -1 if x<0\n", + "print( f.limit(x=0) ) # undefined\n", + "print( f.limit(x=0, dir=\"+\") )\n", + "print( f.limit(x=0, dir=\"-\") )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is also the alternative notation `limit(f, x, dir)` which does the same as `f.limit(x, dir)`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also compute series expansions up to any order. **Watch out:** the notation uses `==` instead of `=` as `limit()` does." + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 + 1*x + 1/2*x^2 + Order(x^3)\n", + "(-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", + "1*(x - 1) + (-1/2)*(x - 1)^2 + Order((x - 1)^3)\n" + ] + } + ], + "source": [ + "f = e^x\n", + "g = sin(x) - 2*cos(x)\n", + "h = log(x)\n", + "\n", + "print(f.series(x==0, 3))\n", + "print(g.series(x==0, 7))\n", + "print(h.series(x==1, 3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Derivatives\n", + "**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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When computing derivatives, you need to specify with respect to which variables you want to derive, except in case there is only one." + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8*y^3\n", + "6*x^2 - 1\n" + ] + } + ], + "source": [ + "var('y')\n", + "print( (x^2+2*y^4).derivative(y) ) # Alternative: derivative(f, y)\n", + "print( (2*x^3-x+2).derivative() )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also compute higher order derivatives:" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6*x\n", + "84*x^5*y + 10*y^4 + 24*x^2*y\n", + "1680*x^3 + 48\n" + ] + } + ], + "source": [ + "print( (x^3).derivative(x, x) ) # Same as (x^3).derivative(x, 2)\n", + "\n", + "f = x^7*y^2 + x^4*y^2 - 2*x^3 + x^2*y^5 + y + 2\n", + "print( f.derivative(x, x, y) ) # Twice in x, once in y\n", + "print( f.derivative(x, 4, y, 2) ) # 4 times in x, twice in y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jacobian and Hessian matrices are also easy to compute:" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-2*x + 2*y 2*x]\n", + "[ 0 3*y^2]\n", + "[ y + 1 x + 1] \n", + "\n", + "[ 2 -4*y + 1]\n", + "[ -4*y + 1 -4*x + 6*y]\n" + ] + } + ], + "source": [ + "f = (-x^2 + 2*x*y, y^3, x+y+x*y)\n", + "print( jacobian(f, [x,y]), \"\\n\" )\n", + "\n", + "g = x^2 + x*y + y^3 -2*x*y^2 -3\n", + "print( g.hessian() )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*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([...])`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Integrals\n", + "**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", + "\n", + "You should remember from high school or from your first calculus/analysis course that derivatives are easy, but integrals are hard.\n", + "When using a computer software to solve your integrals, you have two choices:\n", + "\n", + "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", + "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", + "\n", + "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)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Symbolic integration\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/2*x^2 - cos(x)\n", + "0\n", + "-1/2*a^2 + 1/2*b^2 + cos(a) - cos(b)\n" + ] + } + ], + "source": [ + "var('a', 'b')\n", + "f = x + sin(x)\n", + "print( f.integral(x) ) # Alternative: integral(f, x)\n", + "print( f.integral(x, -10, 10) )\n", + "print( f.integral(x, a, b) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Your endpoints can also be $\\pm\\infty$:" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "sqrt(pi)\n" + ] + } + ], + "source": [ + "print( integral(e^(-x), x, 0, infinity) )\n", + "print( integral(e^(-x^2), x, -infinity, infinity) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The last function is also an example of an integral that perhaps you might want to compute numerically. In fact:" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/2*sqrt(pi)*erf(x)\n", + "1/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1)\n" + ] + } + ], + "source": [ + "print( integral(e^(-x^2), x) )\n", + "print( integral(e^(-x^2), x, 1, 2) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here `erf(x)` denotes the [error function](https://en.wikipedia.org/wiki/Error_function)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Numerical integration\n", + "\n", + "In order to get an explicit value for the computations above, we can use a *numerical* method.\n", + "\n", + "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", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.13525725794999466, 1.5016572202374808e-15)" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numerical_integral(e^(-x^2), 1, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result above means, in symbols\n", + "\\begin{align*}\n", + "\\int_1^2 e^{-x^2}\\mathrm dx = 0.13525725794999466 \\pm 1.5016572202374808\\times 10^{-15}\n", + "\\end{align*}\n", + "\n", + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the area of the ellipse of equation $y^2+\\left(\\frac x3\\right)^2=1$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Differential equations\n", + "**Reference:** [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]\n", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "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()`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "_C*e^x" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('x')\n", + "function('f')\n", + "equation = derivative(f(x)) == f(x)\n", + "desolve(equation, f(x)) # f is the unknown function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "We can also specify *initial conditions* for our function. For example we can impose that $f(0)=3$ as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3*e^x" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "desolve(equation, f(x), (0,3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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))$." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e^(-1/2*x^2), x)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "equation = derivative(f(x), x, 2) + x*derivative(f(x)) == 1\n", + "desolve(equation, f(x), (0, 0, 0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Use Sage to find out the functions $f(x)$ that satisfy\n", + "\\begin{align*}\n", + " \\begin{array}{rlcrl}\n", + " (A) &\n", + " \\begin{cases}\n", + " f(0) &= 1\\\\\n", + " f'(0) &= 0\\\\\n", + " f''(x) &= -f(x)\n", + " \\end{cases}\n", + " & \\qquad \\qquad &\n", + " (B) &\n", + " \\begin{cases}\n", + " f(0) &= 0\\\\\n", + " f'(0) &= 1\\\\\n", + " f''(x) &= -f(x)\n", + " \\end{cases}\n", + " \\end{array}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### A real-world example\n", + "\n", + "Differential equations have countless applications in Science, so it would be a shame not to see at least a simple one.\n", + "\n", + "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", + "\n", + "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", + "\n", + "Since the acceleration is the derivative of the velocity, we have a differential equation\n", + "\\begin{align*}\n", + " v'(t) = -g -kv(t)\n", + "\\end{align*}\n", + "and we can try to solve it with Sage!" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-98/15*(e^(3/2*t) - 1)*e^(-3/2*t)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('t')\n", + "function('v')\n", + "g = 9.8\n", + "k = 1.5\n", + "conditions = (0, 0) # Start with velocity 0\n", + "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-(g*e^(k*t) - g)*e^(-k*t)/k" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('t', 'g', 'k')\n", + "function('v')\n", + "conditions = (0, 0) # Start with velocity 0\n", + "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions, ivar=t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic data analysis and visualization\n", + "\n", + "## Statistics\n", + "**References:** [[14](https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html)]\n", + "\n", + "Sage includes the most basic functions for statistical analysis." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Values:\t [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n", + "Mean:\t\t\t 5/13\n", + "Median:\t\t\t 1\n", + "Mode:\t\t\t [3]\n", + "Standard deviation:\t 2*sqrt(29/13)\n", + "Variance:\t\t 116/13\n", + "Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5]\n" + ] + } + ], + "source": [ + "L = [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n", + "\n", + "print(\"Values:\\t\", L)\n", + "\n", + "print(\"Mean:\\t\\t\\t\", mean(L))\n", + "print(\"Median:\\t\\t\\t\", median(L))\n", + "print(\"Mode:\\t\\t\\t\", mode(L))\n", + "\n", + "print(\"Standard deviation:\\t\", std(L))\n", + "print(\"Variance:\\t\\t\", variance(L))\n", + "\n", + "print(\"Moving average (5):\", moving_average(L,5))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotting\n", + "**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", + "\n", + "Some Sage objects can be plotted:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = sin(x)\n", + "plot(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sage's plotting functions are based on Python's [matplotlib](https://matplotlib.org/).\n", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = sin(x)\n", + "plot(f,\n", + " -2*pi, 2*pi, # bounds for x\n", + " ymin = -0.7, ymax = 0.7, # bounds for y\n", + " color = \"red\",\n", + " title = \"The sin function\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you need to plot more than one object at the time, you can sum two plots and show them together with `show()`:" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "cosine = plot(cos(x), (x,-pi/2,pi/2), color=\"red\")\n", + "exponential = plot(exp(x), (x,-2,0.5))\n", + "\n", + "show(cosine + exponential)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 3 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "b = bar_chart(range(1,10))\n", + "s = scatter_plot([(1,5), (4,2), (8,8), (4,7)],\n", + " marker = \"*\", # symbol\n", + " markersize = 100,\n", + " edgecolor = \"black\",\n", + " facecolor = \"red\"\n", + " )\n", + "t = text(\"wow, such plot!\", (1, 8), color=\"black\", fontsize=20)\n", + "show(b + s + t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Interpolation\n", + "**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", + "\n", + "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", + "\n", + "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)." + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "data": { + "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+OHoWpU6FvXzjjDLfThKarroLUVPjwQ7eTFIzHCyXHcSIcx3nccZyfHcdJdhxnp+M4jziOU6xr/fvvv7Ru3Zonn3wy12PWrFnDFVdcQefOnfnqq69Yt24dgwcPJiws66U//vhjatWqRcOGDSlbtiyDBw9mxYoVbN26lYceeoiHHnqImTNnArB9+3bmzp2b5fXr169nyZIlBc6ekpJCXFwcFSpU4MMPP+Thhx9mypQpXHfddaxbty7H16xbt46ZM2dy3nnnFfg6GcaNG8dthVgUZOnSpfTq1Yv+/fuzadMmEhISmDx5Ms8991y2Y3/44Qf27NmT+WjQoEG2Y9555x3i4uIAaN68ObNnz2br1q18+OGHGGPo3LkzaWlpAMyYMYN9+/ZlvvbYsWNMmjQpW5GTl/fff5/+/fvz9ttvM2TIEFasWMEff/xBnz59SE9PzzwuLCyMuLg43nnnHbZv387LL7/MsmXL6N+/f4GvlZuaNWvy5JNP8vXXX/P1119z6aWXEhcXx+bNm7Mdu2jRItauXUv16tWzfS6/9yvDyfcwwA033MAnn3zCiy++yA8//MCbb76Z+Tlf38Off/45gwYN4ssvv+Tjjz8mNTWVzp078++//xb4eoW9h9PS0oiMjGTo0KF06tQpx2OmT5/OmDFjGDduHJs3b2b8+PEMGjQoy/tw5MgRzjrrLJ588kmqVauW6/XS09N57733Mu/z+fPnc8stt9C3b182btzI6tWr6XnSMs9Tpkzh0KFDmf8+dOgQkydPLvDXl5/bbrutUH9opKSkcPrpp/Pggw/StGlTj+UIBHPmwL59dkkAcUft2tC4ceAUShhjPPoAHgT2A1cBdYHrgUPAPaYAEhMTDWASExNz/PzPP/9sAPPtt99m+1zLli3NQw89lO81br/9dnPffffl+vlu3bqZ3r17G2OMOXDggLnrrrtMjx49TNOmTc0jjzxirrjiCrN161aTnJxsYmJiTL9+/TJfu3PnThMVFWVmzpxpjDEmNTXVdOvWzXTt2tUcPXo0y3VeeeUVU7VqVbNly5Yszx86dMg0aNDAfPzxx6Zdu3bmnnvuyfdrOtnYsWPNrbfeWuDjb775ZnP99ddneW7KlCmmZs2aJj093RhjzGeffWYA8/fff+d5rt9++82UKFEi1+M2btxoAPPjjz8aY4x59913TcuWLc3QoUPN9ddfby655BIzZcoUk5qaal555RVTtmxZs3379szXDx482DRo0MAcPnzYGGPMqlWrTOXKlc1HH32U5ToHDx40F154oRk4cGCeeadNm2Zq1qyZ5zFFVaFCBTNr1qwsz+3evdvUqFHDbNq0ydSpU8dMmTIlz3Oc+n5lOPkeXrp0qYmOjjYHDhzI8Rxu3MMn27dvnwHM559/nufXerLC3sMnu/XWW01cXFy251u1apXt//t77rnHtG7dOsfz5PX9WbFihalSpYpJS0szx48fNzVq1Mj2vT7Z7NmzTcuWLc0dd9xh7rjjDtOyZUvz6quvGmOMGT9+vDnjjDPM/v37M4/v2rWrueSSS0xaWlo+X6116623mrFjxxbo2FMV5WdMoEpLM+acc4zp1s3tJDJihDE1axpz4leMWwpW1xT0wAKfEN4FXjzlufnAawVJXdRCae/evQYwzzzzjGnVqpWpUqWKadu2rVm5cmWW49LS0kyVKlWyPZ9h/fr1pmrVquaFF17I8vzzzz9vANOzZ88sz3/77bemZMmSZuHChSY1NdW0bt06xx/ShdGnTx8zbNgwY0zRfogV9pdM9+7dMwvDDDNmzDCA+fnnn40x/18o1a1b11SrVs1ceuml5tNPP812rueee8507Ngxx+scPnzYDBs2zJx55pkmJSUl8/l//vnHNGzY0JQpU8asX78+y2t69OhhYmNjzfHjx83SpUtNiRIlzFdffVXgry0vv//+u2nXrp3p1auXR86XITU11bz55pumZMmSZvPmzZnPp6WlmQ4dOpipU6caY/L+RWxM7u/XqffwgAEDTMeOHc2oUaNM9erVTYMGDcy9995rjhw5kuV8vryHT7Zjxw4DmO+//77Ar/FGoXTBBRdk+0Nq9OjRpkSJEubYsWPZjs/r+3PfffeZO+64wxhjzNq1aw1gXnrpJdOsWTNTrVo1c8UVV5hNmzZlec2vv/5qqlataqpWrWp+++23zOdTU1NNq1atzLXXXmuMMWb69OkmOjra/PLLL4X6mlUo5e+dd+xvvdWr3U4iH3xgvxd5/I3lCwWqa7wxRmkV0NFxnLMBHMdpCrQB3s/p4JSUFJKSkrI8imLnzp2AbbLv168fH3zwARdccAEdO3Zkx44dmcd9+eWXpKenc/HFF2d5fc2aNSlVqhQtWrRg0KBB3HnnnQD8/fffDBw4kGXLltG0aVPq1atHly5dMsdcNGvWjMcff5x+/foxfPhwfvrpJ2bNmlWkrwFg7ty5rF+/ngkTJhT5HIV1+eWXs2DBAj755BPS09PZvn175tiMPXv2AHDGGWcwc+ZM5s+fz4IFCzjnnHPo2LEjK1asyHKuxYsXZ3ZHZEhISKBcuXKUK1eODz74gI8//piSJUsC8MEHH2R2l1555ZUMHTqUadOmZXY1Pf/88+zZs4ehQ4dy2223MXbsWGJjY4v19d58882UKVOGGjVqEBUVVazv18m+//57ypUrR6lSpejfvz8LFy4kJiYm8/MTJ04kIiKCoUOH5nmevN4vyH4P79y5k1WrVrFp0yYWLlzI1KlTmTdvHoMGDQJ8fw+fzBjDiBEjaNOmDY0bN/bIOYvq8ssvZ9asWXzzzTcYY/j666956aWXOH78OPv37y/UuU7uXj75Z89DDz3Eu+++S4UKFWjXrh0HDx4EYM6cOdxwww1cddVVXHXVVfTo0YM5c+YAEB4ezpw5c/jkk08YPXo09957L/Hx8dSpU8eDX70APP00tGoFp/z4FxdccgmUKmX3fvN7Ba2oCvoAHGACkA4cP/FxzInPZzN27FgDZHuULVvWlC1b1qxYsSLL8bm1KK1evdoAZsyYMVmeb9KkiRk9enTmv0eOHGluu+22bDl27txpvvvuOzNz5kxTsWJF88YbbxhjjNm2bVvmf7dr184YY8w333xj3nnnnczXpqWlmdatWxvALF26NKcvs0B+++03U6VKFbNhw4bM5wry196KFSsy36+yZcuaEiVKmIiIiCzPPfHEE7m+Pj093YwcOdKULl3ahIeHmwoVKphx48YZwKxduzbX11199dWma9eumf9OTEw0JUuWzPaX8D///GO2b99uPv/8c9O1a1dzwQUXmOTkZGOMMQkJCWbv3r3ms88+M2PHjjUpKSnmqaeeyvIX/ocffmgAc/HFF5vU1NQ834uC2LNnj9m6datZtGiRiYmJMQMGDMj12LvvvjvL+5iXlJQUs2PHDrNu3TozevRoU7ly5cwWpa+//tpUrVrV/P7775nH59Zikdf7ZUz2e/iyyy4zpUuXNv/880/mc/PnzzeO45gjR4749B4+1cCBA02dOnXMrl278jyuuPfwyXJrUTpy5Ijp27eviYiIMOHh4aZ69epm5MiRBjB79+7Ndnxu358tW7aYMmXKZLbYvf766wYwzz//fOYxR48eNZUrVzYzZswwxhgzadIkk5SUZGbPnm1mz55tkpKSzKRJk7KcN6PF78Ybb8z3a5wzZ06W9yYiIsKUKFEiy3Nz5szJ9zzGhE6L0tq1tgVjwQK3k0iGjh2NufJKVyO41vV2E7DrxMcmwC3AAeDWnFIePXrUJCYmZj62bt1qALN+/XqzY8eObN0HuRVKO3fuNIB57bWsPXw33HBDlq6Ghg0bmoULF+b5zj322GPm7LPPzvZ8xi+ZU+3Zs8dUrlzZhIeHm2eeeSbPc+dl4cKFBjDh4eGZD8A4jmPCw8NzLRKOHDliduzYkfkYMmSI6d69e5bnchu/crLU1FSze/duk5KSYt5///1cf4FkePzxx03Dhg0z/z137lzTtGnTPK+RkpJiypQpk/mLO0NGoZSTBx980ISHh5u6devm2iVbVCtXrjSA+eOPP3L8/N69e7O8j4XRsWNHc9dddxlj7JivjO/jyd/bsLAwU6dOnVzPkdP7deo93KdPH1OvXr0sr9uyZYsBsozvMsb79/DJBg8ebGrWrGl27tyZ77GeuoeNyb1QynDs2DGza9cuk5qaahISEkz58uVzHAuUW6H05JNPZjn/p59+aoBs3fkXXniheeCBB7I8l1Eo5aRXr14mPDzctGzZ0hw/fjzX/MYYk5SUlOW96d69uxkyZEiW55KSkvI8R4ZQKZR69DCmfn1jPPC3lnjIxInGlCljzClDH32pQHVNhBcaqZ4CnjTGZEyz+d5xnDrAmJwOLlWqFKVKlcr2fL169YiKiirwRevWrUv16tWzTUPevn07Xbp0AWDHjh388ssvdO7cOc9zGWNISUnJ9vzy5ctzPP7222+ncePG9OvXjzvuuIOOHTtm6XIpqI4dO/L9999nea5v3740bNiQUaNGER4enuPrIiMjqV+/fua/K1asSFJSUpbnCiI8PJwaNWoA8Oabb9KqVSuqVKmS6/HffvstZ5w0v3bx4sVcc801+V4np/e3ffv2OU5d/+KLL/jvf//LkiVLGD16NEOGDOGVV14p4FeUP2OL+xy/3wBVqlTJ8z3I79wZ573llluyzca6/PLLM2dKFfQ8Od3DrVu35u233+bw4cOUK1cOsPd9WFgYNWvWzHIub9/DGXmHDBnCwoULWb58OWeeeWa+r/HUPVwQJUqUyHxf5s6dy9VXX51tZmxeFi9enNk1D3amYqlSpfjhhx9o06YNAMePH+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", + "text/plain": [ + "Graphics object consisting of 3 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "points = [ (0,1), (1,2), (1.5,0), (2,4), (3,5) ]\n", + "polring. = QQ[] # you need to specify a polynomial ring\n", + "lp = polring.lagrange_polynomial(points)\n", + "show(scatter_plot(points, facecolor=\"red\")\n", + " + plot(lp, 0, 3) # slightly different notation for polynomials\n", + " + text(lp, (1,8), color=\"black\")\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "However, it does not always give you good approximation of your data:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "R = [x/10 for x in range(-10,10)]\n", + "L = [1/(1+25*x^2) for x in R]\n", + "points = [(R[i], L[i]) for i in range(len(L))]\n", + "polring. = RR[]\n", + "lp = polring.lagrange_polynomial(points)\n", + "\n", + "show(plot(lp, -0.82, 0.72) + scatter_plot(points))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show(plot(spline(points), -1, 1) + scatter_plot(points))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} 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 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Symbolic expressions\n", + "\n", + "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n", + "\n", + "Last time we saw the basics of symbolic expressions:\n", + "* How to define and manipulate symbolic expressions\n", + "* How to introduce new variables (in the Mathematical sense) with `var()`\n", + "* How to solve equations and inequalities\n", + "* Some of the Mathematical constants that are included in Sage, and how to approximate them using `n()`\n", + "\n", + "Here are some examples to remind you of these basic things:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\n", + "x == -sqrt(-pi),\n", + "x == sqrt(-pi)\n", + "]\n", + "[\n", + "z == -sqrt(pi + x^2),\n", + "z == sqrt(pi + x^2)\n", + "]\n", + "[[y < -2], [y > 1]]\n", + "2*pi + e is approximately 9.00146713563863\n" + ] + } + ], + "source": [ + "var('y', 'z') # Define new variables (x is already defined by Sage)\n", + "f = x^2 + pi\n", + "g = y^2 + y - 2 > 0\n", + "print( solve(f==0, x) )\n", + "print( solve(z^2 - f, z) )\n", + "print( solve(g, y) )\n", + "print( 2*pi + e, \"is approximately\", n(2*pi + e) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we will see some more details about solving equations and manipulating their solutions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solving equations and inequalities\n", + "\n", + "**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", + "\n", + "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", + "\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " x + y = 2 \\\\\n", + " 2x - y = 6\n", + " \\end{cases}\n", + "\\end{align*}\n", + "\n", + "Can be solved as" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[x == (8/3), y == (-2/3)]]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solve([x+y == 2, 2*x - y == 6], [x,y])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Find the intersection of the circle of radius $2$ centered in the origin and the parabula of equation $y=x^2-2x+1$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Solution:** the system is\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " y^2 = x^2 - 2x +1\\\\\n", + " x^2 + y^2 = 4\n", + " \\end{cases}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[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]]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('y')\n", + "eq1 = y^2 == x^2-2*x+1\n", + "eq2 = x^2 + y^2 == 4\n", + "solve([eq1, eq2], [x,y])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The set of solutions\n", + "\n", + "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)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-3\n" + ] + } + ], + "source": [ + "solutions = solve(x^2-9 == 0, x)\n", + "solutions[0] # This is the expression 'x == -3'\n", + "\n", + "# Using rhs() explained below\n", + "print(solutions[0].rhs())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "rhs: -y + 2\n", + "lhs: x^2 + y\n" + ] + } + ], + "source": [ + "f = x^2+y <= 2-y\n", + "print(\"rhs:\", f.rhs())\n", + "print(\"lhs:\", f.lhs())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Simple inequality: [[x < -3], [x > 3]]\n", + "System of inequalities:\n", + " [\n", + "[3 < x, x < 6],\n", + "[x < -3]\n", + "]\n" + ] + } + ], + "source": [ + "print(\"Simple inequality:\", solve(x^2-9 > 0, x))\n", + "print(\"System of inequalities:\\n\", solve([x^2-9 > 0, x < 6], x))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the last example (system of inequalities), Sage is telling us that the system\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " x^2-9 > 9 \\\\\n", + " x < 6\n", + " \\end{cases}\n", + "\\end{align*}\n", + "has two solutions:\n", + "* $x$ is between $3$ and $6$;\n", + "* $x$ is less than $-3$.\n", + "\n", + "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" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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)$." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "All solutions:\n", + "[\n", + "[x == (-1/2*I + 1/2), y == -sqrt(1/2*I + 4)],\n", + "[x == (-1/2*I + 1/2), y == sqrt(1/2*I + 4)],\n", + "[x == (1/2*I + 1/2), y == -sqrt(-1/2*I + 4)],\n", + "[x == (1/2*I + 1/2), y == sqrt(-1/2*I + 4)]\n", + "]\n" + ] + } + ], + "source": [ + "# We use a different equation because the first exercise only\n", + "# had real solutions.\n", + "var('y')\n", + "eq1 = y^2 == x^2-2*x+5\n", + "eq2 = x^2 + y^2 == 4\n", + "solutions = solve([eq1, eq2], [x,y])\n", + "\n", + "print(\"All solutions:\")\n", + "print(solutions)\n", + "\n", + "for s in solutions:\n", + " #print(\"One solutions is:\", s)\n", + " x0 = s[0].rhs()\n", + " y0 = s[1].rhs()\n", + " if x0 in RR and y0 in RR:\n", + " print((x0, y0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{x: 8/3, y: -2/3}]" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solve([x+y == 2, 2*x - y == 6], [x,y], solution_dict=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Alternative method for real roots: `find_root()`\n", + "\n", + "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", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using solve():\n", + " [\n", + "x == -e^x + 10\n", + "]\n", + "Using find_root(): 2.070579904980303\n" + ] + } + ], + "source": [ + "f = e^x + x - 10\n", + "print(\"Using solve():\\n\", solve(f, x))\n", + "print(\"Using find_root():\", f.find_root(0,10))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluating functions\n", + "\n", + "If an expression contains only one variable you can evaluate it easily, even if it is not a function." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "y + 3 > (y + 3)^2\n" + ] + } + ], + "source": [ + "var('y')\n", + "f = x^2-3\n", + "g = x > x^2\n", + "\n", + "print(f(2))\n", + "print(g(3+y))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-2 == 0\n", + "3*y == 2\n" + ] + } + ], + "source": [ + "var('y','z')\n", + "\n", + "f = y*z^2 - y == z\n", + "print(f(2, 0))\n", + "print(f(z = 2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Symbolic computations\n", + "\n", + "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", + "\n", + "\\begin{align*}\n", + " \\begin{array}{llcc}\n", + " (1) & \\sum_{k=0}^nk &=&\\frac{n^2+n}{2}\\\\\n", + " (2) & \\sum_{k=0}^nk^4 &=&\\frac{6n^5+15n^4+10n^3-n}{30}\\\\\n", + " (3) & \\sum_{k=0}^n\\binom nk &=& 2^n\\\\\n", + " (4) & \\sum_{k=0}^\\infty \\frac1{k^2} &=& \\frac{\\pi^2}{6}\n", + " \\end{array}\n", + "\\end{align*}\n", + "Recall that $\\binom nk=\\frac{n!}{k!(n-k)!}$" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1) 1/2*n^2 + 1/2*n\n", + "(2) 1/5*n^5 + 1/2*n^4 + 1/3*n^3 - 1/30*n\n", + "(3) 2^n\n", + "(4) 1/6*pi^2\n" + ] + } + ], + "source": [ + "var('k', 'n') # Remember to declare all variables\n", + "\n", + "s = []\n", + "s.append( sum(k, k, 0, n) )\n", + "s.append( sum(k^4, k, 0, n) )\n", + "s.append( sum(binomial(n,k), k, 0, n) )\n", + "s.append( sum(1/k^2, k, 1, infinity) )\n", + "\n", + "for i in range(len(s)):\n", + " print(\"({}) {}\".format(i+1, s[i]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "factorial(n)^2" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(x^2).prod(x, 1, n)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(x + 1)^2 - (x - 1)^2\n", + "4*x\n" + ] + } + ], + "source": [ + "f = (x+1)^2 - (x-1)^2\n", + "print(f)\n", + "print(f.expand())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The Symbolic Ring\n", + "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html)]\n", + "\n", + "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\"." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-b*c + a*d\n", + "[(-a, 2)]\n" + ] + } + ], + "source": [ + "var('a', 'b', 'c', 'd')\n", + "\n", + "M = matrix([[a,b], [c,d]])\n", + "print(M.determinant())\n", + "\n", + "polring. = SR[]\n", + "f = x^2 + 2*a*x + a^2\n", + "print(f.roots())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the eigenvalues of the matrix\n", + "\\begin{align*}\n", + "\\begin{pmatrix}\n", + "\\cos \\alpha & \\sin \\alpha\\\\\n", + "-\\sin\\alpha & \\cos \\alpha\n", + "\\end{pmatrix}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-I\n" + ] + } + ], + "source": [ + "var('a')\n", + "M = matrix([[cos(a), sin(a)], [-sin(a), cos(a)]])\n", + "M.eigenvalues()\n", + "lam = M.eigenvalues()[0]\n", + "print(lam(pi/2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Calculus\n", + "**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)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Limits and series\n", + "\n", + "**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", + "\n", + "You can compute limits" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "+Infinity\n" + ] + } + ], + "source": [ + "var('x')\n", + "f = sin(x)/x\n", + "#print(f(0)) # This one gives an error\n", + "print( f.limit(x=0) )\n", + "\n", + "print( (e^(-x)).limit(x=-infinity) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the constant $e$ using a limit." + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "e^x" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "expression = (1+x/n)^n\n", + "expression.limit(n=infinity)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also specify a direction for the limit. If you don't, Sage assumes that you want to take a two-sided limit." + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "und\n", + "1\n", + "-1\n" + ] + }, + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = abs(x)/x # 1 if x>0, -1 if x<0\n", + "print( f.limit(x=0) ) # undefined\n", + "print( f.limit(x=0, dir=\"+\") )\n", + "print( f.limit(x=0, dir=\"-\") )\n", + "plot(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+Infinity\n", + "+Infinity\n", + "+Infinity\n" + ] + }, + { + "data": { + "image/png": "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HADFy8pmJypMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAPJKPB5XNBpVLBYLeigA0MmybTvXY3M+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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = 1/x^2\n", + "print( f.limit(x=0) )\n", + "print( f.limit(x=0, dir=\"+\") )\n", + "print( f.limit(x=0, dir=\"-\") )\n", + "plot(f, (x, -10, 10), ymax = 10, ymin = -10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is also the alternative notation `limit(f, x, dir)` which does the same as `f.limit(x, dir)`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also compute series expansions up to any order. **Watch out:** the notation uses `==` instead of `=` as `limit()` does." + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1*(x - 1) + (-1/2)*(x - 1)^2 + 1/3*(x - 1)^3 + Order((x - 1)^4)\n", + "1*x^2 + (-5/6)*x^4 + Order(x^6)\n" + ] + } + ], + "source": [ + "f = e^x\n", + "g = sin(x) - 2*cos(x)\n", + "h = log(x)\n", + "\n", + "#print(f.series(x==0, 5))\n", + "#print(g.series(x==0, 7))\n", + "print(h.series(x==1, 4))\n", + "\n", + "print((sin(x)^2*cos(x)).series(x==0, 6))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Derivatives\n", + "**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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When computing derivatives, you need to specify with respect to which variables you want to derive, except in case there is only one." + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8*y^3\n", + "6*x^2 - 1\n" + ] + } + ], + "source": [ + "var('y')\n", + "print( (x^2+2*y^4).derivative(y) ) # Alternative: derivative(f, y)\n", + "print( (2*x^3-x+2).derivative() )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also compute higher order derivatives:" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6*x\n", + "84*x^5*y + 10*y^4 + 24*x^2*y\n", + "1680*x^3 + 48\n" + ] + } + ], + "source": [ + "print( (x^3).derivative(x, x) ) # Same as (x^3).derivative(x, 2)\n", + "\n", + "f = x^7*y^2 + x^4*y^2 - 2*x^3 + x^2*y^5 + y + 2\n", + "print( f.derivative(x, x, y) ) # Twice in x, once in y\n", + "print( f.derivative(x, 4, y, 2) ) # 4 times in x, twice in y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jacobian and Hessian matrices are also easy to compute:" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-2*x + 2*y 2*x]\n", + "[ 0 3*y^2]\n", + "[ y + 1 x + 1] \n", + "\n", + "[ 2 -4*y + 1]\n", + "[ -4*y + 1 -4*x + 6*y]\n" + ] + } + ], + "source": [ + "f = (-x^2 + 2*x*y, y^3, x+y+x*y)\n", + "print( jacobian(f, [x,y]), \"\\n\" )\n", + "\n", + "g = x^2 + x*y + y^3 -2*x*y^2 -3\n", + "print( g.hessian() )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*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([...])`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Integrals\n", + "**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", + "\n", + "You should remember from high school or from your first calculus/analysis course that derivatives are easy, but integrals are hard.\n", + "When using a computer software to solve your integrals, you have two choices:\n", + "\n", + "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", + "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", + "\n", + "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)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Symbolic integration\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/2*x^2 - cos(x)\n", + "0\n", + "1/2*pi^2 + 2\n" + ] + } + ], + "source": [ + "var('a', 'b')\n", + "f = x + sin(x)\n", + "print( f.integral(x) ) # Alternative: integral(f, x)\n", + "print( f.integral(x, -10, 10) )\n", + "print( f.integral(x, 0, pi) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Your endpoints can also be $\\pm\\infty$:" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "sqrt(pi)\n" + ] + } + ], + "source": [ + "print( integral(e^(-x), x, 0, infinity) )\n", + "print( integral(e^(-x^2), x, -infinity, infinity) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The last function is also an example of an integral that perhaps you might want to compute numerically. In fact:" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/2*sqrt(pi)*erf(x)\n", + "1/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1)\n" + ] + } + ], + "source": [ + "print( integral(e^(-x^2), x) )\n", + "print( integral(e^(-x^2), x, 1, 2) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here `erf(x)` denotes the [error function](https://en.wikipedia.org/wiki/Error_function)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Numerical integration\n", + "\n", + "In order to get an explicit value for the computations above, we can use a *numerical* method.\n", + "\n", + "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", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.13525725794999466, 1.5016572202374808e-15)" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numerical_integral(e^(-x^2), 1, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result above means, in symbols\n", + "\\begin{align*}\n", + "\\int_1^2 e^{-x^2}\\mathrm dx = 0.13525725794999466 \\pm 1.5016572202374808\\times 10^{-15}\n", + "\\end{align*}\n", + "\n", + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the area of the ellipse of equation $y^2+\\left(\\frac x3\\right)^2=1$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Solution:** First, rewrite the equation as:\n", + "\\begin{align*}\n", + "y = \\sqrt{1- \\left(\\frac{x}{3}\\right)^2}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "3/2*pi" + ] + }, + "execution_count": 104, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y = sqrt(1-(x/3)^2)\n", + "show(plot(y, xmin=-3.1, xmax=3.1, ymin=-0.2, ymax=1.1))\n", + "integral(y, x, -3, 3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Differential equations\n", + "**Reference:** [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]\n", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "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()`." + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "_C*e^x" + ] + }, + "execution_count": 108, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('x')\n", + "function('f')\n", + "equation = derivative(f(x)) == f(x)\n", + "desolve(equation, f(x)) # f(x) is the unknown function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "We can also specify *initial conditions* for our function. For example we can impose that $f(0)=3$ as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3*e^x" + ] + }, + "execution_count": 109, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "desolve(equation, f(x), (0,3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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))$." + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e^(-1/2*x^2), x)" + ] + }, + "execution_count": 112, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "equation = derivative(f(x), x, 2) + x*derivative(f(x)) == 1\n", + "desolve(equation, f(x), (0, 0, 0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Use Sage to find out the functions $f(x)$ that satisfy\n", + "\\begin{align*}\n", + " \\begin{array}{rlcrl}\n", + " (A) &\n", + " \\begin{cases}\n", + " f(0) &= 1\\\\\n", + " f'(0) &= 0\\\\\n", + " f''(x) &= -f(x)\n", + " \\end{cases}\n", + " & \\qquad \\qquad &\n", + " (B) &\n", + " \\begin{cases}\n", + " f(0) &= 0\\\\\n", + " f'(0) &= 1\\\\\n", + " f''(x) &= -f(x)\n", + " \\end{cases}\n", + " \\end{array}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cos(x)\n", + "sin(x)\n", + "_K2*cos(x) + _K1*sin(x)\n" + ] + } + ], + "source": [ + "eq = derivative(f(x), x, 2) == -f(x)\n", + "conditions1 = (0,1,0)\n", + "conditions2 = (0,0,1)\n", + "print( desolve(eq, f(x), conditions1) )\n", + "print( desolve(eq, f(x), conditions2) )\n", + "print( desolve(eq, f(x)) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### A real-world example\n", + "\n", + "Differential equations have countless applications in Science, so it would be a shame not to see at least a simple one.\n", + "\n", + "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", + "\n", + "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", + "\n", + "Since the acceleration is the derivative of the velocity, we have a differential equation\n", + "\\begin{align*}\n", + " v'(t) = -g -kv(t)\n", + "\\end{align*}\n", + "and we can try to solve it with Sage!" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": {}, + "outputs": [], + "source": [ + "var('t')\n", + "function('v')\n", + "g = 9.8\n", + "k = 1.5\n", + "conditions = (0, 0) # Start with velocity 0\n", + "sol = desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions)\n", + "#plot(sol, xmin=0, xmax = 100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-(g*e^(k*t) - g)*e^(-k*t)/k" + ] + }, + "execution_count": 121, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('t', 'g', 'k')\n", + "function('v')\n", + "conditions = (0, 0) # Start with velocity 0\n", + "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions, ivar=t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic data analysis and visualization\n", + "\n", + "## Statistics\n", + "**References:** [[14](https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html)]\n", + "\n", + "Sage includes the most basic functions for statistical analysis." + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Values:\t [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n", + "Mean:\t\t\t 5/13\n", + "Median:\t\t\t 1\n", + "Mode:\t\t\t [3]\n", + "Standard deviation:\t 2*sqrt(29/13)\n", + "Variance:\t\t 116/13\n", + "Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5]\n" + ] + } + ], + "source": [ + "L = [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n", + "\n", + "print(\"Values:\\t\", L)\n", + "\n", + "print(\"Mean:\\t\\t\\t\", mean(L))\n", + "print(\"Median:\\t\\t\\t\", median(L))\n", + "print(\"Mode:\\t\\t\\t\", mode(L))\n", + "\n", + "print(\"Standard deviation:\\t\", std(L))\n", + "print(\"Variance:\\t\\t\", variance(L))\n", + "\n", + "print(\"Moving average (5):\", moving_average(L,5))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotting\n", + "**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", + "\n", + "Some Sage objects can be plotted:" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 123, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = sin(x)\n", + "plot(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sage's plotting functions are based on Python's [matplotlib](https://matplotlib.org/).\n", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hello\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "f = sin(x)\n", + "p = plot(f,\n", + " -2*pi, 2*pi, # bounds for x\n", + " ymin = -1.1, ymax = 1.1, # bounds for y\n", + " color = \"red\",\n", + " title = \"The sin function\",\n", + " )\n", + "print(\"hello\")\n", + "show(p)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you need to plot more than one object at the time, you can sum two plots and show them together with `show()`:" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "cosine = plot(cos(x), (x,-pi/2,pi/2), color=\"red\")\n", + "exponential = plot(exp(x), (x,-2,0.5))\n", + "\n", + "show(cosine + exponential) # works like print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 3 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "b = bar_chart(range(1,10))\n", + "s = scatter_plot([(1,5), (4,2), (8,8), (4,7)],\n", + " marker = \"*\", # symbol\n", + " markersize = 100,\n", + " edgecolor = \"green\",\n", + " facecolor = \"red\"\n", + " )\n", + "t = text(\"wow, such plot!\", (1, 8), color=\"black\", fontsize=20)\n", + "show(b + s + t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Interpolation\n", + "**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", + "\n", + "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", + "\n", + "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)." + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "metadata": {}, + "outputs": [ + { + "data": { + "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+++a1q2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\n", + "text/plain": [ + "Graphics object consisting of 3 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "points = [ (0,1), (1,2), (1.5,0), (2,4), (3,5) ]\n", + "polring. = QQ[] # you need to specify a polynomial ring\n", + "lp = polring.lagrange_polynomial(points)\n", + "show(scatter_plot(points, facecolor=\"red\")\n", + " + plot(lp, 0, 3) # slightly different notation for polynomials\n", + " + text(lp, (1,8), color=\"black\")\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "However, it does not always give you good approximation of your data:" + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "R = [x/10 for x in range(-10,10)]\n", + "L = [1/(1+25*x^2) for x in R]\n", + "points = [(R[i], L[i]) for i in range(len(L))]\n", + "polring. = RR[]\n", + "lp = polring.lagrange_polynomial(points)\n", + "\n", + "show(plot(lp, -0.92, 0.82) + scatter_plot(points))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show(plot(spline(points), -1, 1) + scatter_plot(points))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} 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 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "In this document we will describe some of these interactions between LaTeX and Sage." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The `show()` command\n", + "**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", + "\n", + "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", + "\n", + "You can see it as an alternative to `print()`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 + 1*x + 1/2*x^2 + 1/6*x^3 + Order(x^4)\n" + ] + }, + { + "data": { + "text/html": [ + "" + ], + "text/latex": [ + "\\begin{math}\n", + "\\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", + "\\end{math}" + ], + "text/plain": [ + "1 + 1*x + 1/2*x^2 + 1/6*x^3 + Order(x^4)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 1 2 3]\n", + "[ 4 5 6]\n", + "[ 8 9 10]\n" + ] + }, + { + "data": { + "text/html": [ + "" + ], + "text/latex": [ + "\\begin{math}\n", + "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n", + "1 & 2 & 3 \\\\\n", + "4 & 5 & 6 \\\\\n", + "8 & 9 & 10\n", + "\\end{array}\\right)\n", + "\\end{math}" + ], + "text/plain": [ + "[ 1 2 3]\n", + "[ 4 5 6]\n", + "[ 8 9 10]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "pi\n" + ] + }, + { + "data": { + "text/html": [ + "" + ], + "text/latex": [ + "\\begin{math}\n", + "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\pi\n", + "\\end{math}" + ], + "text/plain": [ + "pi" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "s = (e^x).series(x==0, 4)\n", + "M = matrix([[1,2,3],[4,5,6],[8,9,10]])\n", + "print(s)\n", + "show(s)\n", + "print(M)\n", + "show(M)\n", + "print(pi)\n", + "show(pi)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In a Jupyter notebook, the results above are displayed using [MathJax](https://www.mathjax.org/).\n", + "\n", + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The `latex()` command\n", + "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/misc/sage/misc/latex.html)]\n", + "\n", + "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", + "\n", + "Technically, this is a function that returns a string, so you need to `print()` it to see the result." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 + 1 x + \\frac{1}{2} x^{2} + \\frac{1}{6} x^{3} + \\mathcal{O}\\left(x^{4}\\right)\n", + "\n", + "\n", + "\\left(\\begin{array}{rrr}\n", + "1 & 2 & 3 \\\\\n", + "4 & 5 & 6 \\\\\n", + "8 & 9 & 10\n", + "\\end{array}\\right)\n" + ] + } + ], + "source": [ + "print(latex(s))\n", + "print(\"\\n\")\n", + "print(latex(M))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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)." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "#latex(plot(x^2)) # The output is more than 20 pages long" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It is probably easier to just generate the picture and include that in your Latex document with `\\includegraphics`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## A Latex name for your variables\n", + "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/var.html)]\n", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "phi1(epsilon)\n" + ] + }, + { + "data": { + "text/html": [ + "" + ], + "text/latex": [ + "\\begin{math}\n", + "\\newcommand{\\Bold}[1]{\\mathbf{#1}}e^{{\\epsilon}} + \\phi_1\\left({\\epsilon}\\right)\n", + "\\end{math}" + ], + "text/plain": [ + "e^epsilon + phi1(epsilon)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "e^{{\\epsilon}} + \\phi_1\\left({\\epsilon}\\right)" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('epsilon', latex_name=\"\\\\epsilon\")\n", + "function('phi1', latex_name=\"\\\\phi_1\")\n", + "\n", + "print(phi1(epsilon))\n", + "show(phi1(epsilon) + e^epsilon)\n", + "latex(phi1(epsilon) + e^epsilon)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# From Jupyter to Latex\n", + "**Reference:** [[4](https://nbconvert.readthedocs.io/en/latest/)]\n", + "\n", + "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", + "\n", + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# SageTex\n", + "**Reference:** [[5](https://doc.sagemath.org/html/en/tutorial/sagetex.html)]\n", + "\n", + "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", + "\n", + "You might need to take some extra steps to make this work on your system, see the link above." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The Latex `listings` package\n", + "**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", + "\n", + "If you want to include some code (Sage, Python or anything else) in a Latex document you can use the listings package.\n", + "\n", + "```\n", + "\\usepackage{listings}\n", + "\n", + "...\n", + "\n", + "\\begin{lstlisting}[language=Python]\n", + "for i in range(0,100):\n", + " if i%5 == 0:\n", + " print(\"Multiple of 5!\")\n", + "\\end{lstlisting}\n", + "```\n", + "\n", + "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", + "\n", + "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", + "\n", + "```\n", + "\\lstinputlisting[language=Python]{file.py}\n", + "```\n", + "\n", + "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." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} 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 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\providecommand \oddpage@label [2]{} +\@writefile{toc}{\contentsline {section}{\numberline {1}Symbolic expressions}{1}{section.1}\protected@file@percent } +\newlabel{symbolic-expressions}{{1}{1}{Symbolic expressions}{section.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}Solving equations and inequalities}{1}{subsection.1.1}\protected@file@percent } +\newlabel{solving-equations-and-inequalities}{{1.1}{1}{Solving equations and inequalities}{subsection.1.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.1}The set of solutions}{2}{subsubsection.1.1.1}\protected@file@percent } +\newlabel{the-set-of-solutions}{{1.1.1}{2}{The set of solutions}{subsubsection.1.1.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.2}Alternative method for real roots: \texttt {find\_root()}}{3}{subsubsection.1.1.2}\protected@file@percent } +\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}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.2}Evaluating functions}{3}{subsection.1.2}\protected@file@percent } +\newlabel{evaluating-functions}{{1.2}{3}{Evaluating functions}{subsection.1.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.3}Symbolic computations}{4}{subsection.1.3}\protected@file@percent } +\newlabel{symbolic-computations}{{1.3}{4}{Symbolic computations}{subsection.1.3}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.3.1}The Symbolic Ring}{5}{subsubsection.1.3.1}\protected@file@percent } +\newlabel{the-symbolic-ring}{{1.3.1}{5}{The Symbolic Ring}{subsubsection.1.3.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {2}Calculus}{5}{section.2}\protected@file@percent } +\newlabel{calculus}{{2}{5}{Calculus}{section.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Limits and series}{5}{subsection.2.1}\protected@file@percent } +\newlabel{limits-and-series}{{2.1}{5}{Limits and series}{subsection.2.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}Derivatives}{6}{subsection.2.2}\protected@file@percent } +\newlabel{derivatives}{{2.2}{6}{Derivatives}{subsection.2.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}Integrals}{7}{subsection.2.3}\protected@file@percent } +\newlabel{integrals}{{2.3}{7}{Integrals}{subsection.2.3}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.3.1}Symbolic integration}{7}{subsubsection.2.3.1}\protected@file@percent } +\newlabel{symbolic-integration}{{2.3.1}{7}{Symbolic integration}{subsubsection.2.3.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.3.2}Numerical integration}{8}{subsubsection.2.3.2}\protected@file@percent } +\newlabel{numerical-integration}{{2.3.2}{8}{Numerical integration}{subsubsection.2.3.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.4}Differential equations}{9}{subsection.2.4}\protected@file@percent } +\newlabel{differential-equations}{{2.4}{9}{Differential equations}{subsection.2.4}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.4.1}A real-world example}{10}{subsubsection.2.4.1}\protected@file@percent } +\newlabel{a-real-world-example}{{2.4.1}{10}{A real-world example}{subsubsection.2.4.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {3}Basic data analysis and visualization}{10}{section.3}\protected@file@percent } +\newlabel{basic-data-analysis-and-visualization}{{3}{10}{Basic data analysis and visualization}{section.3}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Statistics}{10}{subsection.3.1}\protected@file@percent } +\newlabel{statistics}{{3.1}{10}{Statistics}{subsection.3.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Plotting}{11}{subsection.3.2}\protected@file@percent } +\newlabel{plotting}{{3.2}{11}{Plotting}{subsection.3.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.3}Interpolation}{15}{subsection.3.3}\protected@file@percent } +\newlabel{interpolation}{{3.3}{15}{Interpolation}{subsection.3.3}{}} +\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 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Symbolic expressions\n", + "\n", + "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n", + "\n", + "Last time we saw the basics of symbolic expressions:\n", + "* How to define and manipulate symbolic expressions\n", + "* How to introduce new variables (in the Mathematical sense) with `var()`\n", + "* How to solve equations and inequalities\n", + "* Some of the Mathematical constants that are included in Sage, and how to approximate them using `n()`\n", + "\n", + "Here are some examples to remind you of these basic things:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\n", + "x == -sqrt(-pi),\n", + "x == sqrt(-pi)\n", + "]\n", + "[\n", + "z == -sqrt(pi + x^2),\n", + "z == sqrt(pi + x^2)\n", + "]\n", + "[[y < -2], [y > 1]]\n", + "2*pi + e is approximately 9.00146713563863\n" + ] + } + ], + "source": [ + "var('y', 'z') # Define new variables (x is already defined by Sage)\n", + "f = x^2 + pi\n", + "g = y^2 + y - 2 > 0\n", + "print( solve(f==0, x) )\n", + "print( solve(z^2 - f, z) )\n", + "print( solve(g, y) )\n", + "print( 2*pi + e, \"is approximately\", n(2*pi + e) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we will see some more details about solving equations and manipulating their solutions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solving equations and inequalities\n", + "\n", + "**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", + "\n", + "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", + "\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " x + y = 2 \\\\\n", + " 2x - y = 6\n", + " \\end{cases}\n", + "\\end{align*}\n", + "\n", + "Can be solved as" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[x == (8/3), y == (-2/3)]]" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solve([x+y == 2, 2*x - y == 6], [x,y])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The set of solutions\n", + "\n", + "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)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "x == -3" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solutions = solve(x^2-9 == 0, x)\n", + "solutions[0] # This is the expression 'x == -3'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "rhs: 2\n", + "lhs: x\n" + ] + } + ], + "source": [ + "f = x == 2\n", + "print(\"rhs:\", f.rhs())\n", + "print(\"lhs:\", f.lhs())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Simple inequality: [[x < -3], [x > 3]]\n", + "System of inequalities:\n", + " [\n", + "[3 < x, x < 6],\n", + "[x < -3]\n", + "]\n" + ] + } + ], + "source": [ + "print(\"Simple inequality:\", solve(x^2-9 > 0, x))\n", + "print(\"System of inequalities:\\n\", solve([x^2-9 > 0, x < 6], x))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the last example (system of inequalities), Sage is telling us that the system\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " x^2-9 > 9 \\\\\n", + " x < 6\n", + " \\end{cases}\n", + "\\end{align*}\n", + "has two solutions:\n", + "* $x$ is between $3$ and $6$;\n", + "* $x$ is less than $-3$.\n", + "\n", + "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" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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)$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{x: 8/3, y: -2/3}]" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solve([x+y == 2, 2*x - y == 6], [x,y], solution_dict=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Alternative method for real roots: `find_root()`\n", + "\n", + "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", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using solve():\n", + " [\n", + "x == -e^x + 10\n", + "]\n", + "Using find_root(): 2.070579904980303\n" + ] + } + ], + "source": [ + "f = e^x + x - 10\n", + "print(\"Using solve():\\n\", solve(f, x))\n", + "print(\"Using find_root():\", f.find_root(0,100))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluating functions\n", + "\n", + "If an expression contains only one variable you can evaluate it easily, even if it is not a function." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "y + 3 > (y + 3)^2\n" + ] + } + ], + "source": [ + "var('y')\n", + "f = x^2-3\n", + "g = x > x^2\n", + "\n", + "print(f(2))\n", + "print(g(3+y))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-2 == 0\n", + "3*y == 2\n" + ] + } + ], + "source": [ + "var('y','z')\n", + "\n", + "f = y*z^2 - y == z\n", + "print(f(2, 0))\n", + "print(f(z=2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Symbolic computations\n", + "\n", + "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", + "\n", + "\\begin{align*}\n", + " \\begin{array}{llcc}\n", + " (1) & \\sum_{k=0}^nk &=&\\frac{n^2+n}{2}\\\\\n", + " (2) & \\sum_{k=0}^nk^4 &=&\\frac{6n^5+15n^4+10n^3-n}{30}\\\\\n", + " (3) & \\sum_{k=0}^n\\binom nk &=& 2^n\\\\\n", + " (4) & \\sum_{k=0}^\\infty \\frac1{k^2} &=& \\frac{\\pi^2}{6}\n", + " \\end{array}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1) 1/2*n^2 + 1/2*n\n", + "(2) 1/5*n^5 + 1/2*n^4 + 1/3*n^3 - 1/30*n\n", + "(3) 2^n\n", + "(4) 1/6*pi^2\n" + ] + } + ], + "source": [ + "var('k', 'n') # Remember to declare all variables\n", + "\n", + "s = []\n", + "s.append( sum(k, k, 0, n) )\n", + "s.append( sum(k^4, k, 0, n) )\n", + "s.append( sum(binomial(n,k), k, 0, n) )\n", + "s.append( sum(1/k^2, k, 1, infinity) )\n", + "\n", + "for i in range(len(s)):\n", + " print(\"({}) {}\".format(i+1, s[i]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(x + 1)^2 - (x - 1)^2\n", + "4*x\n" + ] + } + ], + "source": [ + "f = (x+1)^2 - (x-1)^2\n", + "print(f)\n", + "print(f.expand())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The Symbolic Ring\n", + "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html)]\n", + "\n", + "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\"." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-b*c + a*d\n", + "[(-a, 2)]\n" + ] + } + ], + "source": [ + "var('a', 'b', 'c', 'd')\n", + "\n", + "M = matrix([[a,b], [c,d]])\n", + "print(M.determinant())\n", + "\n", + "polring. = SR[]\n", + "f = x^2 + 2*a*x + a^2\n", + "print(f.roots())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the eigenvalues of the matrix\n", + "\\begin{align*}\n", + "\\begin{pmatrix}\n", + "\\cos \\alpha & \\sin \\alpha\\\\\n", + "-\\sin\\alpha & \\cos \\alpha\n", + "\\end{pmatrix}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Calculus\n", + "**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)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Limits and series\n", + "\n", + "**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", + "\n", + "You can compute limits" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "0\n" + ] + } + ], + "source": [ + "f = sin(x)/x\n", + "# print(f(0)) # This one gives an error\n", + "print( f.limit(x=0) )\n", + "\n", + "print( (e^(-x)).limit(x=infinity) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the constant $e$ using a limit." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also specify a direction for the limit. If you don't, Sage assumes that you want to take a two-sided limit." + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "und\n", + "1\n", + "-1\n" + ] + } + ], + "source": [ + "f = abs(x)/x # 1 if x>0, -1 if x<0\n", + "print( f.limit(x=0) ) # undefined\n", + "print( f.limit(x=0, dir=\"+\") )\n", + "print( f.limit(x=0, dir=\"-\") )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is also the alternative notation `limit(f, x, dir)` which does the same as `f.limit(x, dir)`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also compute series expansions up to any order. **Watch out:** the notation uses `==` instead of `=` as `limit()` does." + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 + 1*x + 1/2*x^2 + Order(x^3)\n", + "(-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", + "1*(x - 1) + (-1/2)*(x - 1)^2 + Order((x - 1)^3)\n" + ] + } + ], + "source": [ + "f = e^x\n", + "g = sin(x) - 2*cos(x)\n", + "h = log(x)\n", + "\n", + "print(f.series(x==0, 3))\n", + "print(g.series(x==0, 7))\n", + "print(h.series(x==1, 3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Derivatives\n", + "**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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When computing derivatives, you need to specify with respect to which variables you want to derive, except in case there is only one." + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8*y^3\n", + "6*x^2 - 1\n" + ] + } + ], + "source": [ + "var('y')\n", + "print( (x^2+2*y^4).derivative(y) ) # Alternative: derivative(f, y)\n", + "print( (2*x^3-x+2).derivative() )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also compute higher order derivatives:" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6*x\n", + "84*x^5*y + 10*y^4 + 24*x^2*y\n", + "1680*x^3 + 48\n" + ] + } + ], + "source": [ + "print( (x^3).derivative(x, x) ) # Same as (x^3).derivative(x, 2)\n", + "\n", + "f = x^7*y^2 + x^4*y^2 - 2*x^3 + x^2*y^5 + y + 2\n", + "print( f.derivative(x, x, y) ) # Twice in x, once in y\n", + "print( f.derivative(x, 4, y, 2) ) # 4 times in x, twice in y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jacobian and Hessian matrices are also easy to compute:" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-2*x + 2*y 2*x]\n", + "[ 0 3*y^2]\n", + "[ y + 1 x + 1] \n", + "\n", + "[ 2 -4*y + 1]\n", + "[ -4*y + 1 -4*x + 6*y]\n" + ] + } + ], + "source": [ + "f = (-x^2 + 2*x*y, y^3, x+y+x*y)\n", + "print( jacobian(f, [x,y]), \"\\n\" )\n", + "\n", + "g = x^2 + x*y + y^3 -2*x*y^2 -3\n", + "print( g.hessian() )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*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([...])`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Integrals\n", + "**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", + "\n", + "You should remember from high school or from your first calculus/analysis course that derivatives are easy, but integrals are hard.\n", + "When using a computer software to solve your integrals, you have two choices:\n", + "\n", + "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", + "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", + "\n", + "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)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Symbolic integration\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/2*x^2 - cos(x)\n", + "0\n", + "-1/2*a^2 + 1/2*b^2 + cos(a) - cos(b)\n" + ] + } + ], + "source": [ + "var('a', 'b')\n", + "f = x + sin(x)\n", + "print( f.integral(x) ) # Alternative: integral(f, x)\n", + "print( f.integral(x, -10, 10) )\n", + "print( f.integral(x, a, b) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Your endpoints can also be $\\pm\\infty$:" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "sqrt(pi)\n" + ] + } + ], + "source": [ + "print( integral(e^(-x), x, 0, infinity) )\n", + "print( integral(e^(-x^2), x, -infinity, infinity) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The last function is also an example of an integral that perhaps you might want to compute numerically. In fact:" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/2*sqrt(pi)*erf(x)\n", + "1/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1)\n" + ] + } + ], + "source": [ + "print( integral(e^(-x^2), x) )\n", + "print( integral(e^(-x^2), x, 1, 2) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here `erf(x)` denotes the [error function](https://en.wikipedia.org/wiki/Error_function)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Numerical integration\n", + "\n", + "In order to get an explicit value for the computations above, we can use a *numerical* method.\n", + "\n", + "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", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.13525725794999466, 1.5016572202374808e-15)" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numerical_integral(e^(-x^2), 1, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result above means, in symbols\n", + "\\begin{align*}\n", + "\\int_1^2 e^{-x^2}\\mathrm dx = 0.13525725794999466 \\pm 1.5016572202374808\\times 10^{-15}\n", + "\\end{align*}\n", + "\n", + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the area of the ellipse of equation $y^2+\\left(\\frac x3\\right)^2=1$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Differential equations\n", + "**Reference:** [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]\n", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "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()`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "_C*e^x" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('x')\n", + "function('f')\n", + "equation = derivative(f(x)) == f(x)\n", + "desolve(equation, f(x)) # f is the unknown function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "We can also specify *initial conditions* for our function. For example we can impose that $f(0)=3$ as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3*e^x" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "desolve(equation, f(x), (0,3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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))$." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e^(-1/2*x^2), x)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "equation = derivative(f(x), x, 2) + x*derivative(f(x)) == 1\n", + "desolve(equation, f(x), (0, 0, 0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Use Sage to find out the functions $f(x)$ that satisfy\n", + "\\begin{align*}\n", + " \\begin{array}{rlcrl}\n", + " (A) &\n", + " \\begin{cases}\n", + " f(0) &= 1\\\\\n", + " f'(0) &= 0\\\\\n", + " f''(x) &= -f(x)\n", + " \\end{cases}\n", + " & \\qquad \\qquad &\n", + " (B) &\n", + " \\begin{cases}\n", + " f(0) &= 0\\\\\n", + " f'(0) &= 1\\\\\n", + " f''(x) &= -f(x)\n", + " \\end{cases}\n", + " \\end{array}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### A real-world example\n", + "\n", + "Differential equations have countless applications in Science, so it would be a shame not to see at least a simple one.\n", + "\n", + "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", + "\n", + "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", + "\n", + "Since the acceleration is the derivative of the velocity, we have a differential equation\n", + "\\begin{align*}\n", + " v'(t) = -g -kv(t)\n", + "\\end{align*}\n", + "and we can try to solve it with Sage!" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-98/15*(e^(3/2*t) - 1)*e^(-3/2*t)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('t')\n", + "function('v')\n", + "g = 9.8\n", + "k = 1.5\n", + "conditions = (0, 0) # Start with velocity 0\n", + "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-(g*e^(k*t) - g)*e^(-k*t)/k" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('t', 'g', 'k')\n", + "function('v')\n", + "conditions = (0, 0) # Start with velocity 0\n", + "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions, ivar=t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic data analysis and visualization\n", + "\n", + "## Statistics\n", + "**References:** [[14](https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html)]\n", + "\n", + "Sage includes the most basic functions for statistical analysis." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Values:\t [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n", + "Mean:\t\t\t 5/13\n", + "Median:\t\t\t 1\n", + "Mode:\t\t\t [3]\n", + "Standard deviation:\t 2*sqrt(29/13)\n", + "Variance:\t\t 116/13\n", + "Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5]\n" + ] + } + ], + "source": [ + "L = [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n", + "\n", + "print(\"Values:\\t\", L)\n", + "\n", + "print(\"Mean:\\t\\t\\t\", mean(L))\n", + "print(\"Median:\\t\\t\\t\", median(L))\n", + "print(\"Mode:\\t\\t\\t\", mode(L))\n", + "\n", + "print(\"Standard deviation:\\t\", std(L))\n", + "print(\"Variance:\\t\\t\", variance(L))\n", + "\n", + "print(\"Moving average (5):\", moving_average(L,5))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotting\n", + "**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", + "\n", + "Some Sage objects can be plotted:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = sin(x)\n", + "plot(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sage's plotting functions are based on Python's [matplotlib](https://matplotlib.org/).\n", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = sin(x)\n", + "plot(f,\n", + " -2*pi, 2*pi, # bounds for x\n", + " ymin = -0.7, ymax = 0.7, # bounds for y\n", + " color = \"red\",\n", + " title = \"The sin function\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you need to plot more than one object at the time, you can sum two plots and show them together with `show()`:" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "cosine = plot(cos(x), (x,-pi/2,pi/2), color=\"red\")\n", + "exponential = plot(exp(x), (x,-2,0.5))\n", + "\n", + "show(cosine + exponential)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 3 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "b = bar_chart(range(1,10))\n", + "s = scatter_plot([(1,5), (4,2), (8,8), (4,7)],\n", + " marker = \"*\", # symbol\n", + " markersize = 100,\n", + " edgecolor = \"black\",\n", + " facecolor = \"red\"\n", + " )\n", + "t = text(\"wow, such plot!\", (1, 8), color=\"black\", fontsize=20)\n", + "show(b + s + t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Interpolation\n", + "**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", + "\n", + "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", + "\n", + "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)." + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkoAAAGECAYAAADJKQ/AAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAA9hAAAPYQGoP6dpAABZH0lEQVR4nO3deZyNdf/H8dc1M5axzGQJ2QulQRSTRJZIqTRRWpBSKXuoLG1oueUuWzVDUlpUurOm0qKSJUmJskVpoUSoGTKGmfn+/via+Rmzz5xzrrO8n4/HeUzOXOe63nPmauYz39UxxiAiIiIi2YW5HUBERETEX6lQEhEREcmFCiURERGRXKhQEhEREcmFCiURERGRXKhQEhEREcmFCiURERGRXPhdoeRYUY7jOG5nERERkdAW4ePr5bu6ZWJiItHR0SQmJvoij4iIiISmAjXI+F2LkoiIiIi/UKEkIiIikgsVSiIiIiK5UKEkIiIikgsVSiIiIiK58PWsNxEREfGA5GTYuBG+/x727oUDByA8HKKi4KyzoGlTOPdciNBv+mLR2yciIhIgjhyBt9+GefPgk09ssRQWBpUq2Ud6OiQm2sIJ7HPXXAO33ALt24NWKCw8db2JiIj4uYMHYfRoqFkTbrvNFkPjx8O6dbZ42rcPtm6FH36AP/+Ef/6B5cvhrrtg9Wq49FJo3hwWLwaT74qGcjLH+PYdy/diSUlJmQtORkVF+SKTiIiIX0pJgcmTYeJESEuD/v3to169gp/DGFi2DJ58Ej79FDp2hOefL9w5gpR3Fpx0HKet4zhLHMf5w3Ec4zjOtad83nEcZ9yJzyc7jrPccZxGhb2OiIhIKFu3Di64AMaOhVtvhZ9+gqeeKnyB4zhw2WW2WHr3Xfj5Z2jWDGbPVutSQRSl660ssBEYnMvnRwIjTnw+FvgT+NhxnPJFSigiIhJC0tLgoYfgoougdGn45huYNg2qVCneeR0HrroKNmyAHj3g9ttt69Tx4x6JHbQKPZjbGLMUWApw6r61JzayHQY8YYxZcOK5W4G9QM9iZhUREQlqBw/CTTfZLrLx42HUKChRwrPXKF8eXnoJLrnEjmH65Rc7QFyjXXLm6VlvZwLVgI8ynjDGpDiO8zlwcU4vSElJISUlJfPfSUlJHo4kIiLi/zZvhq5dISkJPvrIDsD2pr59oXZtuO466NzZXlPFUnaenvVW7cTHvac8v/ekz2UxYcIEoqOjMx+1atXycCQRERH/9uWXtoWnfHn4+mvvF0kZOna0Y5e2bYMrroBDh3xz3UDireUBTh0e5uTwHABjxowhMTEx87Fr1y4vRRIREfE/H39sC5bGjWHFCqhb17fXb9HCZti8GW68EVJTfXt9f+fpQunPEx9PbT2qQvZWJgBKlSpFVFRUloeIiEgoePddO8C6fXv44AOIjnYnR2ysXcTyo4/gnns0G+5kni6UfsYWS5dlPOE4TkmgHfCFh68lIiISsD75BK6/Hq6+GhYtgjJl3M1z2WUwfTokJNiHWEVZR6mc4zjNHMdpduKpM0/8u7axq1dOBR5wHKeb4ziNgZeBI8AbHsosIiIS0Nasgbg46NAB3nzT8zPbiqpfPxg6FEaMsMsSSBFW5nYcpz3wWQ6fesUYc9uJJQLGAncDFYC1wCBjzCa0MreIiIS47duhVSto1Mh2t7ndknSqY8egTRu7ye769e51B/pAgVbm1hYmIiIiPrJ/vy2SIiLgiy+gQgW3E+Xs55/h/PPtTLi5c91O4zXe2cJERERECu/oUbj2Wruh7Xvv+W+RBHDmmTBjBrz1lh3kHcpUKImIiHiZMTBwoF0jafFiOOsstxPl78YboXt3m3v/frfTuEeFkoiIiJe98ILdhHbmTNv1Fggcx85+S0uDYcPcTuMeFUoiIiJetG4dDBliN6Dt08ftNIVTtSpMmgSvv24XwwxFGswtIiLiJfv3Q/PmUK2aLTRKlXI7UeGlp0Pr1vDvv3YWXISnd4l1jwZzi4iIuMUYuP12W2DMmxeYRRJAWBg8+yxs2mQHeIcaFUoiIiJeMGMGLFkCL78Mgb7fe4sWcMcd8PDDoTewW4WSiIiIh23dale3HjjQblESDP7zHzuwe8IEt5P4lgolERERD0pJgZtvtmsRPfWU22k85/TT4d57IT4edu1yO43v+E2hFB8fT0xMDLGxsW5HERERKbKHH4YtW+CNN/xve5LiGjECypeHRx91O4nvaNabiIiIh6xdCxdfDE88AaNHu53GO6ZMgfvvt8Xg2We7naZYtNebiIiIr6SkwAUX2FakNWuCahp9FkeP2gKpbVuYM8ftNMWi5QFERER85dFHYccOuwJ3sBZJAKVL2xaluXPt5rnBToWSiIhIMa1fDxMn2vFJjRu7ncb77rgDKlYMrsHquVGhJCIiUgxpaXDXXdCoUfCOSzpVmTJwzz3w0kvw559up/EuFUoiIiLFMGMGfPON/ViihNtpfGfQIChZ0g7uDmYqlERERIrozz/hgQegXz9o1crtNL512ml2Qc3p0+Gff9xO4z0qlERERIpoxAjbqvLkk24nccewYXYW3OzZbifxHhVKIiIiRbBsGbz5Jjz9tB3YHIqqVYMbboDnnrNjtYKRCiUREZFCSkmxY3TatoU+fdxO464hQ2DnTli61O0k3qFCSUREpJCefRZ++gkSEsAp0LKFwatlS7jwQnjmGbeTeIcKJRERkULYtw8eewwGDLBLAohtVfr4Y9i61e0knqdCSUREpBAeeQTCwmDcOLeT+I8ePaBqVdvCFmxUKImIiBTQd9/BCy/YIqlSJbfT+I9SpaBvX7v3W3Ky22k8S4WSiIhIARgDw4dDgwZ2/SDJ6vbb7XpKCxe6ncSzVCiJiIgUwDvvwKefwqRJobUCd0E1aADt28OsWW4n8Sy/KZTi4+OJiYkhNjbW7SgiIiJZHDsG990Hl18OV17pdhr/deed8Nln8OOPbifxHMcY48vr5XuxpKQkoqOjSUxMJCoqyheZRERE8hQfb2d2ffcdNG7sdhr/lZwM1atD//4wYYLbafJVoIUd/KZFSURExB8dPgyPPgq33qoiKT+RkdC7N7z8MqSmup3GM1QoiYiI5GHyZEhMhPHj3U4SGPr0sZsFf/qp20k8Q4WSiIhILv76C556ym5XUru222kCQ4sWdmD366+7ncQzVCiJiIjk4okn7OKSDzzgdpLA4TjQqxcsWABHjridpvhUKImIiOTgl19g+nQYOVKLSxZWr152bNeSJW4nKT4VSiIiIjl45BGoWBGGDXM7SeCpX99ulhsM3W8qlERERE6xebPdjuORR6BsWbfTBKZevWDpUti/3+0kxaNCSURE5BTjx0OdOnDHHW4nCVw33mi3fXn7bbeTFI8KJRERkZN8/7395f7gg1CypNtpAleVKnDZZfDGG24nKR4VSiIiIicZPx7OPNMuMCnF06MHrF5t11UKVCqURERETti4EebPh4ce0sa3nhAXZ5dXWLjQ7SRFp73eRERETuje3RZL27apUPKUyy6zY5WWLXM7STba601ERKSgNmywLR8PP6wiyZOuuw6WL4cDB9xOUjQqlERERIBx4+z6P717u50kuFx7LaSnw+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", + "text/plain": [ + "Graphics object consisting of 3 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "points = [ (0,1), (1,2), (1.5,0), (2,4), (3,5) ]\n", + "polring. = QQ[] # you need to specify a polynomial ring\n", + "lp = polring.lagrange_polynomial(points)\n", + "show(scatter_plot(points, facecolor=\"red\")\n", + " + plot(lp, 0, 3) # slightly different notation for polynomials\n", + " + text(lp, (1,8), color=\"black\")\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "However, it does not always give you good approximation of your data:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "R = [x/10 for x in range(-10,10)]\n", + "L = [1/(1+25*x^2) for x in R]\n", + "points = [(R[i], L[i]) for i in range(len(L))]\n", + "polring. = RR[]\n", + "lp = polring.lagrange_polynomial(points)\n", + "\n", + "show(plot(lp, -0.82, 0.72) + scatter_plot(points))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show(plot(spline(points), -1, 1) + scatter_plot(points))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} 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 @@ +This 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 +entering extended mode + \write18 enabled. + %&-line parsing enabled. +**8-SageCalculus.tex +(./8-SageCalculus.tex +LaTeX2e <2020-10-01> patch level 2 +L3 programming layer <2020-12-03> xparse <2020-03-03> +(/usr/share/texmf-dist/tex/latex/base/article.cls +Document Class: article 2020/04/10 v1.4m Standard LaTeX document class +(/usr/share/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2020/04/10 v1.4m Standard LaTeX file (size option) +) +\c@part=\count177 +\c@section=\count178 +\c@subsection=\count179 +\c@subsubsection=\count180 +\c@paragraph=\count181 +\c@subparagraph=\count182 +\c@figure=\count183 +\c@table=\count184 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/share/texmf-dist/tex/latex/tcolorbox/tcolorbox.sty +Package: tcolorbox 2020/10/09 version 4.42 text color boxes + +(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty +(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks15 +\pgfutil@tempdima=\dimen139 +\pgfutil@tempdimb=\dimen140 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex)) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box47 +) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a) +)) +Package: pgf 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty +(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks16 +) +(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. + +(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen141 +\Gin@req@width=\dimen142 +) +(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks17 +\pgfkeys@temptoks=\toks18 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex +\pgfkeys@tmptoks=\toks19 +)) +\pgf@x=\dimen143 +\pgf@y=\dimen144 +\pgf@xa=\dimen145 +\pgf@ya=\dimen146 +\pgf@xb=\dimen147 +\pgf@yb=\dimen148 +\pgf@xc=\dimen149 +\pgf@yc=\dimen150 +\pgf@xd=\dimen151 +\pgf@yd=\dimen152 +\w@pgf@writea=\write3 +\r@pgf@reada=\read2 +\c@pgf@counta=\count185 +\c@pgf@countb=\count186 +\c@pgf@countc=\count187 +\c@pgf@countd=\count188 +\t@pgf@toka=\toks20 +\t@pgf@tokb=\toks21 +\t@pgf@tokc=\toks22 +\pgf@sys@id@count=\count189 + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a) +) +Driver file for pgf: pgfsys-pdftex.def + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def +File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex +File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfsyssoftpath@smallbuffer@items=\count190 +\pgfsyssoftpath@bigbuffer@items=\count191 +) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex +File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen153 +\pgfmath@count=\count192 +\pgfmath@box=\box48 +\pgfmath@toks=\toks23 +\pgfmath@stack@operand=\toks24 +\pgfmath@stack@operation=\toks25 +) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code +.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te +x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics +.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count193 +)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex +File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@picminx=\dimen154 +\pgf@picmaxx=\dimen155 +\pgf@picminy=\dimen156 +\pgf@picmaxy=\dimen157 +\pgf@pathminx=\dimen158 +\pgf@pathmaxx=\dimen159 +\pgf@pathminy=\dimen160 +\pgf@pathmaxy=\dimen161 +\pgf@xx=\dimen162 +\pgf@xy=\dimen163 +\pgf@yx=\dimen164 +\pgf@yy=\dimen165 +\pgf@zx=\dimen166 +\pgf@zy=\dimen167 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex +File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@path@lastx=\dimen168 +\pgf@path@lasty=\dimen169 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex +File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@shorten@end@additional=\dimen170 +\pgf@shorten@start@additional=\dimen171 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex +File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfpic=\box49 +\pgf@hbox=\box50 +\pgf@layerbox@main=\box51 +\pgf@picture@serial@count=\count194 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex +File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgflinewidth=\dimen172 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t +ex +File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@pt@x=\dimen173 +\pgf@pt@y=\dimen174 +\pgf@pt@temp=\dimen175 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex +File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex +File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te +x +File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex +File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfarrowsep=\dimen176 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@max=\dimen177 +\pgf@sys@shading@range@num=\count195 +\pgf@shadingcount=\count196 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex +File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex +File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfexternal@startupbox=\box52 +)) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex +File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex +File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex +File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex +File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex +File: pgfmoduleshapes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfnodeparttextbox=\box53 +) +(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex +File: pgfmoduleplot.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty +Package: pgfcomp-version-0-65 2020/12/01 v3.1.7a (3.1.7a) +\pgf@nodesepstart=\dimen178 +\pgf@nodesepend=\dimen179 +) +(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty +Package: pgfcomp-version-1-18 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/latex/tools/verbatim.sty +Package: verbatim 2020-07-07 v1.5u LaTeX2e package for verbatim enhancements +\every@verbatim=\toks26 +\verbatim@line=\toks27 +\verbatim@in@stream=\read3 +) +(/usr/share/texmf-dist/tex/latex/environ/environ.sty +Package: environ 2014/05/04 v0.3 A new way to define environments + +(/usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty +Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list +) +\@envbody=\toks28 +) +(/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count197 +) +\tcb@titlebox=\box54 +\tcb@upperbox=\box55 +\tcb@lowerbox=\box56 +\tcb@phantombox=\box57 +\c@tcbbreakpart=\count198 +\c@tcblayer=\count199 +\c@tcolorbox@number=\count266 +\tcb@temp=\box58 +\tcb@temp=\box59 +\tcb@temp=\box60 +\tcb@temp=\box61 +\tcb@out=\write4 +\tcb@record@out=\write5 + +(/usr/share/texmf-dist/tex/latex/tcolorbox/tcbbreakable.code.tex +Library (tcolorbox): 'tcbbreakable.code.tex' version '4.42' +(/usr/share/texmf-dist/tex/generic/oberdiek/pdfcol.sty +Package: pdfcol 2019/12/29 v1.6 Handle new color stacks for pdfTeX (HO) + +(/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO) +) +(/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +Package pdfcol Info: New color stack `tcb@breakable' = 1 on input line 23. +\tcb@testbox=\box62 +\tcb@totalupperbox=\box63 +\tcb@totallowerbox=\box64 +)) +(/usr/share/texmf-dist/tex/latex/parskip/parskip.sty +Package: parskip 2020-06-15 v2.0f non-zero parskip adjustments + +(/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO) + +(/usr/share/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +))) +(/usr/share/texmf-dist/tex/latex/base/fontenc.sty +Package: fontenc 2020/08/10 v2.0s Standard LaTeX package +) +(/usr/share/texmf-dist/tex/latex/psnfss/mathpazo.sty +Package: mathpazo 2020/03/25 PSNFSS-v9.3 Palatino w/ Pazo Math (D.Puga, WaS) +\symupright=\mathgroup4 +) +(/usr/share/texmf-dist/tex/latex/caption/caption.sty +Package: caption 2020/10/26 v3.5g Customizing captions (AR) + +(/usr/share/texmf-dist/tex/latex/caption/caption3.sty +Package: caption3 2020/10/21 v2.2e caption3 kernel (AR) +\captionmargin=\dimen180 +\captionmargin@=\dimen181 +\captionwidth=\dimen182 +\caption@tempdima=\dimen183 +\caption@indent=\dimen184 +\caption@parindent=\dimen185 +\caption@hangindent=\dimen186 +Package caption Info: Standard document class detected. +) +\c@caption@flags=\count267 +\c@continuedfloat=\count268 +) +(/usr/share/texmf-dist/tex/latex/adjustbox/adjustbox.sty +Package: adjustbox 2020/08/19 v1.3 Adjusting TeX boxes (trim, clip, ...) + +(/usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty +Package: xkeyval 2020/11/20 v2.8 package option processing (HA) + +(/usr/share/texmf-dist/tex/generic/xkeyval/xkeyval.tex +(/usr/share/texmf-dist/tex/generic/xkeyval/xkvutils.tex +\XKV@toks=\toks29 +\XKV@tempa@toks=\toks30 +) +\XKV@depth=\count269 +File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA) +)) +(/usr/share/texmf-dist/tex/latex/adjustbox/adjcalc.sty +Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back +-ends (calc, etex, pgfmath) +) +(/usr/share/texmf-dist/tex/latex/adjustbox/trimclip.sty +Package: trimclip 2020/08/19 v1.2 Trim and clip general TeX material + +(/usr/share/texmf-dist/tex/latex/collectbox/collectbox.sty +Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes +\collectedbox=\box65 +) +\tc@llx=\dimen187 +\tc@lly=\dimen188 +\tc@urx=\dimen189 +\tc@ury=\dimen190 +Package trimclip Info: Using driver 'tc-pdftex.def'. + +(/usr/share/texmf-dist/tex/latex/adjustbox/tc-pdftex.def +File: tc-pdftex.def 2019/01/04 v2.2 Clipping driver for pdftex +)) +\adjbox@Width=\dimen191 +\adjbox@Height=\dimen192 +\adjbox@Depth=\dimen193 +\adjbox@Totalheight=\dimen194 +\adjbox@pwidth=\dimen195 +\adjbox@pheight=\dimen196 +\adjbox@pdepth=\dimen197 +\adjbox@ptotalheight=\dimen198 + +(/usr/share/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty +Package: ifoddpage 2016/04/23 v1.1 Conditionals for odd/even page detection +\c@checkoddpage=\count270 +) +(/usr/share/texmf-dist/tex/latex/varwidth/varwidth.sty +Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages +\@vwid@box=\box66 +\sift@deathcycles=\count271 +\@vwid@loff=\dimen199 +\@vwid@roff=\dimen256 +)) +(/usr/share/texmf-dist/tex/latex/float/float.sty +Package: float 2001/11/08 v1.3d Float enhancements (AL) +\c@float@type=\count272 +\float@exts=\toks31 +\float@box=\box67 +\@float@everytoks=\toks32 +\@floatcapt=\box68 +) +(/usr/share/texmf-dist/tex/latex/tools/enumerate.sty +Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC) +\@enLab=\toks33 +) +(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. +) +\Gm@cnth=\count273 +\Gm@cntv=\count274 +\c@Gm@tempcnt=\count275 +\Gm@bindingoffset=\dimen257 +\Gm@wd@mp=\dimen258 +\Gm@odd@mp=\dimen259 +\Gm@even@mp=\dimen260 +\Gm@layoutwidth=\dimen261 +\Gm@layoutheight=\dimen262 +\Gm@layouthoffset=\dimen263 +\Gm@layoutvoffset=\dimen264 +\Gm@dimlist=\toks34 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/09/23 v2.17i AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks35 +\ex@=\dimen265 +)) +(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen266 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count276 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count277 +\leftroot@=\count278 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count279 +\DOTSCASE@=\count280 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box69 +\strutbox@=\box70 +\big@size=\dimen267 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count281 +\c@MaxMatrixCols=\count282 +\dotsspace@=\muskip16 +\c@parentequation=\count283 +\dspbrk@lvl=\count284 +\tag@help=\toks36 +\row@=\count285 +\column@=\count286 +\maxfields@=\count287 +\andhelp@=\toks37 +\eqnshift@=\dimen268 +\alignsep@=\dimen269 +\tagshift@=\dimen270 +\tagwidth@=\dimen271 +\totwidth@=\dimen272 +\lineht@=\dimen273 +\@envbody=\toks38 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks39 +LaTeX Info: Redefining \[ on input line 2923. +LaTeX Info: Redefining \] on input line 2924. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup5 +\symAMSb=\mathgroup6 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texmf-dist/tex/latex/base/textcomp.sty +Package: textcomp 2020/02/02 v2.0n Standard LaTeX package +) +(/usr/share/texmf-dist/tex/latex/upquote/upquote.sty +Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba +tim +) +(/usr/share/texmf-dist/tex/latex/eurosym/eurosym.sty +Package: eurosym 1998/08/06 v1.1 European currency symbol ``Euro'' +\@eurobox=\box71 +) +(/usr/share/texmf-dist/tex/latex/ucs/ucs.sty +Package: ucs 2013/05/11 v2.2 UCS: Unicode input support + +(/usr/share/texmf-dist/tex/latex/ucs/data/uni-global.def +File: uni-global.def 2013/05/13 UCS: Unicode global data +) +\uc@secondtry=\count288 +\uc@combtoks=\toks40 +\uc@combtoksb=\toks41 +\uc@temptokena=\toks42 +) +(/usr/share/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +Package: fancyvrb 2020/05/03 v3.6 verbatim text (tvz,hv) +\FV@CodeLineNo=\count289 +\FV@InFile=\read4 +\FV@TabBox=\box72 +\c@FancyVerbLine=\count290 +\FV@StepNumber=\count291 +\FV@OutFile=\write6 +) +(/usr/share/texmf-dist/tex/latex/grffile/grffile.sty +Package: grffile 2019/11/11 v2.1 Extended file name support for graphics (legac +y) +Package grffile Info: This package is an empty stub for compatibility on input +line 40. +) +(/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2020-05-15 v7.00e Hypertext links for LaTeX + +(/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(/usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) +(/usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) +(/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +\@linkdim=\dimen274 +\Hy@linkcounter=\count292 +\Hy@pagecounter=\count293 + +(/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2020-05-15 v7.00e Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) +(/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +(/usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) +) +\Hy@SavedSpaceFactor=\count294 +Package hyperref Info: Hyper figures OFF on input line 4464. +Package hyperref Info: Link nesting OFF on input line 4469. +Package hyperref Info: Hyper index ON on input line 4472. +Package hyperref Info: Plain pages OFF on input line 4479. +Package hyperref Info: Backreferencing OFF on input line 4484. +Package hyperref Info: Implicit mode ON; LaTeX internals redefined. +Package hyperref Info: Bookmarks ON on input line 4717. +\c@Hy@tempcnt=\count295 + +(/usr/share/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip17 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5076. +\XeTeXLinkMargin=\dimen275 + +(/usr/share/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(/usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +\Fld@menulength=\count296 +\Field@Width=\dimen276 +\Fld@charsize=\dimen277 +Package hyperref Info: Hyper figures OFF on input line 6347. +Package hyperref Info: Link nesting OFF on input line 6352. +Package hyperref Info: Hyper index ON on input line 6355. +Package hyperref Info: backreferencing OFF on input line 6362. +Package hyperref Info: Link coloring OFF on input line 6367. +Package hyperref Info: Link coloring with OCG OFF on input line 6372. +Package hyperref Info: PDF/A mode OFF on input line 6377. +LaTeX Info: Redefining \ref on input line 6417. +LaTeX Info: Redefining \pageref on input line 6421. + +(/usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty +Package: atbegshi-ltx 2020/08/17 v1.0a Emulation of the original atbegshi packa +ge +with kernel methods +) +\Hy@abspage=\count297 +\c@Item=\count298 +\c@Hfootnote=\count299 +) +Package hyperref Info: Driver (autodetected): hpdftex. + +(/usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2020-05-15 v7.00e Hyperref driver for pdfTeX + +(/usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty +Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atvery packag +e +with kernel methods +) +\Fld@listcount=\count300 +\c@bookmark@seq@number=\count301 + +(/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) + +(/usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +86. +) +\Hy@SectionHShift=\skip52 +) +(/usr/share/texmf-dist/tex/latex/titling/titling.sty +Package: titling 2009/09/04 v2.1d maketitle typesetting +\thanksmarkwidth=\skip53 +\thanksmargin=\skip54 +\droptitle=\skip55 +) +(/usr/share/texmf-dist/tex/latex/tools/longtable.sty +Package: longtable 2020/01/07 v4.13 Multi-page Table package (DPC) +\LTleft=\skip56 +\LTright=\skip57 +\LTpre=\skip58 +\LTpost=\skip59 +\LTchunksize=\count302 +\LTcapwidth=\dimen278 +\LT@head=\box73 +\LT@firsthead=\box74 +\LT@foot=\box75 +\LT@lastfoot=\box76 +\LT@cols=\count303 +\LT@rows=\count304 +\c@LT@tables=\count305 +\c@LT@chunks=\count306 +\LT@p@ftn=\toks43 +) +(/usr/share/texmf-dist/tex/latex/booktabs/booktabs.sty +Package: booktabs 2020/01/12 v1.61803398 Publication quality tables +\heavyrulewidth=\dimen279 +\lightrulewidth=\dimen280 +\cmidrulewidth=\dimen281 +\belowrulesep=\dimen282 +\belowbottomsep=\dimen283 +\aboverulesep=\dimen284 +\abovetopsep=\dimen285 +\cmidrulesep=\dimen286 +\cmidrulekern=\dimen287 +\defaultaddspace=\dimen288 +\@cmidla=\count307 +\@cmidlb=\count308 +\@aboverulesep=\dimen289 +\@belowrulesep=\dimen290 +\@thisruleclass=\count309 +\@lastruleclass=\count310 +\@thisrulewidth=\dimen291 +) +(/usr/share/texmf-dist/tex/latex/enumitem/enumitem.sty +Package: enumitem 2019/06/20 v3.9 Customized lists +\labelindent=\skip60 +\enit@outerparindent=\dimen292 +\enit@toks=\toks44 +\enit@inbox=\box77 +\enit@count@id=\count311 +\enitdp@description=\count312 +) +(/usr/share/texmf-dist/tex/generic/ulem/ulem.sty +\UL@box=\box78 +\UL@hyphenbox=\box79 +\UL@skip=\skip61 +\UL@hook=\toks45 +\UL@height=\dimen293 +\UL@pe=\count313 +\UL@pixel=\dimen294 +\ULC@box=\box80 +Package: ulem 2019/11/18 +\ULdepth=\dimen295 +) +(/usr/share/texmf-dist/tex/latex/jknapltx/mathrsfs.sty +Package: mathrsfs 1996/01/01 Math RSFS package v1.0 (jk) +\symrsfs=\mathgroup7 +) +\Wrappedcontinuationbox=\box81 +\Wrappedvisiblespacebox=\box82 +Package hyperref Info: Option `breaklinks' set `true' on input line 361. +Package hyperref Info: Option `colorlinks' set `true' on input line 361. +LaTeX Font Info: Trying to load font information for T1+ppl on input line 36 +8. + +(/usr/share/texmf-dist/tex/latex/psnfss/t1ppl.fd +File: t1ppl.fd 2001/06/04 font definitions for T1/ppl. +) +(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX) +\l__kernel_color_stack_int=\count314 +\l__pdf_internal_box=\box83 +) +(./8-SageCalculus.aux) +\openout1 = `8-SageCalculus.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. + +(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count315 +\scratchdimen=\dimen296 +\scratchbox=\box84 +\nofMPsegments=\count316 +\nofMParguments=\count317 +\everyMPshowfont=\toks46 +\MPscratchCnt=\count318 +\MPscratchDim=\dimen297 +\MPnumerator=\count319 +\makeMPintoPDFobject=\count320 +\everyMPtoPDFconversion=\toks47 +) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +Package caption Info: Begin \AtBeginDocument code. +Package caption Info: float package is loaded. +Package caption Info: hyperref package is loaded. +Package caption Info: longtable package is loaded. + +(/usr/share/texmf-dist/tex/latex/caption/ltcaption.sty +Package: ltcaption 2020/05/30 v1.4b longtable captions (AR) +) +Package caption Info: End \AtBeginDocument code. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: +* layout: +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt) +* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt) +* \paperwidth=614.295pt +* \paperheight=794.96999pt +* \textwidth=469.75502pt +* \textheight=650.43001pt +* \oddsidemargin=0.0pt +* \evensidemargin=0.0pt +* \topmargin=-37.0pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=11.0pt +* \footskip=30.0pt +* \marginparwidth=59.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texmf-dist/tex/latex/ucs/ucsencs.def +File: ucsencs.def 2011/01/21 Fixes to fontencodings LGR, T3 +) +Package hyperref Info: Link coloring ON on input line 368. + +(/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section + +(/usr/share/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) +) +\c@section@level=\count321 +) +LaTeX Info: Redefining \ref on input line 368. +LaTeX Info: Redefining \pageref on input line 368. +LaTeX Info: Redefining \nameref on input line 368. + +(./8-SageCalculus.out) (./8-SageCalculus.out) +\@outlinefile=\write7 +\openout7 = `8-SageCalculus.out'. + +LaTeX Font Info: Trying to load font information for OT1+ppl on input line 3 +70. + +(/usr/share/texmf-dist/tex/latex/psnfss/ot1ppl.fd +File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl. +) +LaTeX Font Info: Trying to load font information for OML+zplm on input line +370. + +(/usr/share/texmf-dist/tex/latex/psnfss/omlzplm.fd +File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm. +) +LaTeX Font Info: Trying to load font information for OMS+zplm on input line +370. + +(/usr/share/texmf-dist/tex/latex/psnfss/omszplm.fd +File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm. +) +LaTeX Font Info: Trying to load font information for OMX+zplm on input line +370. + +(/usr/share/texmf-dist/tex/latex/psnfss/omxzplm.fd +File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm. +) +LaTeX Font Info: Trying to load font information for OT1+zplm on input line +370. + +(/usr/share/texmf-dist/tex/latex/psnfss/ot1zplm.fd +File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm. +) +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 12.50409pt on input line 370. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 9.37807pt on input line 370. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 7.29405pt on input line 370. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 12.50409pt on input line 370. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 9.37807pt on input line 370. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 7.29405pt on input line 370. +LaTeX Font Info: Trying to load font information for U+rsfs on input line 37 +0. + +(/usr/share/texmf-dist/tex/latex/jknapltx/ursfs.fd +File: ursfs.fd 1998/03/24 rsfs font definition file (jk) +) +LaTeX Font Info: Trying to load font information for T1+cmtt on input line 3 +70. + +(/usr/share/texmf-dist/tex/latex/base/t1cmtt.fd +File: t1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions +) +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 6.25204pt on input line 391. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 5.21004pt on input line 391. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 6.25204pt on input line 391. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 5.21004pt on input line 391. +LaTeX Font Info: Trying to load font information for TS1+cmtt on input line +392. + +(/usr/share/texmf-dist/tex/latex/base/ts1cmtt.fd +File: ts1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions +) +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 11.40997pt on input line 432. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 8.33606pt on input line 432. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 11.40997pt on input line 432. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 8.33606pt on input line 432. + [1 + +{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] +LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <10.95> not available +(Font) Font shape `T1/cmtt/m/n' tried instead on input line 511. + [2] +Underfull \hbox (badness 10000) in paragraph at lines 541--545 +[]\T1/ppl/m/n/10.95 When solv-ing a sys-tem of equa-tions (not in-equal-i-ties) +, you can use the op-tion + [] + +[3] [4] [5] [6] [7] [8] [9] [10] + +File: output_75_0.png Graphic file (type png) + +Package pdftex.def Info: output_75_0.png used on input line 1282. +(pdftex.def) Requested size: 423.50114pt x 281.85231pt. + [11] +Underfull \hbox (badness 10000) in paragraph at lines 1284--1285 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1290--1293 +[]\T1/cmtt/m/n/10.95 You can give a number of options to adjust the aspect of y +our plot, see [][]here[][]. + [] + + +File: output_77_0.png Graphic file (type png) + +Package pdftex.def Info: output_77_0.png used on input line 1311. +(pdftex.def) Requested size: 426.39195pt x 281.12961pt. +[12 <./output_75_0.png>] +Underfull \hbox (badness 10000) in paragraph at lines 1313--1314 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1316--1321 +[]\T1/cmtt/m/n/10.95 Some of the options are not described precisely in Sage's +documentation, but you + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1316--1321 +\T1/cmtt/m/n/10.95 can find them on [][]matplotlib's documentation[][]. You can + find many examples online for + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1322--1324 +[]\T1/cmtt/m/n/10.95 If you need to plot more than one object at the time, you +can sum two plots and + [] + + +File: output_80_0.png Graphic file (type png) + +Package pdftex.def Info: output_80_0.png used on input line 1336. +(pdftex.def) Requested size: 424.94655pt x 281.12961pt. +[13 <./output_77_0.png>] +Underfull \hbox (badness 10000) in paragraph at lines 1338--1339 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1340--1347 +[]\T1/cmtt/m/n/10.95 Finally, there are other types of plots that you can use, +like [][]scatter plots[][] and + [] + + +File: output_82_0.png Graphic file (type png) + +Package pdftex.def Info: output_82_0.png used on input line 1364. +(pdftex.def) Requested size: 421.33307pt x 281.85231pt. +[14 <./output_80_0.png>] +Underfull \hbox (badness 10000) in paragraph at lines 1366--1367 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1376--1380 +[]\T1/cmtt/m/n/10.95 When you need to work with a discrete set of data, like me +asurements of real-world + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1376--1380 +\T1/cmtt/m/n/10.95 quantities, it can be useful to visualize a ``smoothed out'' + version of this data, + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1381--1385 +[]\T1/cmtt/m/n/10.95 One way to do so is finding the lowest-degree polynomial t +hat passes through all + [] + + +File: output_84_0.png Graphic file (type png) + +Package pdftex.def Info: output_84_0.png used on input line 1400. +(pdftex.def) Requested size: 423.50114pt x 280.4069pt. +[15 <./output_82_0.png>] +Underfull \hbox (badness 10000) in paragraph at lines 1402--1403 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1404--1408 +[]\T1/cmtt/m/n/10.95 One can compute the Lagrange Polynomial over any base ring +, and it has the + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1404--1408 +\T1/cmtt/m/n/10.95 advantage that it is a very ``nice'' function (continuous an +d differentiable as much + [] + + +File: output_86_0.png Graphic file (type png) + +Package pdftex.def Info: output_86_0.png used on input line 1425. +(pdftex.def) Requested size: 424.94655pt x 281.85231pt. +[16 <./output_84_0.png>] +Underfull \hbox (badness 10000) in paragraph at lines 1427--1428 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1429--1434 +[]\T1/cmtt/m/n/10.95 This particular example is called [][]Runge's phenomenon[] +[]. For a better approximation + [] + + +File: output_88_0.png Graphic file (type png) + +Package pdftex.def Info: output_88_0.png used on input line 1443. +(pdftex.def) Requested size: 424.94655pt x 281.85231pt. +[17 <./output_86_0.png>] +Underfull \hbox (badness 10000) in paragraph at lines 1445--1446 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1447--1450 +[]\T1/cmtt/m/n/10.95 A detailed explanation of splines is a good topic for a co +urse of numerical + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1447--1450 +\T1/cmtt/m/n/10.95 analysis. For this course it is enough that you know that th +ey exist and they + [] + +[18 <./output_88_0.png>] (./8-SageCalculus.aux) +Package rerunfilecheck Info: File `8-SageCalculus.out' has not changed. +(rerunfilecheck) Checksum: 07C494ECBA08A2F1E2EF17E2726357A6;1338. + ) +Here is how much of TeX's memory you used: + 21395 strings out of 479383 + 389927 string characters out of 5875798 + 723366 words of memory out of 5000000 + 37972 multiletter control sequences out of 15000+600000 + 442051 words of font info for 125 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 107i,19n,111p,507b,620s stack positions out of 5000i,500n,10000p,200000b,80000s +{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}{/usr/share/ +texmf-dist/fonts/enc/dvips/base/8r.enc}{/usr/share/texmf-dist/fonts/enc/dvips/c +m-super/cm-super-t1.enc} +Output written on 8-SageCalculus.pdf (18 pages, 323733 bytes). +PDF statistics: + 311 PDF objects out of 1000 (max. 8388607) + 262 compressed objects within 3 object streams + 59 named destinations out of 1000 (max. 500000) + 200 words of extra memory for PDF output out of 10000 (max. 10000000) + 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 @@ +\BOOKMARK [1][-]{section.1}{Symbolic expressions}{}% 1 +\BOOKMARK [2][-]{subsection.1.1}{Solving equations and inequalities}{section.1}% 2 +\BOOKMARK [3][-]{subsubsection.1.1.1}{The set of solutions}{subsection.1.1}% 3 +\BOOKMARK [3][-]{subsubsection.1.1.2}{Alternative method for real roots: find\137root\(\)}{subsection.1.1}% 4 +\BOOKMARK [2][-]{subsection.1.2}{Evaluating functions}{section.1}% 5 +\BOOKMARK [2][-]{subsection.1.3}{Symbolic computations}{section.1}% 6 +\BOOKMARK [3][-]{subsubsection.1.3.1}{The Symbolic Ring}{subsection.1.3}% 7 +\BOOKMARK [1][-]{section.2}{Calculus}{}% 8 +\BOOKMARK [2][-]{subsection.2.1}{Limits and series}{section.2}% 9 +\BOOKMARK [2][-]{subsection.2.2}{Derivatives}{section.2}% 10 +\BOOKMARK [2][-]{subsection.2.3}{Integrals}{section.2}% 11 +\BOOKMARK [3][-]{subsubsection.2.3.1}{Symbolic integration}{subsection.2.3}% 12 +\BOOKMARK [3][-]{subsubsection.2.3.2}{Numerical integration}{subsection.2.3}% 13 +\BOOKMARK [2][-]{subsection.2.4}{Differential equations}{section.2}% 14 +\BOOKMARK [3][-]{subsubsection.2.4.1}{A real-world example}{subsection.2.4}% 15 +\BOOKMARK [1][-]{section.3}{Basic data analysis and visualization}{}% 16 +\BOOKMARK [2][-]{subsection.3.1}{Statistics}{section.3}% 17 +\BOOKMARK [2][-]{subsection.3.2}{Plotting}{section.3}% 18 +\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 Binary files /dev/null and b/src/Lecture6/notebook/8-SageCalculus.pdf 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 @@ +\documentclass[11pt]{article} + + \usepackage[breakable]{tcolorbox} + \usepackage{parskip} % Stop auto-indenting (to mimic markdown behaviour) + + \usepackage{iftex} + \ifPDFTeX + \usepackage[T1]{fontenc} + \usepackage{mathpazo} + \else + \usepackage{fontspec} + \fi + + % Basic figure setup, for now with no caption control since it's done + % automatically by Pandoc (which extracts ![](path) syntax from Markdown). + \usepackage{graphicx} + % Maintain compatibility with old templates. Remove in nbconvert 6.0 + \let\Oldincludegraphics\includegraphics + % Ensure that by default, figures have no caption (until we provide a + % proper Figure object with a Caption API and a way to capture that + % in the conversion process - todo). + \usepackage{caption} + \DeclareCaptionFormat{nocaption}{} + \captionsetup{format=nocaption,aboveskip=0pt,belowskip=0pt} + + \usepackage[Export]{adjustbox} % Used to constrain images to a maximum size + \adjustboxset{max size={0.9\linewidth}{0.9\paperheight}} + \usepackage{float} + \floatplacement{figure}{H} % forces figures to be placed at the correct location + \usepackage{xcolor} % Allow colors to be defined + \usepackage{enumerate} % Needed for markdown enumerations to work + \usepackage{geometry} % Used to adjust the document margins + \usepackage{amsmath} % Equations + \usepackage{amssymb} % Equations + \usepackage{textcomp} % defines textquotesingle + % Hack from http://tex.stackexchange.com/a/47451/13684: + \AtBeginDocument{% + \def\PYZsq{\textquotesingle}% Upright quotes in Pygmentized code + } + \usepackage{upquote} % Upright quotes for verbatim code + \usepackage{eurosym} % defines \euro + \usepackage[mathletters]{ucs} % Extended unicode (utf-8) support + \usepackage{fancyvrb} % verbatim replacement that allows latex + \usepackage{grffile} % extends the file name processing of package graphics + % to support a larger range + \makeatletter % fix for grffile with XeLaTeX + \def\Gread@@xetex#1{% + \IfFileExists{"\Gin@base".bb}% + {\Gread@eps{\Gin@base.bb}}% + {\Gread@@xetex@aux#1}% + } + \makeatother + + % The hyperref package gives us a pdf with properly built + % internal navigation ('pdf bookmarks' for the table of contents, + % internal cross-reference links, web links for URLs, etc.) + \usepackage{hyperref} + % The default LaTeX title has an obnoxious amount of whitespace. By default, + % titling removes some of it. It also provides customization options. + \usepackage{titling} + \usepackage{longtable} % longtable support required by pandoc >1.10 + \usepackage{booktabs} % table support for pandoc > 1.12.2 + \usepackage[inline]{enumitem} % IRkernel/repr support (it uses the enumerate* environment) + \usepackage[normalem]{ulem} % ulem is needed to support strikethroughs (\sout) + % normalem makes italics be italics, not underlines + \usepackage{mathrsfs} + + + + % Colors for the hyperref package + \definecolor{urlcolor}{rgb}{0,.145,.698} + \definecolor{linkcolor}{rgb}{.71,0.21,0.01} + \definecolor{citecolor}{rgb}{.12,.54,.11} + + % ANSI colors + \definecolor{ansi-black}{HTML}{3E424D} + \definecolor{ansi-black-intense}{HTML}{282C36} + \definecolor{ansi-red}{HTML}{E75C58} + \definecolor{ansi-red-intense}{HTML}{B22B31} + \definecolor{ansi-green}{HTML}{00A250} + \definecolor{ansi-green-intense}{HTML}{007427} + \definecolor{ansi-yellow}{HTML}{DDB62B} + \definecolor{ansi-yellow-intense}{HTML}{B27D12} + \definecolor{ansi-blue}{HTML}{208FFB} + \definecolor{ansi-blue-intense}{HTML}{0065CA} + \definecolor{ansi-magenta}{HTML}{D160C4} + \definecolor{ansi-magenta-intense}{HTML}{A03196} + \definecolor{ansi-cyan}{HTML}{60C6C8} + \definecolor{ansi-cyan-intense}{HTML}{258F8F} + \definecolor{ansi-white}{HTML}{C5C1B4} + \definecolor{ansi-white-intense}{HTML}{A1A6B2} + \definecolor{ansi-default-inverse-fg}{HTML}{FFFFFF} + \definecolor{ansi-default-inverse-bg}{HTML}{000000} + + % commands and environments needed by pandoc snippets + % extracted from the output of `pandoc -s` + \providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} + \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} + % Add ',fontsize=\small' for more characters per line + \newenvironment{Shaded}{}{} + \newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{{#1}}} + \newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{{#1}}}} + \newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{{#1}}} + \newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{{#1}}} + \newcommand{\RegionMarkerTok}[1]{{#1}} + \newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\NormalTok}[1]{{#1}} + + % Additional commands for more recent versions of Pandoc + \newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{{#1}}} + \newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{{#1}}} + \newcommand{\ImportTok}[1]{{#1}} + \newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{{#1}}}} + \newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{{#1}}} + \newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{{#1}}} + \newcommand{\BuiltInTok}[1]{{#1}} + \newcommand{\ExtensionTok}[1]{{#1}} + \newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{{#1}}} + \newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{{#1}}} + \newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + + + % Define a nice break command that doesn't care if a line doesn't already + % exist. + \def\br{\hspace*{\fill} \\* } + % Math Jax compatibility definitions + \def\gt{>} + \def\lt{<} + \let\Oldtex\TeX + \let\Oldlatex\LaTeX + \renewcommand{\TeX}{\textrm{\Oldtex}} + \renewcommand{\LaTeX}{\textrm{\Oldlatex}} + % Document parameters + % Document title + \title{Calculus and more with SageMath} + \author{Sebastiano Tronto - \texttt{sebastiano.tronto@uni.lu}} + \date{2021-05-07} + + + + + +% Pygments definitions +\makeatletter +\def\PY@reset{\let\PY@it=\relax \let\PY@bf=\relax% + \let\PY@ul=\relax \let\PY@tc=\relax% + \let\PY@bc=\relax \let\PY@ff=\relax} +\def\PY@tok#1{\csname PY@tok@#1\endcsname} +\def\PY@toks#1+{\ifx\relax#1\empty\else% + \PY@tok{#1}\expandafter\PY@toks\fi} +\def\PY@do#1{\PY@bc{\PY@tc{\PY@ul{% + \PY@it{\PY@bf{\PY@ff{#1}}}}}}} +\def\PY#1#2{\PY@reset\PY@toks#1+\relax+\PY@do{#2}} + +\expandafter\def\csname PY@tok@w\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}} +\expandafter\def\csname PY@tok@c\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.74,0.48,0.00}{##1}}} +\expandafter\def\csname PY@tok@k\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}} +\expandafter\def\csname PY@tok@o\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@ow\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@nb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@nc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@nn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@ne\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.82,0.25,0.23}{##1}}} +\expandafter\def\csname PY@tok@nv\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@no\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@nl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@ni\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}} +\expandafter\def\csname PY@tok@na\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.49,0.56,0.16}{##1}}} +\expandafter\def\csname PY@tok@nt\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@s\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sd\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@si\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@se\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.13}{##1}}} +\expandafter\def\csname PY@tok@sr\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@ss\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@sx\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@m\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@gh\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@gu\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@gd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@gi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@gr\endcsname{\def\PY@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@ge\endcsname{\let\PY@it=\textit} +\expandafter\def\csname PY@tok@gs\endcsname{\let\PY@bf=\textbf} +\expandafter\def\csname PY@tok@gp\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@go\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.53,0.53}{##1}}} +\expandafter\def\csname PY@tok@gt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}} +\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}}} +\expandafter\def\csname PY@tok@kc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kd\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kr\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@bp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@fm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@vc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vg\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@sa\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@dl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@s2\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@s1\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@mb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@il\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mo\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@ch\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cm\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cpf\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@c1\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cs\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} + +\def\PYZbs{\char`\\} +\def\PYZus{\char`\_} +\def\PYZob{\char`\{} +\def\PYZcb{\char`\}} +\def\PYZca{\char`\^} +\def\PYZam{\char`\&} +\def\PYZlt{\char`\<} +\def\PYZgt{\char`\>} +\def\PYZsh{\char`\#} +\def\PYZpc{\char`\%} +\def\PYZdl{\char`\$} +\def\PYZhy{\char`\-} +\def\PYZsq{\char`\'} +\def\PYZdq{\char`\"} +\def\PYZti{\char`\~} +% for compatibility with earlier versions +\def\PYZat{@} +\def\PYZlb{[} +\def\PYZrb{]} +\makeatother + + + % For linebreaks inside Verbatim environment from package fancyvrb. + \makeatletter + \newbox\Wrappedcontinuationbox + \newbox\Wrappedvisiblespacebox + \newcommand*\Wrappedvisiblespace {\textcolor{red}{\textvisiblespace}} + \newcommand*\Wrappedcontinuationsymbol {\textcolor{red}{\llap{\tiny$\m@th\hookrightarrow$}}} + \newcommand*\Wrappedcontinuationindent {3ex } + \newcommand*\Wrappedafterbreak {\kern\Wrappedcontinuationindent\copy\Wrappedcontinuationbox} + % Take advantage of the already applied Pygments mark-up to insert + % potential linebreaks for TeX processing. + % {, <, #, %, $, ' and ": go to next line. + % _, }, ^, &, >, - and ~: stay at end of broken line. + % Use of \textquotesingle for straight quote. + \newcommand*\Wrappedbreaksatspecials {% + \def\PYGZus{\discretionary{\char`\_}{\Wrappedafterbreak}{\char`\_}}% + \def\PYGZob{\discretionary{}{\Wrappedafterbreak\char`\{}{\char`\{}}% + \def\PYGZcb{\discretionary{\char`\}}{\Wrappedafterbreak}{\char`\}}}% + \def\PYGZca{\discretionary{\char`\^}{\Wrappedafterbreak}{\char`\^}}% + \def\PYGZam{\discretionary{\char`\&}{\Wrappedafterbreak}{\char`\&}}% + \def\PYGZlt{\discretionary{}{\Wrappedafterbreak\char`\<}{\char`\<}}% + \def\PYGZgt{\discretionary{\char`\>}{\Wrappedafterbreak}{\char`\>}}% + \def\PYGZsh{\discretionary{}{\Wrappedafterbreak\char`\#}{\char`\#}}% + \def\PYGZpc{\discretionary{}{\Wrappedafterbreak\char`\%}{\char`\%}}% + \def\PYGZdl{\discretionary{}{\Wrappedafterbreak\char`\$}{\char`\$}}% + \def\PYGZhy{\discretionary{\char`\-}{\Wrappedafterbreak}{\char`\-}}% + \def\PYGZsq{\discretionary{}{\Wrappedafterbreak\textquotesingle}{\textquotesingle}}% + \def\PYGZdq{\discretionary{}{\Wrappedafterbreak\char`\"}{\char`\"}}% + \def\PYGZti{\discretionary{\char`\~}{\Wrappedafterbreak}{\char`\~}}% + } + % Some characters . , ; ? ! / are not pygmentized. + % This macro makes them "active" and they will insert potential linebreaks + \newcommand*\Wrappedbreaksatpunct {% + \lccode`\~`\.\lowercase{\def~}{\discretionary{\hbox{\char`\.}}{\Wrappedafterbreak}{\hbox{\char`\.}}}% + \lccode`\~`\,\lowercase{\def~}{\discretionary{\hbox{\char`\,}}{\Wrappedafterbreak}{\hbox{\char`\,}}}% + \lccode`\~`\;\lowercase{\def~}{\discretionary{\hbox{\char`\;}}{\Wrappedafterbreak}{\hbox{\char`\;}}}% + \lccode`\~`\:\lowercase{\def~}{\discretionary{\hbox{\char`\:}}{\Wrappedafterbreak}{\hbox{\char`\:}}}% + \lccode`\~`\?\lowercase{\def~}{\discretionary{\hbox{\char`\?}}{\Wrappedafterbreak}{\hbox{\char`\?}}}% + \lccode`\~`\!\lowercase{\def~}{\discretionary{\hbox{\char`\!}}{\Wrappedafterbreak}{\hbox{\char`\!}}}% + \lccode`\~`\/\lowercase{\def~}{\discretionary{\hbox{\char`\/}}{\Wrappedafterbreak}{\hbox{\char`\/}}}% + \catcode`\.\active + \catcode`\,\active + \catcode`\;\active + \catcode`\:\active + \catcode`\?\active + \catcode`\!\active + \catcode`\/\active + \lccode`\~`\~ + } + \makeatother + + \let\OriginalVerbatim=\Verbatim + \makeatletter + \renewcommand{\Verbatim}[1][1]{% + %\parskip\z@skip + \sbox\Wrappedcontinuationbox {\Wrappedcontinuationsymbol}% + \sbox\Wrappedvisiblespacebox {\FV@SetupFont\Wrappedvisiblespace}% + \def\FancyVerbFormatLine ##1{\hsize\linewidth + \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@ + \doublehyphendemerits\z@\finalhyphendemerits\z@ + \strut ##1\strut}% + }% + % If the linebreak is at a space, the latter will be displayed as visible + % space at end of first line, and a continuation symbol starts next line. + % Stretch/shrink are however usually zero for typewriter font. + \def\FV@Space {% + \nobreak\hskip\z@ plus\fontdimen3\font minus\fontdimen4\font + \discretionary{\copy\Wrappedvisiblespacebox}{\Wrappedafterbreak} + {\kern\fontdimen2\font}% + }% + + % Allow breaks at special characters using \PYG... macros. + \Wrappedbreaksatspecials + % Breaks at punctuation characters . , ; ? ! and / need catcode=\active + \OriginalVerbatim[#1,codes*=\Wrappedbreaksatpunct]% + } + \makeatother + + % Exact colors from NB + \definecolor{incolor}{HTML}{303F9F} + \definecolor{outcolor}{HTML}{D84315} + \definecolor{cellborder}{HTML}{CFCFCF} + \definecolor{cellbackground}{HTML}{F7F7F7} + + % prompt + \makeatletter + \newcommand{\boxspacing}{\kern\kvtcb@left@rule\kern\kvtcb@boxsep} + \makeatother + \newcommand{\prompt}[4]{ + \ttfamily\llap{{\color{#2}[#3]:\hspace{3pt}#4}}\vspace{-\baselineskip} + } + + + + % Prevent overflowing lines due to hard-to-break entities + \sloppy + % Setup hyperref package + \hypersetup{ + breaklinks=true, % so long urls are correctly broken across lines + colorlinks=true, + urlcolor=urlcolor, + linkcolor=linkcolor, + citecolor=citecolor, + } + % Slightly bigger margins than the latex defaults + + \geometry{verbose,tmargin=1in,bmargin=1in,lmargin=1in,rmargin=1in} + + + +\begin{document} + + \maketitle + + + + + \hypertarget{symbolic-expressions}{% +\section{Symbolic expressions}\label{symbolic-expressions}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html}{1}{]} + +Last time we saw the basics of symbolic expressions: * How to define and +manipulate symbolic expressions * How to introduce new variables (in the +Mathematical sense) with \texttt{var()} * How to solve equations and +inequalities * Some of the Mathematical constants that are included in +Sage, and how to approximate them using \texttt{n()} + +Here are some examples to remind you of these basic things: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{2}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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)} +\PY{n}{f} \PY{o}{=} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{n}{pi} +\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} +\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}{)} +\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}{)} +\PY{n+nb}{print}\PY{p}{(} \PY{n}{solve}\PY{p}{(}\PY{n}{g}\PY{p}{,} \PY{n}{y}\PY{p}{)} \PY{p}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +[ +x == -sqrt(-pi), +x == sqrt(-pi) +] +[ +z == -sqrt(pi + x\^{}2), +z == sqrt(pi + x\^{}2) +] +[[y < -2], [y > 1]] +2*pi + e is approximately 9.00146713563863 + \end{Verbatim} + + Now we will see some more details about solving equations and +manipulating their solutions. + + \hypertarget{solving-equations-and-inequalities}{% +\subsection{Solving equations and +inequalities}\label{solving-equations-and-inequalities}} + +\textbf{Reference} +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html}{1}{]} +for the details of \texttt{solve()} and \texttt{find\_root()}, +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/relation.html\#solving}{2}{]} +for examples. + +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 + +\begin{align*} + \begin{cases} + x + y = 2 \\ + 2x - y = 6 + \end{cases} +\end{align*} + +Can be solved as + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{40}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{40}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +[[x == (8/3), y == (-2/3)]] +\end{Verbatim} +\end{tcolorbox} + + \textbf{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\). + + \hypertarget{the-set-of-solutions}{% +\subsubsection{The set of solutions}\label{the-set-of-solutions}} + +One would expect the result of \texttt{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) + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{37}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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{}} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{37}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +x == -3 +\end{Verbatim} +\end{tcolorbox} + + To read the actual solution without the \texttt{x\ ==} part you can use +the \texttt{rhs()} or \texttt{lhs()} functions, which can be applied to +any expression containing a relation operator (like \texttt{==}, +\texttt{\textless{}}, \texttt{\textgreater{}=}\ldots) and return the +\emph{right hand side} and \emph{left hand side} of the expression, +respectively + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{41}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{f} \PY{o}{=} \PY{n}{x} \PY{o}{==} \PY{l+m+mi}{2} +\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}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +rhs: 2 +lhs: x + \end{Verbatim} + + 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 \texttt{True} at the +same time. It is easier to explain with an example: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{38}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +Simple inequality: [[x < -3], [x > 3]] +System of inequalities: + [ +[3 < x, x < 6], +[x < -3] +] + \end{Verbatim} + + In the last example (system of inequalities), Sage is telling us that +the system \begin{align*} + \begin{cases} + x^2-9 > 9 \\ + x < 6 + \end{cases} +\end{align*} has two solutions: * \(x\) is between \(3\) and \(6\); * +\(x\) is less than \(-3\). + +Since in Sage (and in Python) expressions can have at most on relational +operator like \texttt{\textless{}}, the first solution requires two +expressions to be described. Hence the ``list of lists''. + + \textbf{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)\). + + When solving a system of equations (not inequalities), you can use the +option \texttt{solution\_dict=True} to have the solutions arranged as a +\emph{dictionary}, which is a type of Python collection that we did not +treat in this course + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{44}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{44}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +[\{x: 8/3, y: -2/3\}] +\end{Verbatim} +\end{tcolorbox} + + \hypertarget{alternative-method-for-real-roots-find_root}{% +\subsubsection{\texorpdfstring{Alternative method for real roots: +\texttt{find\_root()}}{Alternative method for real roots: find\_root()}}\label{alternative-method-for-real-roots-find_root}} + +The \texttt{solve()} method is very useful when solving \emph{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. + +When you want to find an explicit, even if approximate, solution, it can +be better to use \texttt{find\_root()}. This function works +\emph{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: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{52}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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} +\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}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +Using solve(): + [ +x == -e\^{}x + 10 +] +Using find\_root(): 2.070579904980303 + \end{Verbatim} + + \hypertarget{evaluating-functions}{% +\subsection{Evaluating functions}\label{evaluating-functions}} + +If an expression contains only one variable you can evaluate it easily, +even if it is not a function. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{21}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{y}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} +\PY{n}{f} \PY{o}{=} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{o}{\PYZhy{}}\PY{l+m+mi}{3} +\PY{n}{g} \PY{o}{=} \PY{n}{x} \PY{o}{\PYZgt{}} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} + +\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +1 +y + 3 > (y + 3)\^{}2 + \end{Verbatim} + + 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. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{38}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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{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} +\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}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +-2 == 0 +3*y == 2 + \end{Verbatim} + + \hypertarget{symbolic-computations}{% +\subsection{Symbolic computations}\label{symbolic-computations}} + +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 +\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.sum}{\texttt{sum()}} +function: + +\begin{align*} + \begin{array}{llcc} + (1) & \sum_{k=0}^nk &=&\frac{n^2+n}{2}\\ + (2) & \sum_{k=0}^nk^4 &=&\frac{6n^5+15n^4+10n^3-n}{30}\\ + (3) & \sum_{k=0}^n\binom nk &=& 2^n\\ + (4) & \sum_{k=0}^\infty \frac1{k^2} &=& \frac{\pi^2}{6} + \end{array} +\end{align*} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{22}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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} + +\PY{n}{s} \PY{o}{=} \PY{p}{[}\PY{p}{]} +\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}{)} +\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}{)} +\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}{)} +\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}{)} + +\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}{:} + \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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +(1) 1/2*n\^{}2 + 1/2*n +(2) 1/5*n\^{}5 + 1/2*n\^{}4 + 1/3*n\^{}3 - 1/30*n +(3) 2\^{}n +(4) 1/6*pi\^{}2 + \end{Verbatim} + + An alternative notation is \texttt{expression.sum(k,\ a,\ b)}. There is +an analogous +\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.prod}{\texttt{prod()}} +for products. + + 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 +\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.expand}{\texttt{expand()}} +function: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{30}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{p}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{o}{.}\PY{n}{expand}\PY{p}{(}\PY{p}{)}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +(x + 1)\^{}2 - (x - 1)\^{}2 +4*x + \end{Verbatim} + + \hypertarget{the-symbolic-ring}{% +\subsubsection{The Symbolic Ring}\label{the-symbolic-ring}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html}{3}{]} + +The symbolic expressions that we have seen so far live in a ring called +\emph{symbolic ring} and denoted by \texttt{SR} in Sage. This ring works +like the ring \texttt{ZZ} of integers or \texttt{RR} of reals numbers. +In particular, you can define matrices and other objects using it as a +``basis''. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{45}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} + +\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}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{M}\PY{o}{.}\PY{n}{determinant}\PY{p}{(}\PY{p}{)}\PY{p}{)} + +\PY{n}{polring}\PY{o}{.}\PY{o}{\PYZlt{}}\PY{n}{x}\PY{o}{\PYZgt{}} \PY{o}{=} \PY{n}{SR}\PY{p}{[}\PY{p}{]} +\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} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{o}{.}\PY{n}{roots}\PY{p}{(}\PY{p}{)}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +-b*c + a*d +[(-a, 2)] + \end{Verbatim} + + \textbf{Exercise.} Compute the eigenvalues of the matrix \begin{align*} +\begin{pmatrix} +\cos \alpha & \sin \alpha\\ +-\sin\alpha & \cos \alpha +\end{pmatrix} +\end{align*} + + \hypertarget{calculus}{% +\section{Calculus}\label{calculus}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/index.html}{4}{]} +for an overview, but most functions are described in +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html}{1}{]} + + \hypertarget{limits-and-series}{% +\subsection{Limits and series}\label{limits-and-series}} + +\textbf{References:} +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/calculus.html\#sage.calculus.calculus.limit}{5}{]} +for limits, +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.series}{6}{]} +for series + +You can compute limits + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{54}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{f} \PY{o}{=} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{o}{/}\PY{n}{x} +\PY{c+c1}{\PYZsh{} print(f(0)) \PYZsh{} This one gives an error} +\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{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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +1 +0 + \end{Verbatim} + + \textbf{Exercise.} Compute the constant \(e\) using a limit. + + You can also specify a direction for the limit. If you don't, Sage +assumes that you want to take a two-sided limit. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{55}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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} +\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} +\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}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +und +1 +-1 + \end{Verbatim} + + There is also the alternative notation \texttt{limit(f,\ x,\ dir)} which +does the same as \texttt{f.limit(x,\ dir)}. + + You can also compute series expansions up to any order. \textbf{Watch +out:} the notation uses \texttt{==} instead of \texttt{=} as +\texttt{limit()} does. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{56}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{f} \PY{o}{=} \PY{n}{e}\PY{o}{\PYZca{}}\PY{n}{x} +\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}{)} +\PY{n}{h} \PY{o}{=} \PY{n}{log}\PY{p}{(}\PY{n}{x}\PY{p}{)} + +\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}{)} +\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}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +1 + 1*x + 1/2*x\^{}2 + Order(x\^{}3) +(-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) +1*(x - 1) + (-1/2)*(x - 1)\^{}2 + Order((x - 1)\^{}3) + \end{Verbatim} + + \hypertarget{derivatives}{% +\subsection{Derivatives}\label{derivatives}} + +\textbf{References:} +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.derivative}{7}{]} +and +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functional.html\#sage.calculus.functional.derivative}{8}{]} +for derivatives, +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functions.html\#sage.calculus.functions.jacobian}{9}{]} +for the Jacobian matrix and +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.hessian}{10}{]} +for the Hessian. + + When computing derivatives, you need to specify with respect to which +variables you want to derive, except in case there is only one. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{57}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{y}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} +\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)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +8*y\^{}3 +6*x\^{}2 - 1 + \end{Verbatim} + + You can also compute higher order derivatives: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{58}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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)} + +\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} +\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} +\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} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +6*x +84*x\^{}5*y + 10*y\^{}4 + 24*x\^{}2*y +1680*x\^{}3 + 48 + \end{Verbatim} + + Jacobian and Hessian matrices are also easy to compute: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{59}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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}{)} + +\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} +\PY{n+nb}{print}\PY{p}{(} \PY{n}{g}\PY{o}{.}\PY{n}{hessian}\PY{p}{(}\PY{p}{)} \PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +[-2*x + 2*y 2*x] +[ 0 3*y\^{}2] +[ y + 1 x + 1] + +[ 2 -4*y + 1] +[ -4*y + 1 -4*x + 6*y] + \end{Verbatim} + + \emph{Note:} the notation \texttt{f.jacobian({[}x,y{]})} is also valid, +but only if you specify that \texttt{f} is vector by declaring it as +\texttt{f\ =\ vector({[}...{]})}. + + \hypertarget{integrals}{% +\subsection{Integrals}\label{integrals}} + +\textbf{References:} +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/integration/integral.html}{11}{]} +for symbolic integration and +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html}{12}{]} +for numerical methods. + +You should remember from high school or from your first +calculus/analysis course that derivatives are easy, but integrals are +hard. When using a computer software to solve your integrals, you have +two choices: + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + 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 + \emph{symbolic integration}. +\item + You can get an \emph{approximated} result with a \emph{numerical + method}. This method always gives some kind of result, but it cannot + be used to compute indefinite integrals. +\end{enumerate} + +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). + + \hypertarget{symbolic-integration}{% +\subsubsection{Symbolic integration}\label{symbolic-integration}} + +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. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{60}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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{n}{f} \PY{o}{=} \PY{n}{x} \PY{o}{+} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)} +\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)} +\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}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +1/2*x\^{}2 - cos(x) +0 +-1/2*a\^{}2 + 1/2*b\^{}2 + cos(a) - cos(b) + \end{Verbatim} + + Your endpoints can also be \(\pm\infty\): + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{61}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +1 +sqrt(pi) + \end{Verbatim} + + The last function is also an example of an integral that perhaps you +might want to compute numerically. In fact: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{65}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +1/2*sqrt(pi)*erf(x) +1/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1) + \end{Verbatim} + + Here \texttt{erf(x)} denotes the +\href{https://en.wikipedia.org/wiki/Error_function}{error function}. + + \hypertarget{numerical-integration}{% +\subsubsection{Numerical integration}\label{numerical-integration}} + +In order to get an explicit value for the computations above, we can use +a \emph{numerical} method. + +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. +\href{https://en.wikipedia.org/wiki/Numerical_analysis}{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. + +The Sage function +\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html\#sage.calculus.integration.numerical_integral}{\texttt{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. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{40}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{40}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +(0.13525725794999466, 1.5016572202374808e-15) +\end{Verbatim} +\end{tcolorbox} + + The result above means, in symbols \begin{align*} +\int_1^2 e^{-x^2}\mathrm dx = 0.13525725794999466 \pm 1.5016572202374808\times 10^{-15} +\end{align*} + +There is also a +\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html\#sage.calculus.integration.monte_carlo_integral}{\texttt{monte\_carlo\_integral()}} +method for functions with more than one variable. + + \textbf{Exercise.} Compute the area of the ellipse of equation +\(y^2+\left(\frac x3\right)^2=1\). + + \hypertarget{differential-equations}{% +\subsection{Differential equations}\label{differential-equations}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html}{13}{]} + +A +\href{https://en.wikipedia.org/wiki/Differential_equation}{differential +equation} is an equation involving an unknwon function and its +derivatives. They can be of two kinds: \emph{ordinary} differential +equations +(\href{https://en.wikipedia.org/wiki/Ordinary_differential_equation}{ODE}) +and \emph{partial} differential equations +(\href{https://en.wikipedia.org/wiki/Partial_differential_equation}{PDE}). +The latter involve multivariate functions and their partial derivatives. + +Differential equations are in general hard to solve \emph{exactly} (or +\emph{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! + +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 +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html}{13}{]}). +However we will focus on the simple ODEs that can be solved exactly. + +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 +\texttt{function()} construct, which allows us to define an ``unknwon'' +function inside Sage, like we define variables with \texttt{var()}. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{4}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{x}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} +\PY{n}{function}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{f}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} +\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}{)} +\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} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{4}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\_C*e\^{}x +\end{Verbatim} +\end{tcolorbox} + + 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. + +We can also specify \emph{initial conditions} for our function. For +example we can impose that \(f(0)=3\) as follows: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{5}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{5}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +3*e\^{}x +\end{Verbatim} +\end{tcolorbox} + + You can also solve \emph{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))\). + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{6}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{6}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +-1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e\^{}(-1/2*x\^{}2), x) +\end{Verbatim} +\end{tcolorbox} + + \textbf{Exercise.} Use Sage to find out the functions \(f(x)\) that +satisfy \begin{align*} + \begin{array}{rlcrl} + (A) & + \begin{cases} + f(0) &= 1\\ + f'(0) &= 0\\ + f''(x) &= -f(x) + \end{cases} + & \qquad \qquad & + (B) & + \begin{cases} + f(0) &= 0\\ + f'(0) &= 1\\ + f''(x) &= -f(x) + \end{cases} + \end{array} +\end{align*} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{ }{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] + +\end{Verbatim} +\end{tcolorbox} + + \hypertarget{a-real-world-example}{% +\subsubsection{A real-world example}\label{a-real-world-example}} + +Differential equations have countless applications in Science, so it +would be a shame not to see at least a simple one. + +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\). + +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). + +Since the acceleration is the derivative of the velocity, we have a +differential equation \begin{align*} + v'(t) = -g -kv(t) +\end{align*} and we can try to solve it with Sage! + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{7}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{t}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} +\PY{n}{function}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{v}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} +\PY{n}{g} \PY{o}{=} \PY{l+m+mf}{9.8} +\PY{n}{k} \PY{o}{=} \PY{l+m+mf}{1.5} +\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} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{7}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +-98/15*(e\^{}(3/2*t) - 1)*e\^{}(-3/2*t) +\end{Verbatim} +\end{tcolorbox} + + If you want to solve this equation symbolically (that is, keeping \(g\) +and \(k\) in symbols) you need to specify that \(t\) is the +\emph{independent variable} of the equation: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{10}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\PY{n}{function}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{v}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} +\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} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{10}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +-(g*e\^{}(k*t) - g)*e\^{}(-k*t)/k +\end{Verbatim} +\end{tcolorbox} + + \hypertarget{basic-data-analysis-and-visualization}{% +\section{Basic data analysis and +visualization}\label{basic-data-analysis-and-visualization}} + +\hypertarget{statistics}{% +\subsection{Statistics}\label{statistics}} + +\textbf{References:} +{[}\href{https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html}{14}{]} + +Sage includes the most basic functions for statistical analysis. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{20}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{]} + +\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}{)} + +\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}{)} +\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}{)} +\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}{)} + +\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}{)} +\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}{)} + +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +Values: [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0] +Mean: 5/13 +Median: 1 +Mode: [3] +Standard deviation: 2*sqrt(29/13) +Variance: 116/13 +Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5] + \end{Verbatim} + + You can also compare your data to a probability distribution, see +\href{https://doc.sagemath.org/html/en/reference/probability/sage/probability/probability_distribution.html}{this +page}. If you need to do more advanced statistics you should consider +using \href{https://www.r-project.org/}{R}; you can also use it inside +Sage. + + \hypertarget{plotting}{% +\subsection{Plotting}\label{plotting}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/reference/plotting/index.html}{15}{]}, +more specifically the subsection +{[}\href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html}{16}{]}. + +Some Sage objects can be plotted: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{21}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{f} \PY{o}{=} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)} +\PY{n}{plot}\PY{p}{(}\PY{n}{f}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + +\prompt{Out}{outcolor}{21}{} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_75_0.png} + \end{center} + { \hspace*{\fill} \\} + + + Sage's plotting functions are based on Python's +\href{https://matplotlib.org/}{matplotlib}. + +You can give a number of options to adjust the aspect of your plot, see +\href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html\#sage.plot.plot.plot}{here}. +Let's see some of them: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{67}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{f} \PY{o}{=} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)} +\PY{n}{plot}\PY{p}{(}\PY{n}{f}\PY{p}{,} + \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} + \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} + \PY{n}{color} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{red}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} + \PY{n}{title} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{The sin function}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} + \PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + +\prompt{Out}{outcolor}{67}{} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_77_0.png} + \end{center} + { \hspace*{\fill} \\} + + + Some of the options are not described precisely in Sage's documentation, +but you can find them on +\href{https://matplotlib.org/stable/contents.html}{matplotlib's +documentation}. You can find many examples online for adjusting your +plot as you like! + + If you need to plot more than one object at the time, you can sum two +plots and show them together with \texttt{show()}: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{36}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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}{)} + +\PY{n}{show}\PY{p}{(}\PY{n}{cosine} \PY{o}{+} \PY{n}{exponential}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_80_0.png} + \end{center} + { \hspace*{\fill} \\} + + Finally, there are other types of plots that you can use, like +\href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/scatter_plot.html\#sage.plot.scatter_plot.scatter_plot}{scatter +plots} and +\href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/bar_chart.html\#sage.plot.bar_chart.bar_chart}{bar +charts}. You can also add +\href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/text.html\#sage.plot.text.text}{text} +to your plot: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{53}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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}{,} + \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} + \PY{n}{markersize} \PY{o}{=} \PY{l+m+mi}{100}\PY{p}{,} + \PY{n}{edgecolor} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{black}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} + \PY{n}{facecolor} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{red}\PY{l+s+s2}{\PYZdq{}} + \PY{p}{)} +\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}{)} +\PY{n}{show}\PY{p}{(}\PY{n}{b} \PY{o}{+} \PY{n}{s} \PY{o}{+} \PY{n}{t}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_82_0.png} + \end{center} + { \hspace*{\fill} \\} + + \hypertarget{interpolation}{% +\subsection{Interpolation}\label{interpolation}} + +\textbf{References:} +{[}\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}{]} +and +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/interpolation.html}{18}{]}. + +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. + +One way to do so is finding the lowest-degree polynomial that passes +through all your points. This is called +\href{https://en.wikipedia.org/wiki/Lagrange_polynomial}{Lagrange +Polynomial}. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{65}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{]} +\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} +\PY{n}{lp} \PY{o}{=} \PY{n}{polring}\PY{o}{.}\PY{n}{lagrange\PYZus{}polynomial}\PY{p}{(}\PY{n}{points}\PY{p}{)} +\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}{)} + \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} + \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}{)} + \PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_84_0.png} + \end{center} + { \hspace*{\fill} \\} + + 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). + +However, it does not always give you good approximation of your data: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{2}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{]} +\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}{]} +\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}{]} +\PY{n}{polring}\PY{o}{.}\PY{o}{\PYZlt{}}\PY{n}{x}\PY{o}{\PYZgt{}} \PY{o}{=} \PY{n}{RR}\PY{p}{[}\PY{p}{]} +\PY{n}{lp} \PY{o}{=} \PY{n}{polring}\PY{o}{.}\PY{n}{lagrange\PYZus{}polynomial}\PY{p}{(}\PY{n}{points}\PY{p}{)} + +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_86_0.png} + \end{center} + { \hspace*{\fill} \\} + + This particular example is called +\href{https://en.wikipedia.org/wiki/Runge\%27s_phenomenon}{Runge's +phenomenon}. For a better approximation you can use a +\href{https://en.wikipedia.org/wiki/Spline_(mathematics)}{spline}, which +is a \emph{piecewise} polynomial function: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{90}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_88_0.png} + \end{center} + { \hspace*{\fill} \\} + + 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. + + + % Add a bibliography block to the postdoc + + + +\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 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\providecommand \oddpage@label [2]{} +\@writefile{toc}{\contentsline {section}{\numberline {1}The \texttt {show()} command}{1}{section.1}\protected@file@percent } +\newlabel{the-show-command}{{1}{1}{\texorpdfstring {The \texttt {show()} command}{The show() command}}{section.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {2}The \texttt {latex()} command}{2}{section.2}\protected@file@percent } +\newlabel{the-latex-command}{{2}{2}{\texorpdfstring {The \texttt {latex()} command}{The latex() command}}{section.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}A Latex name for your variables}{2}{subsection.2.1}\protected@file@percent } +\newlabel{a-latex-name-for-your-variables}{{2.1}{2}{A Latex name for your variables}{subsection.2.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {3}From Jupyter to Latex}{3}{section.3}\protected@file@percent } +\newlabel{from-jupyter-to-latex}{{3}{3}{From Jupyter to Latex}{section.3}{}} +\@writefile{toc}{\contentsline {section}{\numberline {4}SageTex}{3}{section.4}\protected@file@percent } +\newlabel{sagetex}{{4}{3}{SageTex}{section.4}{}} +\@writefile{toc}{\contentsline {section}{\numberline {5}The Latex \texttt {listings} package}{3}{section.5}\protected@file@percent } +\newlabel{the-latex-listings-package}{{5}{3}{\texorpdfstring {The Latex \texttt {listings} package}{The Latex listings package}}{section.5}{}} +\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 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "In this document we will describe some of these interactions between LaTeX and Sage." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The `show()` command\n", + "**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", + "\n", + "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", + "\n", + "You can see it as an alternative to `print()`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 + 1*x + 1/2*x^2 + 1/6*x^3 + Order(x^4)\n" + ] + }, + { + "data": { + "text/html": [ + "" + ], + "text/latex": [ + "\\begin{math}\n", + "\\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", + "\\end{math}" + ], + "text/plain": [ + "1 + 1*x + 1/2*x^2 + 1/6*x^3 + Order(x^4)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 1 2 3]\n", + "[ 4 5 6]\n", + "[ 8 9 10]\n" + ] + }, + { + "data": { + "text/html": [ + "" + ], + "text/latex": [ + "\\begin{math}\n", + "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n", + "1 & 2 & 3 \\\\\n", + "4 & 5 & 6 \\\\\n", + "8 & 9 & 10\n", + "\\end{array}\\right)\n", + "\\end{math}" + ], + "text/plain": [ + "[ 1 2 3]\n", + "[ 4 5 6]\n", + "[ 8 9 10]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "pi\n" + ] + }, + { + "data": { + "text/html": [ + "" + ], + "text/latex": [ + "\\begin{math}\n", + "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\pi\n", + "\\end{math}" + ], + "text/plain": [ + "pi" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "s = (e^x).series(x==0, 4)\n", + "M = matrix([[1,2,3],[4,5,6],[8,9,10]])\n", + "print(s)\n", + "show(s)\n", + "print(M)\n", + "show(M)\n", + "print(pi)\n", + "show(pi)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In a Jupyter notebook, the results above are displayed using [MathJax](https://www.mathjax.org/).\n", + "\n", + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The `latex()` command\n", + "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/misc/sage/misc/latex.html)]\n", + "\n", + "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", + "\n", + "Technically, this is a function that returns a string, so you need to `print()` it to see the result." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 + 1 x + \\frac{1}{2} x^{2} + \\frac{1}{6} x^{3} + \\mathcal{O}\\left(x^{4}\\right)\n", + "\n", + "\n", + "\\left(\\begin{array}{rrr}\n", + "1 & 2 & 3 \\\\\n", + "4 & 5 & 6 \\\\\n", + "8 & 9 & 10\n", + "\\end{array}\\right)\n" + ] + } + ], + "source": [ + "print(latex(s))\n", + "print(\"\\n\")\n", + "print(latex(M))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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)." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "#latex(plot(x^2)) # The output is more than 20 pages long" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It is probably easier to just generate the picture and include that in your Latex document with `\\includegraphics`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## A Latex name for your variables\n", + "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/var.html)]\n", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "phi1(epsilon)\n" + ] + }, + { + "data": { + "text/html": [ + "" + ], + "text/latex": [ + "\\begin{math}\n", + "\\newcommand{\\Bold}[1]{\\mathbf{#1}}e^{{\\varepsilon}} + \\phi_1\\left({\\varepsilon}\\right)\n", + "\\end{math}" + ], + "text/plain": [ + "e^epsilon + phi1(epsilon)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "e^{{\\varepsilon}} + \\phi_1\\left({\\varepsilon}\\right)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('epsilon', latex_name=\"\\\\varepsilon\")\n", + "function('phi1', latex_name=\"\\\\phi_1\")\n", + "\n", + "print(phi1(epsilon))\n", + "show(phi1(epsilon) + e^epsilon)\n", + "latex(phi1(epsilon) + e^epsilon)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# From Jupyter to Latex\n", + "**Reference:** [[4](https://nbconvert.readthedocs.io/en/latest/)]\n", + "\n", + "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", + "\n", + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# SageTex\n", + "**Reference:** [[5](https://doc.sagemath.org/html/en/tutorial/sagetex.html)]\n", + "\n", + "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", + "\n", + "You might need to take some extra steps to make this work on your system, see the link above." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The Latex `listings` package\n", + "**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", + "\n", + "If you want to include some code (Sage, Python or anything else) in a Latex document you can use the listings package.\n", + "\n", + "```\n", + "\\usepackage{listings}\n", + "\n", + "...\n", + "\n", + "\\begin{lstlisting}[language=Python]\n", + "for i in range(0,100):\n", + " if i%5 == 0:\n", + " print(\"Multiple of 5!\")\n", + "\\end{lstlisting}\n", + "```\n", + "\n", + "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", + "\n", + "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", + "\n", + "```\n", + "\\lstinputlisting[language=Python]{file.py}\n", + "```\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} 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 @@ +This 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 +entering extended mode + \write18 enabled. + %&-line parsing enabled. +**9-SageLatex.tex +(./9-SageLatex.tex +LaTeX2e <2020-10-01> patch level 2 +L3 programming layer <2020-12-03> xparse <2020-03-03> +(/usr/share/texmf-dist/tex/latex/base/article.cls +Document Class: article 2020/04/10 v1.4m Standard LaTeX document class +(/usr/share/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2020/04/10 v1.4m Standard LaTeX file (size option) +) +\c@part=\count177 +\c@section=\count178 +\c@subsection=\count179 +\c@subsubsection=\count180 +\c@paragraph=\count181 +\c@subparagraph=\count182 +\c@figure=\count183 +\c@table=\count184 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/share/texmf-dist/tex/latex/tcolorbox/tcolorbox.sty +Package: tcolorbox 2020/10/09 version 4.42 text color boxes + +(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty +(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks15 +\pgfutil@tempdima=\dimen139 +\pgfutil@tempdimb=\dimen140 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex)) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box47 +) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a) +)) +Package: pgf 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty +(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks16 +) +(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. + +(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen141 +\Gin@req@width=\dimen142 +) +(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks17 +\pgfkeys@temptoks=\toks18 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex +\pgfkeys@tmptoks=\toks19 +)) +\pgf@x=\dimen143 +\pgf@y=\dimen144 +\pgf@xa=\dimen145 +\pgf@ya=\dimen146 +\pgf@xb=\dimen147 +\pgf@yb=\dimen148 +\pgf@xc=\dimen149 +\pgf@yc=\dimen150 +\pgf@xd=\dimen151 +\pgf@yd=\dimen152 +\w@pgf@writea=\write3 +\r@pgf@reada=\read2 +\c@pgf@counta=\count185 +\c@pgf@countb=\count186 +\c@pgf@countc=\count187 +\c@pgf@countd=\count188 +\t@pgf@toka=\toks20 +\t@pgf@tokb=\toks21 +\t@pgf@tokc=\toks22 +\pgf@sys@id@count=\count189 + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a) +) +Driver file for pgf: pgfsys-pdftex.def + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def +File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex +File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfsyssoftpath@smallbuffer@items=\count190 +\pgfsyssoftpath@bigbuffer@items=\count191 +) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex +File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen153 +\pgfmath@count=\count192 +\pgfmath@box=\box48 +\pgfmath@toks=\toks23 +\pgfmath@stack@operand=\toks24 +\pgfmath@stack@operation=\toks25 +) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code +.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te +x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics +.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count193 +)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex +File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@picminx=\dimen154 +\pgf@picmaxx=\dimen155 +\pgf@picminy=\dimen156 +\pgf@picmaxy=\dimen157 +\pgf@pathminx=\dimen158 +\pgf@pathmaxx=\dimen159 +\pgf@pathminy=\dimen160 +\pgf@pathmaxy=\dimen161 +\pgf@xx=\dimen162 +\pgf@xy=\dimen163 +\pgf@yx=\dimen164 +\pgf@yy=\dimen165 +\pgf@zx=\dimen166 +\pgf@zy=\dimen167 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex +File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@path@lastx=\dimen168 +\pgf@path@lasty=\dimen169 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex +File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@shorten@end@additional=\dimen170 +\pgf@shorten@start@additional=\dimen171 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex +File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfpic=\box49 +\pgf@hbox=\box50 +\pgf@layerbox@main=\box51 +\pgf@picture@serial@count=\count194 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex +File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgflinewidth=\dimen172 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t +ex +File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@pt@x=\dimen173 +\pgf@pt@y=\dimen174 +\pgf@pt@temp=\dimen175 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex +File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex +File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te +x +File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex +File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfarrowsep=\dimen176 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@max=\dimen177 +\pgf@sys@shading@range@num=\count195 +\pgf@shadingcount=\count196 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex +File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex +File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfexternal@startupbox=\box52 +)) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex +File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex +File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex +File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex +File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex +File: pgfmoduleshapes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfnodeparttextbox=\box53 +) +(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex +File: pgfmoduleplot.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty +Package: pgfcomp-version-0-65 2020/12/01 v3.1.7a (3.1.7a) +\pgf@nodesepstart=\dimen178 +\pgf@nodesepend=\dimen179 +) +(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty +Package: pgfcomp-version-1-18 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/latex/tools/verbatim.sty +Package: verbatim 2020-07-07 v1.5u LaTeX2e package for verbatim enhancements +\every@verbatim=\toks26 +\verbatim@line=\toks27 +\verbatim@in@stream=\read3 +) +(/usr/share/texmf-dist/tex/latex/environ/environ.sty +Package: environ 2014/05/04 v0.3 A new way to define environments + +(/usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty +Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list +) +\@envbody=\toks28 +) +(/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count197 +) +\tcb@titlebox=\box54 +\tcb@upperbox=\box55 +\tcb@lowerbox=\box56 +\tcb@phantombox=\box57 +\c@tcbbreakpart=\count198 +\c@tcblayer=\count199 +\c@tcolorbox@number=\count266 +\tcb@temp=\box58 +\tcb@temp=\box59 +\tcb@temp=\box60 +\tcb@temp=\box61 +\tcb@out=\write4 +\tcb@record@out=\write5 + +(/usr/share/texmf-dist/tex/latex/tcolorbox/tcbbreakable.code.tex +Library (tcolorbox): 'tcbbreakable.code.tex' version '4.42' +(/usr/share/texmf-dist/tex/generic/oberdiek/pdfcol.sty +Package: pdfcol 2019/12/29 v1.6 Handle new color stacks for pdfTeX (HO) + +(/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO) +) +(/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +Package pdfcol Info: New color stack `tcb@breakable' = 1 on input line 23. +\tcb@testbox=\box62 +\tcb@totalupperbox=\box63 +\tcb@totallowerbox=\box64 +)) +(/usr/share/texmf-dist/tex/latex/parskip/parskip.sty +Package: parskip 2020-06-15 v2.0f non-zero parskip adjustments + +(/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO) + +(/usr/share/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +))) +(/usr/share/texmf-dist/tex/latex/base/fontenc.sty +Package: fontenc 2020/08/10 v2.0s Standard LaTeX package +) +(/usr/share/texmf-dist/tex/latex/psnfss/mathpazo.sty +Package: mathpazo 2020/03/25 PSNFSS-v9.3 Palatino w/ Pazo Math (D.Puga, WaS) +\symupright=\mathgroup4 +) +(/usr/share/texmf-dist/tex/latex/caption/caption.sty +Package: caption 2020/10/26 v3.5g Customizing captions (AR) + +(/usr/share/texmf-dist/tex/latex/caption/caption3.sty +Package: caption3 2020/10/21 v2.2e caption3 kernel (AR) +\captionmargin=\dimen180 +\captionmargin@=\dimen181 +\captionwidth=\dimen182 +\caption@tempdima=\dimen183 +\caption@indent=\dimen184 +\caption@parindent=\dimen185 +\caption@hangindent=\dimen186 +Package caption Info: Standard document class detected. +) +\c@caption@flags=\count267 +\c@continuedfloat=\count268 +) +(/usr/share/texmf-dist/tex/latex/adjustbox/adjustbox.sty +Package: adjustbox 2020/08/19 v1.3 Adjusting TeX boxes (trim, clip, ...) + +(/usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty +Package: xkeyval 2020/11/20 v2.8 package option processing (HA) + +(/usr/share/texmf-dist/tex/generic/xkeyval/xkeyval.tex +(/usr/share/texmf-dist/tex/generic/xkeyval/xkvutils.tex +\XKV@toks=\toks29 +\XKV@tempa@toks=\toks30 +) +\XKV@depth=\count269 +File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA) +)) +(/usr/share/texmf-dist/tex/latex/adjustbox/adjcalc.sty +Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back +-ends (calc, etex, pgfmath) +) +(/usr/share/texmf-dist/tex/latex/adjustbox/trimclip.sty +Package: trimclip 2020/08/19 v1.2 Trim and clip general TeX material + +(/usr/share/texmf-dist/tex/latex/collectbox/collectbox.sty +Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes +\collectedbox=\box65 +) +\tc@llx=\dimen187 +\tc@lly=\dimen188 +\tc@urx=\dimen189 +\tc@ury=\dimen190 +Package trimclip Info: Using driver 'tc-pdftex.def'. + +(/usr/share/texmf-dist/tex/latex/adjustbox/tc-pdftex.def +File: tc-pdftex.def 2019/01/04 v2.2 Clipping driver for pdftex +)) +\adjbox@Width=\dimen191 +\adjbox@Height=\dimen192 +\adjbox@Depth=\dimen193 +\adjbox@Totalheight=\dimen194 +\adjbox@pwidth=\dimen195 +\adjbox@pheight=\dimen196 +\adjbox@pdepth=\dimen197 +\adjbox@ptotalheight=\dimen198 + +(/usr/share/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty +Package: ifoddpage 2016/04/23 v1.1 Conditionals for odd/even page detection +\c@checkoddpage=\count270 +) +(/usr/share/texmf-dist/tex/latex/varwidth/varwidth.sty +Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages +\@vwid@box=\box66 +\sift@deathcycles=\count271 +\@vwid@loff=\dimen199 +\@vwid@roff=\dimen256 +)) +(/usr/share/texmf-dist/tex/latex/float/float.sty +Package: float 2001/11/08 v1.3d Float enhancements (AL) +\c@float@type=\count272 +\float@exts=\toks31 +\float@box=\box67 +\@float@everytoks=\toks32 +\@floatcapt=\box68 +) +(/usr/share/texmf-dist/tex/latex/tools/enumerate.sty +Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC) +\@enLab=\toks33 +) +(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. +) +\Gm@cnth=\count273 +\Gm@cntv=\count274 +\c@Gm@tempcnt=\count275 +\Gm@bindingoffset=\dimen257 +\Gm@wd@mp=\dimen258 +\Gm@odd@mp=\dimen259 +\Gm@even@mp=\dimen260 +\Gm@layoutwidth=\dimen261 +\Gm@layoutheight=\dimen262 +\Gm@layouthoffset=\dimen263 +\Gm@layoutvoffset=\dimen264 +\Gm@dimlist=\toks34 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/09/23 v2.17i AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks35 +\ex@=\dimen265 +)) +(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen266 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count276 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count277 +\leftroot@=\count278 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count279 +\DOTSCASE@=\count280 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box69 +\strutbox@=\box70 +\big@size=\dimen267 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count281 +\c@MaxMatrixCols=\count282 +\dotsspace@=\muskip16 +\c@parentequation=\count283 +\dspbrk@lvl=\count284 +\tag@help=\toks36 +\row@=\count285 +\column@=\count286 +\maxfields@=\count287 +\andhelp@=\toks37 +\eqnshift@=\dimen268 +\alignsep@=\dimen269 +\tagshift@=\dimen270 +\tagwidth@=\dimen271 +\totwidth@=\dimen272 +\lineht@=\dimen273 +\@envbody=\toks38 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks39 +LaTeX Info: Redefining \[ on input line 2923. +LaTeX Info: Redefining \] on input line 2924. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup5 +\symAMSb=\mathgroup6 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texmf-dist/tex/latex/base/textcomp.sty +Package: textcomp 2020/02/02 v2.0n Standard LaTeX package +) +(/usr/share/texmf-dist/tex/latex/upquote/upquote.sty +Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba +tim +) +(/usr/share/texmf-dist/tex/latex/eurosym/eurosym.sty +Package: eurosym 1998/08/06 v1.1 European currency symbol ``Euro'' +\@eurobox=\box71 +) +(/usr/share/texmf-dist/tex/latex/ucs/ucs.sty +Package: ucs 2013/05/11 v2.2 UCS: Unicode input support + +(/usr/share/texmf-dist/tex/latex/ucs/data/uni-global.def +File: uni-global.def 2013/05/13 UCS: Unicode global data +) +\uc@secondtry=\count288 +\uc@combtoks=\toks40 +\uc@combtoksb=\toks41 +\uc@temptokena=\toks42 +) +(/usr/share/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +Package: fancyvrb 2020/05/03 v3.6 verbatim text (tvz,hv) +\FV@CodeLineNo=\count289 +\FV@InFile=\read4 +\FV@TabBox=\box72 +\c@FancyVerbLine=\count290 +\FV@StepNumber=\count291 +\FV@OutFile=\write6 +) +(/usr/share/texmf-dist/tex/latex/grffile/grffile.sty +Package: grffile 2019/11/11 v2.1 Extended file name support for graphics (legac +y) +Package grffile Info: This package is an empty stub for compatibility on input +line 40. +) +(/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2020-05-15 v7.00e Hypertext links for LaTeX + +(/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(/usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) +(/usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) +(/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +\@linkdim=\dimen274 +\Hy@linkcounter=\count292 +\Hy@pagecounter=\count293 + +(/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2020-05-15 v7.00e Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) +(/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +(/usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) +) +\Hy@SavedSpaceFactor=\count294 +Package hyperref Info: Hyper figures OFF on input line 4464. +Package hyperref Info: Link nesting OFF on input line 4469. +Package hyperref Info: Hyper index ON on input line 4472. +Package hyperref Info: Plain pages OFF on input line 4479. +Package hyperref Info: Backreferencing OFF on input line 4484. +Package hyperref Info: Implicit mode ON; LaTeX internals redefined. +Package hyperref Info: Bookmarks ON on input line 4717. +\c@Hy@tempcnt=\count295 + +(/usr/share/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip17 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5076. +\XeTeXLinkMargin=\dimen275 + +(/usr/share/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(/usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +\Fld@menulength=\count296 +\Field@Width=\dimen276 +\Fld@charsize=\dimen277 +Package hyperref Info: Hyper figures OFF on input line 6347. +Package hyperref Info: Link nesting OFF on input line 6352. +Package hyperref Info: Hyper index ON on input line 6355. +Package hyperref Info: backreferencing OFF on input line 6362. +Package hyperref Info: Link coloring OFF on input line 6367. +Package hyperref Info: Link coloring with OCG OFF on input line 6372. +Package hyperref Info: PDF/A mode OFF on input line 6377. +LaTeX Info: Redefining \ref on input line 6417. +LaTeX Info: Redefining \pageref on input line 6421. + +(/usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty +Package: atbegshi-ltx 2020/08/17 v1.0a Emulation of the original atbegshi packa +ge +with kernel methods +) +\Hy@abspage=\count297 +\c@Item=\count298 +\c@Hfootnote=\count299 +) +Package hyperref Info: Driver (autodetected): hpdftex. + +(/usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2020-05-15 v7.00e Hyperref driver for pdfTeX + +(/usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty +Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atvery packag +e +with kernel methods +) +\Fld@listcount=\count300 +\c@bookmark@seq@number=\count301 + +(/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) + +(/usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +86. +) +\Hy@SectionHShift=\skip52 +) +(/usr/share/texmf-dist/tex/latex/titling/titling.sty +Package: titling 2009/09/04 v2.1d maketitle typesetting +\thanksmarkwidth=\skip53 +\thanksmargin=\skip54 +\droptitle=\skip55 +) +(/usr/share/texmf-dist/tex/latex/tools/longtable.sty +Package: longtable 2020/01/07 v4.13 Multi-page Table package (DPC) +\LTleft=\skip56 +\LTright=\skip57 +\LTpre=\skip58 +\LTpost=\skip59 +\LTchunksize=\count302 +\LTcapwidth=\dimen278 +\LT@head=\box73 +\LT@firsthead=\box74 +\LT@foot=\box75 +\LT@lastfoot=\box76 +\LT@cols=\count303 +\LT@rows=\count304 +\c@LT@tables=\count305 +\c@LT@chunks=\count306 +\LT@p@ftn=\toks43 +) +(/usr/share/texmf-dist/tex/latex/booktabs/booktabs.sty +Package: booktabs 2020/01/12 v1.61803398 Publication quality tables +\heavyrulewidth=\dimen279 +\lightrulewidth=\dimen280 +\cmidrulewidth=\dimen281 +\belowrulesep=\dimen282 +\belowbottomsep=\dimen283 +\aboverulesep=\dimen284 +\abovetopsep=\dimen285 +\cmidrulesep=\dimen286 +\cmidrulekern=\dimen287 +\defaultaddspace=\dimen288 +\@cmidla=\count307 +\@cmidlb=\count308 +\@aboverulesep=\dimen289 +\@belowrulesep=\dimen290 +\@thisruleclass=\count309 +\@lastruleclass=\count310 +\@thisrulewidth=\dimen291 +) +(/usr/share/texmf-dist/tex/latex/enumitem/enumitem.sty +Package: enumitem 2019/06/20 v3.9 Customized lists +\labelindent=\skip60 +\enit@outerparindent=\dimen292 +\enit@toks=\toks44 +\enit@inbox=\box77 +\enit@count@id=\count311 +\enitdp@description=\count312 +) +(/usr/share/texmf-dist/tex/generic/ulem/ulem.sty +\UL@box=\box78 +\UL@hyphenbox=\box79 +\UL@skip=\skip61 +\UL@hook=\toks45 +\UL@height=\dimen293 +\UL@pe=\count313 +\UL@pixel=\dimen294 +\ULC@box=\box80 +Package: ulem 2019/11/18 +\ULdepth=\dimen295 +) +(/usr/share/texmf-dist/tex/latex/jknapltx/mathrsfs.sty +Package: mathrsfs 1996/01/01 Math RSFS package v1.0 (jk) +\symrsfs=\mathgroup7 +) +\Wrappedcontinuationbox=\box81 +\Wrappedvisiblespacebox=\box82 +Package hyperref Info: Option `breaklinks' set `true' on input line 361. +Package hyperref Info: Option `colorlinks' set `true' on input line 361. +LaTeX Font Info: Trying to load font information for T1+ppl on input line 36 +8. + +(/usr/share/texmf-dist/tex/latex/psnfss/t1ppl.fd +File: t1ppl.fd 2001/06/04 font definitions for T1/ppl. +) +(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX) +\l__kernel_color_stack_int=\count314 +\l__pdf_internal_box=\box83 +) +(./9-SageLatex.aux) +\openout1 = `9-SageLatex.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. + (/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count315 +\scratchdimen=\dimen296 +\scratchbox=\box84 +\nofMPsegments=\count316 +\nofMParguments=\count317 +\everyMPshowfont=\toks46 +\MPscratchCnt=\count318 +\MPscratchDim=\dimen297 +\MPnumerator=\count319 +\makeMPintoPDFobject=\count320 +\everyMPtoPDFconversion=\toks47 +) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +Package caption Info: Begin \AtBeginDocument code. +Package caption Info: float package is loaded. +Package caption Info: hyperref package is loaded. +Package caption Info: longtable package is loaded. + +(/usr/share/texmf-dist/tex/latex/caption/ltcaption.sty +Package: ltcaption 2020/05/30 v1.4b longtable captions (AR) +) +Package caption Info: End \AtBeginDocument code. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: +* layout: +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt) +* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt) +* \paperwidth=614.295pt +* \paperheight=794.96999pt +* \textwidth=469.75502pt +* \textheight=650.43001pt +* \oddsidemargin=0.0pt +* \evensidemargin=0.0pt +* \topmargin=-37.0pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=11.0pt +* \footskip=30.0pt +* \marginparwidth=59.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texmf-dist/tex/latex/ucs/ucsencs.def +File: ucsencs.def 2011/01/21 Fixes to fontencodings LGR, T3 +) +Package hyperref Info: Link coloring ON on input line 368. + +(/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section + +(/usr/share/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) +) +\c@section@level=\count321 +) +LaTeX Info: Redefining \ref on input line 368. +LaTeX Info: Redefining \pageref on input line 368. +LaTeX Info: Redefining \nameref on input line 368. + +(./9-SageLatex.out) (./9-SageLatex.out) +\@outlinefile=\write7 +\openout7 = `9-SageLatex.out'. + +LaTeX Font Info: Trying to load font information for OT1+ppl on input line 3 +70. + +(/usr/share/texmf-dist/tex/latex/psnfss/ot1ppl.fd +File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl. +) +LaTeX Font Info: Trying to load font information for OML+zplm on input line +370. + +(/usr/share/texmf-dist/tex/latex/psnfss/omlzplm.fd +File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm. +) +LaTeX Font Info: Trying to load font information for OMS+zplm on input line +370. + +(/usr/share/texmf-dist/tex/latex/psnfss/omszplm.fd +File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm. +) +LaTeX Font Info: Trying to load font information for OMX+zplm on input line +370. + +(/usr/share/texmf-dist/tex/latex/psnfss/omxzplm.fd +File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm. +) +LaTeX Font Info: Trying to load font information for OT1+zplm on input line +370. + +(/usr/share/texmf-dist/tex/latex/psnfss/ot1zplm.fd +File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm. +) +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 12.50409pt on input line 370. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 9.37807pt on input line 370. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 7.29405pt on input line 370. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 12.50409pt on input line 370. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 9.37807pt on input line 370. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 7.29405pt on input line 370. +LaTeX Font Info: Trying to load font information for U+rsfs on input line 37 +0. + +(/usr/share/texmf-dist/tex/latex/jknapltx/ursfs.fd +File: ursfs.fd 1998/03/24 rsfs font definition file (jk) +) +LaTeX Font Info: Trying to load font information for T1+cmtt on input line 3 +70. + +(/usr/share/texmf-dist/tex/latex/base/t1cmtt.fd +File: t1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions +) +LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <14.4> not available +(Font) Font shape `T1/cmtt/m/n' tried instead on input line 386. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 6.25204pt on input line 402. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 5.21004pt on input line 402. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 6.25204pt on input line 402. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 5.21004pt on input line 402. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 11.40997pt on input line 418. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 8.33606pt on input line 418. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 11.40997pt on input line 418. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 8.33606pt on input line 418. + [1 + +{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] +LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <10.95> not available +(Font) Font shape `T1/cmtt/m/n' tried instead on input line 473. +LaTeX Font Info: Trying to load font information for TS1+cmtt on input line +517. + (/usr/share/texmf-dist/tex/latex/base/ts1cmtt.fd +File: ts1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions +) [2] [3] [4] (./9-SageLatex.aux) +Package rerunfilecheck Info: File `9-SageLatex.out' has not changed. +(rerunfilecheck) Checksum: A41656EED8025F02B8135E03FFA75587;350. + + +LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right. + + ) +Here is how much of TeX's memory you used: + 21220 strings out of 479383 + 386846 string characters out of 5875798 + 697645 words of memory out of 5000000 + 37852 multiletter control sequences out of 15000+600000 + 439695 words of font info for 120 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 107i,8n,111p,504b,595s stack positions out of 5000i,500n,10000p,200000b,80000s +{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}{/usr/share/ +texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc}{/usr/share/texmf-dist/font +s/enc/dvips/base/8r.enc} +Output written on 9-SageLatex.pdf (4 pages, 183997 bytes). +PDF statistics: + 122 PDF objects out of 1000 (max. 8388607) + 103 compressed objects within 2 object streams + 17 named destinations out of 1000 (max. 500000) + 61 words of extra memory for PDF output out of 10000 (max. 10000000) + 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 @@ +\BOOKMARK [1][-]{section.1}{The show\(\) command}{}% 1 +\BOOKMARK [1][-]{section.2}{The latex\(\) command}{}% 2 +\BOOKMARK [2][-]{subsection.2.1}{A Latex name for your variables}{section.2}% 3 +\BOOKMARK [1][-]{section.3}{From Jupyter to Latex}{}% 4 +\BOOKMARK [1][-]{section.4}{SageTex}{}% 5 +\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 Binary files /dev/null and b/src/Lecture6/notebook/9-SageLatex.pdf 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 @@ +\documentclass[11pt]{article} + + \usepackage[breakable]{tcolorbox} + \usepackage{parskip} % Stop auto-indenting (to mimic markdown behaviour) + + \usepackage{iftex} + \ifPDFTeX + \usepackage[T1]{fontenc} + \usepackage{mathpazo} + \else + \usepackage{fontspec} + \fi + + % Basic figure setup, for now with no caption control since it's done + % automatically by Pandoc (which extracts ![](path) syntax from Markdown). + \usepackage{graphicx} + % Maintain compatibility with old templates. Remove in nbconvert 6.0 + \let\Oldincludegraphics\includegraphics + % Ensure that by default, figures have no caption (until we provide a + % proper Figure object with a Caption API and a way to capture that + % in the conversion process - todo). + \usepackage{caption} + \DeclareCaptionFormat{nocaption}{} + \captionsetup{format=nocaption,aboveskip=0pt,belowskip=0pt} + + \usepackage[Export]{adjustbox} % Used to constrain images to a maximum size + \adjustboxset{max size={0.9\linewidth}{0.9\paperheight}} + \usepackage{float} + \floatplacement{figure}{H} % forces figures to be placed at the correct location + \usepackage{xcolor} % Allow colors to be defined + \usepackage{enumerate} % Needed for markdown enumerations to work + \usepackage{geometry} % Used to adjust the document margins + \usepackage{amsmath} % Equations + \usepackage{amssymb} % Equations + \usepackage{textcomp} % defines textquotesingle + % Hack from http://tex.stackexchange.com/a/47451/13684: + \AtBeginDocument{% + \def\PYZsq{\textquotesingle}% Upright quotes in Pygmentized code + } + \usepackage{upquote} % Upright quotes for verbatim code + \usepackage{eurosym} % defines \euro + \usepackage[mathletters]{ucs} % Extended unicode (utf-8) support + \usepackage{fancyvrb} % verbatim replacement that allows latex + \usepackage{grffile} % extends the file name processing of package graphics + % to support a larger range + \makeatletter % fix for grffile with XeLaTeX + \def\Gread@@xetex#1{% + \IfFileExists{"\Gin@base".bb}% + {\Gread@eps{\Gin@base.bb}}% + {\Gread@@xetex@aux#1}% + } + \makeatother + + % The hyperref package gives us a pdf with properly built + % internal navigation ('pdf bookmarks' for the table of contents, + % internal cross-reference links, web links for URLs, etc.) + \usepackage{hyperref} + % The default LaTeX title has an obnoxious amount of whitespace. By default, + % titling removes some of it. It also provides customization options. + \usepackage{titling} + \usepackage{longtable} % longtable support required by pandoc >1.10 + \usepackage{booktabs} % table support for pandoc > 1.12.2 + \usepackage[inline]{enumitem} % IRkernel/repr support (it uses the enumerate* environment) + \usepackage[normalem]{ulem} % ulem is needed to support strikethroughs (\sout) + % normalem makes italics be italics, not underlines + \usepackage{mathrsfs} + + + + % Colors for the hyperref package + \definecolor{urlcolor}{rgb}{0,.145,.698} + \definecolor{linkcolor}{rgb}{.71,0.21,0.01} + \definecolor{citecolor}{rgb}{.12,.54,.11} + + % ANSI colors + \definecolor{ansi-black}{HTML}{3E424D} + \definecolor{ansi-black-intense}{HTML}{282C36} + \definecolor{ansi-red}{HTML}{E75C58} + \definecolor{ansi-red-intense}{HTML}{B22B31} + \definecolor{ansi-green}{HTML}{00A250} + \definecolor{ansi-green-intense}{HTML}{007427} + \definecolor{ansi-yellow}{HTML}{DDB62B} + \definecolor{ansi-yellow-intense}{HTML}{B27D12} + \definecolor{ansi-blue}{HTML}{208FFB} + \definecolor{ansi-blue-intense}{HTML}{0065CA} + \definecolor{ansi-magenta}{HTML}{D160C4} + \definecolor{ansi-magenta-intense}{HTML}{A03196} + \definecolor{ansi-cyan}{HTML}{60C6C8} + \definecolor{ansi-cyan-intense}{HTML}{258F8F} + \definecolor{ansi-white}{HTML}{C5C1B4} + \definecolor{ansi-white-intense}{HTML}{A1A6B2} + \definecolor{ansi-default-inverse-fg}{HTML}{FFFFFF} + \definecolor{ansi-default-inverse-bg}{HTML}{000000} + + % commands and environments needed by pandoc snippets + % extracted from the output of `pandoc -s` + \providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} + \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} + % Add ',fontsize=\small' for more characters per line + \newenvironment{Shaded}{}{} + \newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{{#1}}} + \newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{{#1}}}} + \newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{{#1}}} + \newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{{#1}}} + \newcommand{\RegionMarkerTok}[1]{{#1}} + \newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\NormalTok}[1]{{#1}} + + % Additional commands for more recent versions of Pandoc + \newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{{#1}}} + \newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{{#1}}} + \newcommand{\ImportTok}[1]{{#1}} + \newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{{#1}}}} + \newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{{#1}}} + \newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{{#1}}} + \newcommand{\BuiltInTok}[1]{{#1}} + \newcommand{\ExtensionTok}[1]{{#1}} + \newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{{#1}}} + \newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{{#1}}} + \newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + + + % Define a nice break command that doesn't care if a line doesn't already + % exist. + \def\br{\hspace*{\fill} \\* } + % Math Jax compatibility definitions + \def\gt{>} + \def\lt{<} + \let\Oldtex\TeX + \let\Oldlatex\LaTeX + \renewcommand{\TeX}{\textrm{\Oldtex}} + \renewcommand{\LaTeX}{\textrm{\Oldlatex}} + % Document parameters + % Document title + \title{Sage and Latex interaction} + \author{Sebastiano Tronto - \texttt{sebastiano.tronto@uni.lu}} + \date{2021-05-07} + + + + + +% Pygments definitions +\makeatletter +\def\PY@reset{\let\PY@it=\relax \let\PY@bf=\relax% + \let\PY@ul=\relax \let\PY@tc=\relax% + \let\PY@bc=\relax \let\PY@ff=\relax} +\def\PY@tok#1{\csname PY@tok@#1\endcsname} +\def\PY@toks#1+{\ifx\relax#1\empty\else% + \PY@tok{#1}\expandafter\PY@toks\fi} +\def\PY@do#1{\PY@bc{\PY@tc{\PY@ul{% + \PY@it{\PY@bf{\PY@ff{#1}}}}}}} +\def\PY#1#2{\PY@reset\PY@toks#1+\relax+\PY@do{#2}} + +\expandafter\def\csname PY@tok@w\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}} +\expandafter\def\csname PY@tok@c\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.74,0.48,0.00}{##1}}} +\expandafter\def\csname PY@tok@k\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}} +\expandafter\def\csname PY@tok@o\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@ow\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@nb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@nc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@nn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@ne\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.82,0.25,0.23}{##1}}} +\expandafter\def\csname PY@tok@nv\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@no\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@nl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@ni\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}} +\expandafter\def\csname PY@tok@na\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.49,0.56,0.16}{##1}}} +\expandafter\def\csname PY@tok@nt\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@s\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sd\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@si\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@se\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.13}{##1}}} +\expandafter\def\csname PY@tok@sr\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@ss\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@sx\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@m\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@gh\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@gu\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@gd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@gi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@gr\endcsname{\def\PY@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@ge\endcsname{\let\PY@it=\textit} +\expandafter\def\csname PY@tok@gs\endcsname{\let\PY@bf=\textbf} +\expandafter\def\csname PY@tok@gp\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@go\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.53,0.53}{##1}}} +\expandafter\def\csname PY@tok@gt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}} +\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}}} +\expandafter\def\csname PY@tok@kc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kd\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kr\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@bp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@fm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@vc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vg\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@sa\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@dl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@s2\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@s1\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@mb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@il\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mo\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@ch\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cm\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cpf\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@c1\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cs\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} + +\def\PYZbs{\char`\\} +\def\PYZus{\char`\_} +\def\PYZob{\char`\{} +\def\PYZcb{\char`\}} +\def\PYZca{\char`\^} +\def\PYZam{\char`\&} +\def\PYZlt{\char`\<} +\def\PYZgt{\char`\>} +\def\PYZsh{\char`\#} +\def\PYZpc{\char`\%} +\def\PYZdl{\char`\$} +\def\PYZhy{\char`\-} +\def\PYZsq{\char`\'} +\def\PYZdq{\char`\"} +\def\PYZti{\char`\~} +% for compatibility with earlier versions +\def\PYZat{@} +\def\PYZlb{[} +\def\PYZrb{]} +\makeatother + + + % For linebreaks inside Verbatim environment from package fancyvrb. + \makeatletter + \newbox\Wrappedcontinuationbox + \newbox\Wrappedvisiblespacebox + \newcommand*\Wrappedvisiblespace {\textcolor{red}{\textvisiblespace}} + \newcommand*\Wrappedcontinuationsymbol {\textcolor{red}{\llap{\tiny$\m@th\hookrightarrow$}}} + \newcommand*\Wrappedcontinuationindent {3ex } + \newcommand*\Wrappedafterbreak {\kern\Wrappedcontinuationindent\copy\Wrappedcontinuationbox} + % Take advantage of the already applied Pygments mark-up to insert + % potential linebreaks for TeX processing. + % {, <, #, %, $, ' and ": go to next line. + % _, }, ^, &, >, - and ~: stay at end of broken line. + % Use of \textquotesingle for straight quote. + \newcommand*\Wrappedbreaksatspecials {% + \def\PYGZus{\discretionary{\char`\_}{\Wrappedafterbreak}{\char`\_}}% + \def\PYGZob{\discretionary{}{\Wrappedafterbreak\char`\{}{\char`\{}}% + \def\PYGZcb{\discretionary{\char`\}}{\Wrappedafterbreak}{\char`\}}}% + \def\PYGZca{\discretionary{\char`\^}{\Wrappedafterbreak}{\char`\^}}% + \def\PYGZam{\discretionary{\char`\&}{\Wrappedafterbreak}{\char`\&}}% + \def\PYGZlt{\discretionary{}{\Wrappedafterbreak\char`\<}{\char`\<}}% + \def\PYGZgt{\discretionary{\char`\>}{\Wrappedafterbreak}{\char`\>}}% + \def\PYGZsh{\discretionary{}{\Wrappedafterbreak\char`\#}{\char`\#}}% + \def\PYGZpc{\discretionary{}{\Wrappedafterbreak\char`\%}{\char`\%}}% + \def\PYGZdl{\discretionary{}{\Wrappedafterbreak\char`\$}{\char`\$}}% + \def\PYGZhy{\discretionary{\char`\-}{\Wrappedafterbreak}{\char`\-}}% + \def\PYGZsq{\discretionary{}{\Wrappedafterbreak\textquotesingle}{\textquotesingle}}% + \def\PYGZdq{\discretionary{}{\Wrappedafterbreak\char`\"}{\char`\"}}% + \def\PYGZti{\discretionary{\char`\~}{\Wrappedafterbreak}{\char`\~}}% + } + % Some characters . , ; ? ! / are not pygmentized. + % This macro makes them "active" and they will insert potential linebreaks + \newcommand*\Wrappedbreaksatpunct {% + \lccode`\~`\.\lowercase{\def~}{\discretionary{\hbox{\char`\.}}{\Wrappedafterbreak}{\hbox{\char`\.}}}% + \lccode`\~`\,\lowercase{\def~}{\discretionary{\hbox{\char`\,}}{\Wrappedafterbreak}{\hbox{\char`\,}}}% + \lccode`\~`\;\lowercase{\def~}{\discretionary{\hbox{\char`\;}}{\Wrappedafterbreak}{\hbox{\char`\;}}}% + \lccode`\~`\:\lowercase{\def~}{\discretionary{\hbox{\char`\:}}{\Wrappedafterbreak}{\hbox{\char`\:}}}% + \lccode`\~`\?\lowercase{\def~}{\discretionary{\hbox{\char`\?}}{\Wrappedafterbreak}{\hbox{\char`\?}}}% + \lccode`\~`\!\lowercase{\def~}{\discretionary{\hbox{\char`\!}}{\Wrappedafterbreak}{\hbox{\char`\!}}}% + \lccode`\~`\/\lowercase{\def~}{\discretionary{\hbox{\char`\/}}{\Wrappedafterbreak}{\hbox{\char`\/}}}% + \catcode`\.\active + \catcode`\,\active + \catcode`\;\active + \catcode`\:\active + \catcode`\?\active + \catcode`\!\active + \catcode`\/\active + \lccode`\~`\~ + } + \makeatother + + \let\OriginalVerbatim=\Verbatim + \makeatletter + \renewcommand{\Verbatim}[1][1]{% + %\parskip\z@skip + \sbox\Wrappedcontinuationbox {\Wrappedcontinuationsymbol}% + \sbox\Wrappedvisiblespacebox {\FV@SetupFont\Wrappedvisiblespace}% + \def\FancyVerbFormatLine ##1{\hsize\linewidth + \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@ + \doublehyphendemerits\z@\finalhyphendemerits\z@ + \strut ##1\strut}% + }% + % If the linebreak is at a space, the latter will be displayed as visible + % space at end of first line, and a continuation symbol starts next line. + % Stretch/shrink are however usually zero for typewriter font. + \def\FV@Space {% + \nobreak\hskip\z@ plus\fontdimen3\font minus\fontdimen4\font + \discretionary{\copy\Wrappedvisiblespacebox}{\Wrappedafterbreak} + {\kern\fontdimen2\font}% + }% + + % Allow breaks at special characters using \PYG... macros. + \Wrappedbreaksatspecials + % Breaks at punctuation characters . , ; ? ! and / need catcode=\active + \OriginalVerbatim[#1,codes*=\Wrappedbreaksatpunct]% + } + \makeatother + + % Exact colors from NB + \definecolor{incolor}{HTML}{303F9F} + \definecolor{outcolor}{HTML}{D84315} + \definecolor{cellborder}{HTML}{CFCFCF} + \definecolor{cellbackground}{HTML}{F7F7F7} + + % prompt + \makeatletter + \newcommand{\boxspacing}{\kern\kvtcb@left@rule\kern\kvtcb@boxsep} + \makeatother + \newcommand{\prompt}[4]{ + \ttfamily\llap{{\color{#2}[#3]:\hspace{3pt}#4}}\vspace{-\baselineskip} + } + + + + % Prevent overflowing lines due to hard-to-break entities + \sloppy + % Setup hyperref package + \hypersetup{ + breaklinks=true, % so long urls are correctly broken across lines + colorlinks=true, + urlcolor=urlcolor, + linkcolor=linkcolor, + citecolor=citecolor, + } + % Slightly bigger margins than the latex defaults + + \geometry{verbose,tmargin=1in,bmargin=1in,lmargin=1in,rmargin=1in} + + + +\begin{document} + + \maketitle + + + + + 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. + +In this document we will describe some of these interactions between +LaTeX and Sage. + + \hypertarget{the-show-command}{% +\section{\texorpdfstring{The \texttt{show()} +command}{The show() command}}\label{the-show-command}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/reference/repl/sage/repl/display/pretty_print.html}{1}{]} +(\texttt{show()} is just an alternative name for +\texttt{pretty\_print()}). + +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. + +You can see it as an alternative to \texttt{print()}. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{4}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{s}\PY{p}{)} +\PY{n}{show}\PY{p}{(}\PY{n}{s}\PY{p}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{M}\PY{p}{)} +\PY{n}{show}\PY{p}{(}\PY{n}{M}\PY{p}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{pi}\PY{p}{)} +\PY{n}{show}\PY{p}{(}\PY{n}{pi}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +1 + 1*x + 1/2*x\^{}2 + 1/6*x\^{}3 + Order(x\^{}4) + \end{Verbatim} + + \begin{math} +\newcommand{\Bold}[1]{\mathbf{#1}}1 + 1 x + \frac{1}{2} x^{2} + \frac{1}{6} x^{3} + \mathcal{O}\left(x^{4}\right) +\end{math} + + + \begin{Verbatim}[commandchars=\\\{\}] +[ 1 2 3] +[ 4 5 6] +[ 8 9 10] + \end{Verbatim} + + \begin{math} +\newcommand{\Bold}[1]{\mathbf{#1}}\left(\begin{array}{rrr} +1 & 2 & 3 \\ +4 & 5 & 6 \\ +8 & 9 & 10 +\end{array}\right) +\end{math} + + + \begin{Verbatim}[commandchars=\\\{\}] +pi + \end{Verbatim} + + \begin{math} +\newcommand{\Bold}[1]{\mathbf{#1}}\pi +\end{math} + + + In a Jupyter notebook, the results above are displayed using +\href{https://www.mathjax.org/}{MathJax}. + +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 \texttt{latex()} +command. + + \hypertarget{the-latex-command}{% +\section{\texorpdfstring{The \texttt{latex()} +command}{The latex() command}}\label{the-latex-command}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/reference/misc/sage/misc/latex.html}{2}{]} + +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. + +Technically, this is a function that returns a string, so you need to +\texttt{print()} it to see the result. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{5}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n+nb}{print}\PY{p}{(}\PY{n}{latex}\PY{p}{(}\PY{n}{s}\PY{p}{)}\PY{p}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+se}{\PYZbs{}n}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{latex}\PY{p}{(}\PY{n}{M}\PY{p}{)}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +1 + 1 x + \textbackslash{}frac\{1\}\{2\} x\^{}\{2\} + \textbackslash{}frac\{1\}\{6\} x\^{}\{3\} + \textbackslash{}mathcal\{O\}\textbackslash{}left(x\^{}\{4\}\textbackslash{}right) + + +\textbackslash{}left(\textbackslash{}begin\{array\}\{rrr\} +1 \& 2 \& 3 \textbackslash{}\textbackslash{} +4 \& 5 \& 6 \textbackslash{}\textbackslash{} +8 \& 9 \& 10 +\textbackslash{}end\{array\}\textbackslash{}right) + \end{Verbatim} + + 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). + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{15}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{c+c1}{\PYZsh{}latex(plot(x\PYZca{}2)) \PYZsh{} The output is more than 20 pages long} +\end{Verbatim} +\end{tcolorbox} + + It is probably easier to just generate the picture and include that in +your Latex document with \texttt{\textbackslash{}includegraphics}. + + \hypertarget{a-latex-name-for-your-variables}{% +\subsection{A Latex name for your +variables}\label{a-latex-name-for-your-variables}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/var.html}{3}{]} + +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: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{16}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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}{)} + +\PY{n+nb}{print}\PY{p}{(}\PY{n}{phi1}\PY{p}{(}\PY{n}{epsilon}\PY{p}{)}\PY{p}{)} +\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}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +phi1(epsilon) + \end{Verbatim} + + \begin{math} +\newcommand{\Bold}[1]{\mathbf{#1}}e^{{\varepsilon}} + \phi_1\left({\varepsilon}\right) +\end{math} + + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{16}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +e\^{}\{\{\textbackslash{}varepsilon\}\} + \textbackslash{}phi\_1\textbackslash{}left(\{\textbackslash{}varepsilon\}\textbackslash{}right) +\end{Verbatim} +\end{tcolorbox} + + \textbf{Warning:} You need to use two backspaces +\texttt{\textbackslash{}\textbackslash{}}. 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 +\texttt{\textbackslash{}n}. + + \hypertarget{from-jupyter-to-latex}{% +\section{From Jupyter to Latex}\label{from-jupyter-to-latex}} + +\textbf{Reference:} +{[}\href{https://nbconvert.readthedocs.io/en/latest/}{4}{]} + +From the Jupyter menu \texttt{File\ \textgreater{}\ 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. + +If you choose to download the pdf file, you might need to install some +extra packages. For example I had to install +\href{https://pandoc.org/}{\texttt{pandoc}}, \texttt{texlive-XeTeX} and +\texttt{texlive-Xdvi}, but this depends on your operating system and +Latex distribution. + + \hypertarget{sagetex}{% +\section{SageTex}\label{sagetex}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/tutorial/sagetex.html}{5}{]} + +With SageTex it is possible to run Sage commands directly inside Latex, +using the \texttt{\textbackslash{}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. + +You might need to take some extra steps to make this work on your +system, see the link above. + + \hypertarget{the-latex-listings-package}{% +\section{\texorpdfstring{The Latex \texttt{listings} +package}{The Latex listings package}}\label{the-latex-listings-package}} + +\textbf{References:} +{[}\href{https://en.wikibooks.org/wiki/LaTeX/Source_Code_Listings}{6}{]} +and +{[}\href{https://ftp.snt.utwente.nl/pub/software/tex/macros/latex/contrib/listings/listings.pdf}{7}{]} + +If you want to include some code (Sage, Python or anything else) in a +Latex document you can use the listings package. + +\begin{verbatim} +\usepackage{listings} + +... + +\begin{lstlisting}[language=Python] +for i in range(0,100): + if i%5 == 0: + print("Multiple of 5!") +\end{lstlisting} +\end{verbatim} + +You need to specify the language you are using with the +\texttt{language=} option. This option can also be set at the beginning +of the document using the +\texttt{\textbackslash{}lstset\{language=Python\}} command. + +As an alternative, you can include a file directly without copying the +code into the tex file, like you would do for a picture: + +\begin{verbatim} +\lstinputlisting[language=Python]{file.py} +\end{verbatim} + +It is technically possible to include Latex listings in a markdown cell +of the Jupyter notebook using +\href{https://jupyter-contrib-nbextensions.readthedocs.io/en/latest/nbextensions/latex_envs/README.html}{this +package}, but it does not make much sense. So we will move to a Latex +editor for the examples. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{ }{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] + +\end{Verbatim} +\end{tcolorbox} + + + % Add a bibliography block to the postdoc + + + +\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 Binary files /dev/null and b/src/Lecture6/notebook/output_75_0.png 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 Binary files /dev/null and b/src/Lecture6/notebook/output_77_0.png 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 Binary files /dev/null and b/src/Lecture6/notebook/output_80_0.png 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 Binary files /dev/null and b/src/Lecture6/notebook/output_82_0.png 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 Binary files /dev/null and b/src/Lecture6/notebook/output_84_0.png 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 Binary files /dev/null and b/src/Lecture6/notebook/output_86_0.png 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 Binary files /dev/null and b/src/Lecture6/notebook/output_88_0.png differ -- cgit v1.3