{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Jupyter Notebooks - Maths Demos\n", "\n", "This configuration is preconfigured with several packages to support maths related demos.\n", "\n", "As well as typsetting mathematical equations, several packages exist that support the creation of print quality mathematical diagrams." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "Some of the cells in this notebook have been annotated with slideshow settings:\n", "\n", "- to run the the slideshow, first render all the cells: from the *Cell Menu*, select *Run All*;\n", "- click the *Enter/Exit RISE slideshow* button from the notebook toolbar;\n", "- exit the presentation viwe by clicking the *X* in the top left hand corner of the presentation view;\n", "- to see the slideshow cell settings, select *View > Cell Toolbar > Slideshow*. Reset the notebook view with *View > Cell Toolbar > None*." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "This notebook may also include hidden code cells. To display a hidden code cell, select in and then click on the *Toggle selected cell input display* toolbar button, or toggle all the code cell inputs.\n", "\n", "To render all the generated content, from the *Cell* menu, select *Run All*." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Rendering equations Using MathJax\n", "\n", "Equations can be rendered as a block using MathJax in a markdown cell.\n", "\n", "\\begin{align}\n", "\\sqrt{3x-1}+(1+x^2)\n", "\\end{align}\n", "\n", "See this third party [Typesetting Equations](https://nbviewer.jupyter.org/github/ipython/ipython/blob/4.0.x/examples/Notebook/Typesetting%20Equations.ipynb) demonstration notebook for further examples." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "MathJax content can also be rendered inline. For example, we can include the expression $\\sqrt{3x-1}+(1+x^2)$ embedded *within* a line of text." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Equation Numbering\n", "\n", "Enabling the `equation_numbering` notebook extension will automatically number equations Mathjax.\n", "\n", "\\begin{align}\n", "\\dot{x} & = \\sigma(y-x) \\\\\n", "\\dot{y} & = \\rho x - y - xz \\\\\n", "\\dot{z} & = -\\beta z + xy\n", "\\end{align}\n", "\n", "A toolbar button allows equation numbering to be reflowed if an equation is added, moved or removed without the need to save and reload the notebook." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Simple Plotting" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "hide_input": true, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "#Import some required packages\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "from IPython.display import Image" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "hide_input": false, "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "text/plain": [ "array([ 0. , 0.02, 0.04, 0.06, 0.08, 0.1 , 0.12, 0.14, 0.16,\n", " 0.18, 0.2 , 0.22, 0.24, 0.26, 0.28, 0.3 , 0.32, 0.34,\n", " 0.36, 0.38, 0.4 , 0.42, 0.44, 0.46, 0.48, 0.5 , 0.52,\n", " 0.54, 0.56, 0.58, 0.6 , 0.62, 0.64, 0.66, 0.68, 0.7 ,\n", " 0.72, 0.74, 0.76, 0.78, 0.8 , 0.82, 0.84, 0.86, 0.88,\n", " 0.9 , 0.92, 0.94, 0.96, 0.98])" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Define a variable\n", "frequency=1\n", "\n", "#Define a list of numbers\n", "# in the range 0..1 with step size 0.2\n", "timestamps=np.arange(0.0,1.0,0.02)\n", "\n", "timestamps" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "As well as printing a chart, we can interrogate the chart object to start to produce a written description of it. \n", "\n", "A hidden code cell below contains the code for pulling out the textual description of the chart." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "hide_input": true, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "import re\n", "\n", "#http://nbviewer.jupyter.org/gist/BenRussert/7fbd3f86baeda70f1d3f8bdf219b8627\n", "def get_plot_info(p):\n", " \"\"\" in this example p are the Axes objects pd.DataFrame.plot() returns \"\"\"\n", " txts = p.legend_.get_texts() if p.legend_ is not None else []\n", " plot_info = {\n", " \"title\" : p.get_title(),\n", " \"legendlabels\": [x.get_text() for x in txts],\n", " \"x_label\": re.sub(' label$', '',p.xaxis.get_label_text()),\n", " \"x_ticks\": [x.get_text() for x in p.xaxis.get_majorticklabels()],\n", " \"y_label\": re.sub(' label$', '',p.yaxis.get_label_text()),\n", " \"y_ticks\": [x.get_text() for x in p.yaxis.get_majorticklabels()]\n", " }\n", " \n", " desc = '''\n", "This chart, titled \"{title}\", is labeled \"{x_label}\" on the x-axis and \"{y_label}\"\n", "on the y-axis.'''.format(**plot_info)\n", " \n", " return desc, plot_info" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "hide_input": true, "slideshow": { "slide_type": "skip" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "This chart, titled \"My Plot\", is labeled \"My x-axis\" on the x-axis and \"My y-axis\"\n", "on the y-axis.\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZQAAAEWCAYAAABBvWFzAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3Xd4VGX6//H3nYTeQ0IPkEDoIGAo\nymKhCDZw1UVwVazouir28lNXV3ddy7o23BXWhuKCXVFRREBQBCX0TkKooQcISELq/ftjTvzGmDLA\nzJwp9+u65sqcMnM+x5I7z3nOeR5RVYwxxpiTFeV2AGOMMeHBCooxxhifsIJijDHGJ6ygGGOM8Qkr\nKMYYY3zCCooxxhifsIJiTJATkUdFZIrbOYypihUUY46TiGwRkXwRiSuzfpmIqIi0PYHvfNP5zp9F\n5ICIzBKRTieYbcjxfs4YX7CCYsyJ2QyMKVkQke5A7ZP8zqdVtS7QCtgLvHmS32dMQFlBMebEvA1c\nVWp5LPBWyYKI9BGRPSISXWrdxSKyoqovVtUc4H9At/K2i8gIEVkjIodE5FsR6eysfxtoDXzmtHTu\nPaEzM+YEWUEx5sQsAuqLSGenaIwGfunnUNXFQBZwTqnPXEmpolMREakL/BFYVs62DsBU4HYgHpiB\np4BUV9UrgW3AhapaV1WfPtGTM+ZEWEEx5sSVtFKGAuuAzDLbJwNXAIhILDAMT8ujIneLyCEgHagL\nXF3OPpcBX6jqLFUtAP4J1AJOP/HTMMY3YtwOYEwIexuYDyRSfstjCrBOROoAo4DvVHVXJd/3T1V9\nqIpjtgC2liyoarGIbAdaHldyY/zAWijGnCBV3Yqnc/484KNytmcCC4GL8VzuetsHh90JtClZEBEB\nEvi/1pENH25cYwXFmJNzHTBIVY9WsP0t4F6gO+UUnRPwHnC+iAwWkWrAXUAe8IOzfQ+Q5IPjGHPc\nrKAYcxJUdZOqplayy8d4WhQfO3dvnezxNuDpl3kJ2A9ciKcTPt/Z5R/AQ84dYHef7PGMOR5iE2wZ\n418isgm4UVW/cTuLMf5kLRRj/EhELsHTrzHH7SzG+Jvd5WWMn4jIt0AX4EpVLXY5jjF+Z5e8jDHG\n+IRd8jLGGOMTEXXJKy4uTtu2bet2DGOMCSlLlizZr6rxVe0XUQWlbdu2pKZWdoenMcaYskRka9V7\n2SUvY4wxPmIFxRhjjE9YQTHGGOMTVlCMMcb4hBUUY4wxPuFqQRGR10Vkr4isrmC7iMiLIpIuIitF\npHepbWNFJM15jQ1camOMMeVxu4XyJjC8ku3nAsnOaxzwH/hl9rtHgH5AX+AREWnk16TGGGMq5epz\nKKo6X0TaVrLLSOAt9YwPs0hEGopIc+AsYJaqHgAQkVl4CtNU/yY2FcnNL2LptoMs23aQ/MLyh61K\niq9L/6TGNGtQM8DpjDGBEOwPNrYEtpda3uGsq2j9b4jIODytG1q3bu2flBHoWEERS7ceZFFGFgsz\nsli+/RAFRZ5x4UR+u3/pIeMS4+rQPymW/kmN6Z/UmKb1rcAYEw6CvaCcNFWdBEwCSElJsZEwT9L2\nAzm8PDedj5Zlkl9YTJRA95YNuHZAIv3bNSalTSPq1az2m88VFSvrdh1mUUYWizKy+HzlLqb+5Pmb\noGdCQ24b3J6zOzZByqtGxpiQEOwFJRPPfNklWjnrMvFc9iq9/tuApYpA27I8heTDpTuIEuHSlFYM\n6dyEPm1jyy0gZUVHCd1aNqBbywZcPzCJomJl7c7DLNi0nymLtnLtm6n0aNWA8YOTGdTJCosxocj1\n4eudPpTPVbVbOdvOB24BzsPTAf+iqvZ1OuWXACV3fS0FTi3pU6lISkqK2lhex2dbVg4T5qbx4dJM\noqOEy/u25qYz2/m0H6SgqJiPlu5gwtx0th/IpXtLT2EZ3NkKizHBQESWqGpKVfu52kIRkal4Whpx\nIrIDz51b1QBU9RVgBp5ikg7kANc42w6IyOPAYuerHquqmJjjk19YzDMz1/P6gi1ERwlX9m/Dn85q\n55f+jmrRUVzWpzUX927Fx0szmTA3nevfSqVnQkOeu6wniXF1fH5MY4zvud5CCSRroXhna9ZRbp26\njJU7shnTN4Hbh3QIaMd5QVExHy/N5Ikv11FQWMwTF3dnZM9y77kwxgRASLRQTPCZvmIn/++jVUQJ\nvHLFqQzv1izgGapFRzGqTwK/S45j/LRljJ+2nAXp+3l0RFdqV7f/ZI0JVm4/2GiCRG5+Efd/uJLb\npi6jY7N6zBg/0JViUlqLhrWYekN/bh3UnveX7GDEhAWs333Y1UzGmIpZQTFs3HOEERO+593U7dx8\nVjumjetPq0a13Y4FQEx0FHed05Ep1/UjO7eAkRMWMGXRViLpUq0xocIKSoRbsvUAl/z7Bw7mFPDW\ntX25d3gnqkUH338WA9rH8eX4gfRLasxDn6zmya/WW1ExJsgE328OEzALN2Vx5Ws/0bhudabfMoCB\nyVVOGe2quLo1ePPqPlzRvzUT52Xw18/WUlxsRcWYYGE9nBFq3sZ9jHsrldaxtXnn+n40CZHhT6Ki\nhMdHdqNGTDSvfb+ZvMIi/n5Rd6Ki7HkVY9xmBSUCzVq7hz+/s5T2Tery9nV9aVy3htuRjouI8ND5\nnalVLZoJc9PJKyjm6Ut7EBOEl+qMiSRWUCLMFyt3MX7aMrq2bMBb1/SlQe2qh00JRiLC3cM6UiMm\nimdnbSSvsJjnR/cMyv4fYyKFFZQI8tHSHdz9/gpObdOI16/u49UYXMHu1sHJ1KwWzd9nrCOvsIiX\n/9ibGjHRbscyJiLZn3MRYs76Pdz9/gr6JzVm8rV9w6KYlLjhjCQeH9mVb9bt5Z73V9rdX8a4xFoo\nEWDtzsPc+r9ldGlRn1fHpoTl0+ZXntaWw8cKeWbmBhLj6nDH0A5uRzIm4oTfbxbzK3sPH+O6yYup\nV7Mar43tE5bFpMTNZ7Vj8/6jvDA7jcS4OlzUy8b/MiaQ7JJXGMvNL+L6t1LJzi3gtatTwn5mRBHh\nid93p19iLPd+sJLFW2wAamMCyQpKmCouVu54dzmrMrN5cXQvurZo4HakgKgeE8XEK0+lZaNa3Pj2\nErZmHXU7kjERwwpKmHp65ga+WrObh87vwpAuTd2OE1ANa1fn9av7UKzKtW8uJjunwO1IxkQEKyhh\n6N3F23hl3ib+2K811w5o63YcVyTG1eGVK05l24Ec/vTOEgqKit2OZEzYc7WgiMhwEdkgIukicn85\n258TkeXOa6OIHCq1rajUtumBTR68lmw9wIMfr2ZgchyPjuga0VPo9k9qzD8u7sEPm7J4/PO1bscx\nJuy5dsuPiEQDLwNDgR3AYhGZrqq//J+vqneU2v9WoFepr8hV1Z6ByhsKsnMLuG3qcpo3rMmEy3vb\nU+PApae2Yt2uw7z2/WYGtI9jWFd353gxJpy5+RunL5Cuqhmqmg9MA0ZWsv8YYGpAkoUgVeWBj1ay\n5/AxXhrTmwa1wufBxZN13/BOdG/ZgHs/WMnOQ7luxzEmbLlZUFoC20st73DW/YaItAESgTmlVtcU\nkVQRWSQiF1V0EBEZ5+yXum/fPl/kDkpTf9rOjFW7uXtYR3omNHQ7TlCpHhPFi2N6UVhUzO3TllNo\n/SnG+EWoXBMZDXygqkWl1rVR1RTgcuB5EWlX3gdVdZKqpqhqSnx8cM/3caI27jnCXz9bw8DkOMYN\nTHI7TlBKjKvD4xd146ctB5gwN93tOMaEJTcLSiaQUGq5lbOuPKMpc7lLVTOdnxnAt/y6fyViHCso\n4tb/LaNezRieHXWKzQtSiYt7t+LiXi15cXYaP2ZkuR3HmLDjZkFZDCSLSKKIVMdTNH5zt5aIdAIa\nAQtLrWskIjWc93HAACAib+P52xdr2bDnCM+O6kmTeuH9JLwvPHZRN1rH1ub2d5dz8Gi+23GMCSuu\nFRRVLQRuAWYC64D3VHWNiDwmIiNK7ToamKa/HkK2M5AqIiuAucCTpe8OixRfrd7NlEXbGHdGEmd2\nCM/Leb5Wt0YML43pzf6f87jvQxuZ2Bhfkkj6HyolJUVTU1PdjuETOw/lcu4L39GmcW0+uOl0qseE\nSndYcHj1uwz+9sU6Hh/ZlStPa+t2HGOCmogscfqsK2W/hUKQqnL/R6soKCrmxdG9rJicgGsHJHJm\nh3j+PmMd27Jy3I5jTFiw30Qh6KOlmczfuI/7z+1E27g6bscJSVFRwpOXdKdaVBT3f2SXvozxBSso\nIWbfkTwe+3wtKW0acUW/Nm7HCWnNG9TigfM688OmLN5L3V71B4wxlbKCEmIenb6G3IIinrq0h90i\n7AOj+yTQPymWv32xjj2Hj7kdx5iQZgUlhHy1ejdfrNrF+MHJtIuv63acsBAVJTx5cQ/yC4t56JPV\ndunLmJNgBSVEZOcU8PCnq+nSvD7jzrCn4X2pbVwd7jqnA7PW7mHGqt1uxzEmZFlBCRFPzFjHgaP5\nPH1pDxtF2A+uHZBIj1YNeGT6anvg0ZgTZL+ZQsCC9P28m7qdcWck0a1lZEzlG2gx0VE8dUkPDuUU\n8PgXEfeMrDE+YQUlyOXkF3L/RytJjKvD+MHJbscJa52b1+dPZ7Xjo6WZfLthr9txjAk5VlCC3HOz\nNrL9QC5PXtydmtWi3Y4T9m4Z1J528XV48OPV5OQXuh3HmJBiBSWIpe05whsLtjCmbwL9khq7HSci\n1IiJ5slLepB5KJd/z93kdhxjQooVlCClqjz62Rrq1IjhnmGd3I4TUfq0jeX3vVoyaX4GW/YfdTuO\nMSHDCkqQ+nL1bhakZ3H3OR2IrVPd7TgR54FzO1EtWnj8c+ugN8ZbVlCCUG5+EX/7fC2dm9fnchte\nxRVN6tdk/JBkZq/fy5z1e9yOY0xIsIIShP79bTo7s4/x2MiuRNvwKq65+vREkuLr8Nhna8krLKr6\nA8ZEOFcLiogMF5ENIpIuIveXs/1qEdknIsud1/Wlto0VkTTnNTawyf1na9ZRJs7P4KKeLejTNtbt\nOBGtekwUj17YlS1ZObz63Wa34xgT9FwrKCISDbwMnAt0AcaISJdydn1XVXs6r1edz8YCjwD9gL7A\nIyLSKEDR/erxz9dSLUp44LzObkcxwBkd4hnWtSkT5qSz81Cu23GMCWputlD6AumqmqGq+cA0YKSX\nnx0GzFLVA6p6EJgFDPdTzoCZu34v36zby22Dk2la3+aHDxYPnd+FYlWemLHO7SjGBDU3C0pLoPQk\nFDucdWVdIiIrReQDEUk4zs+GjLzCIv762RqS4utwzYBEt+OYUhJia/Ons9rx+cpd/LBpv9txjAla\nwd4p/xnQVlV74GmFTD7eLxCRcSKSKiKp+/bt83lAX3nt+81sycrh0Qu72pS+QeimM9vRqlEt/jp9\nLQVFxW7HMSYoufmbKxNIKLXcyln3C1XNUtU8Z/FV4FRvP1vqOyapaoqqpsTHx/skuK/tPXKMCXPS\nOadLU87oEJwZI13NatE8dH4XNuw5wrSftrkdx5ig5GZBWQwki0iiiFQHRgPTS+8gIs1LLY4ASi5i\nzwTOEZFGTmf8Oc66kPT8N2nkFxZbR3yQG9a1KX0TY3n+mzSOHCtwO44xQce1gqKqhcAteArBOuA9\nVV0jIo+JyAhnt9tEZI2IrABuA652PnsAeBxPUVoMPOasCzlpe47w7uLtXNG/DYlxddyOYyohIjx4\nXmeyjuYzcV6G23GMCToSSVOepqSkaGpqqtsxfuW6Nxfz0+YDzLv3bBtiJUTcNnUZX6/dzdy7z6J5\ng1puxzHG70RkiaqmVLWf9f66aOGmLGav38vNZ7e3YhJC7hnWkeJiePbrjW5HMSaoWEFxSXGx57mG\nFg1qcs2Atm7HMcchIbY2Y09vw4dLd7B252G34xgTNKyguGT6ip2syszm7mEdbeKsEHTL2cnUr1mN\nf3xpDzsaU8IKiguOFRTxzMwNdG1Rn4t6hvTzmBGrQe1q3DqoPd+l7WfexuB9vsmYQLKC4oLJP2wh\n81AuD57XmSgbTThkXXlaGxJia/GPGesoKo6cm1uMqYgVlAA7eDSfCXPTObtjPKe3j3M7jjkJNWKi\nuW94J9bvPsKHS3e4HccY11lBCbAX56RxNK/QHmIME+d3b07PhIY8+/UGcvNtzhQT2aygBNC2rBym\nLNrKqJQEOjSt53Yc4wMiwoPnd2bP4TxeX2BzppjIZgUlgJ7/ZiNRItw+pIPbUYwP9Wkby5DOTXhl\n3iayc2xIFhO5YiraICKfARX2NKrqiIq2md/auOcIHy/PZNzAJJo1sLlOws1d53TkvBe/45X5m7hv\neCe34xjjigoLCvDPgKWIAP+cuYG61WO46cx2bkcxftC5eX1GnNKCNxZs5poBbWlSz/5oMJGnwkte\nqjqv5AX8BOwus854afn2Q3y9dg83nJFEIxtiJWzdMaQDhUXKhDnpbkcxxhVV9qGIyIXAcuArZ7mn\niEyv/FOmtGdmrie2TnWu/Z3NxBjO2sbVYVSfBKb+tI3tB3LcjmNMwHnTKf8onvnfDwGo6nLAfjN6\naUH6fhakZ3HzWe2oW6OyK4wmHNw2KJkoEZ7/Js3tKMYEnDcFpUBVs8uss8eCvaCqPDNzA80b1OSK\n/m3cjmMCoFmDmow9vS0fL9tB2p4jbscxJqC8KShrRORyIFpEkkXkJeAHP+cKC7PW7mH59kOMH5xs\nA0BGkJvObEft6jE2vL2JON4UlFuBrkAeMBU4DNzui4OLyHAR2SAi6SJyfznb7xSRtSKyUkRmi0ib\nUtuKRGS58wq6Pp2iYuXZrzeSGFeHS09t5XYcE0Cxdapzw8AkvlqzmxXbD7kdx5iAqbKgqGqOqj4I\nDAbOVtUHVfXYyR5YRKKBl4FzgS7AGBHpUma3ZUCKqvYAPgCeLrUtV1V7Oq+geybmsxU72bDnCHcO\n7UBMtD0/GmmuG5hIbJ3q/PPrDW5HMSZgvLnLq4+IrAJWAqtEZIWInOqDY/cF0lU1Q1XzgWnAyNI7\nqOpcVS25XWYREBJ/6ucXFvOvWRvp0rw+53dv7nYc44K6NWK4+ax2fJe2nx827Xc7jjEB4c2fzq8B\nN6tqW1VtC/wZeMMHx24JbC+1vMNZV5HrgC9LLdcUkVQRWSQiF1X0IREZ5+yXum9fYOat+GDJDrYd\nyOGeYR1tePoIdkX/NjRvUJN/ztyAqt3HYsKfNwWlSFW/K1lQ1e+BQv9F+i0RuQJIAZ4ptbqNqqYA\nlwPPi0i5j6Cr6iRVTVHVlPj4eL9nzSssYsKcNHq3bshZHf1/PBO8alaL5pZB7Vm67ZBNwmUiQoUF\nRUR6i0hvYJ6ITBSRs0TkTBH5N/CtD46dCSSUWm7lrCubYwjwIDBCVfNK1qtqpvMzw8nTyweZTtq7\ni7ezM/sYdw7tiIi1TiLdH05NoGXDWjw3a6O1UkzYq+xJu2fLLD9S6r0v/s9YDCSLSCKeQjIaT2vj\nFyLSC5gIDFfVvaXWNwJyVDVPROKAAfy6w94VxwqKeHluOn3bxjKgfWO345ggUD0mitsGt+e+D1cx\nZ/1eBndu6nYkY/ymwoKiqmf788CqWigitwAzgWjgdVVdIyKPAamqOh3PJa66wPvOX/vbnDu6OgMT\nRaQYTyvrSVVd68+83vjfj9vYcziP5y/rZa0T84uLe7fi5bmb+NesjQzq1MT+2zBhy6uxQETkfDzP\novwyhKqqPnayB1fVGcCMMuv+Uur9kAo+9wPQ/WSP70u5+UX8+9tNnN6uMae1s9aJ+T/VoqMYPziZ\nu95fwddr9zCsazO3IxnjF97cNvwKcBmeBxwF+ANg44iUMWXRVvb/nMcdQ23yLPNbI3u2ICmuDs/N\n2khxsfWlmPDkzV1ep6vqVcBBVf0rcBpgvzVLOZpXyH/mbWJgchx92sa6HccEoZjoKMYPSWb97iN8\nuXq323GM8QtvCkqu8zNHRFoABYA9rVfK5IVbOHA031onplIX9GhB+yZ1ef6bjRRZK8WEIW8Kyuci\n0hBPB/lSYAueMb0McORYAZPmZ3B2x3h6t27kdhwTxKKjhNuHJJO292c+X7nT7TjG+Jw3Y3k9rqqH\nVPVDPH0nnVT1Yf9HCw1vLtjCoZwCa50Yr5zXrTmdmtXjhW/SKCwqdjuOMT5V4V1eInJxJdtQ1Y/8\nEyl0ZOcW8N/vMhjapSk9WjV0O44JAVFRwu1DOnDTlCVMX7GTi3uHxPB0xnilstuGL6xkmwIRX1Be\n/34zh48VcvuQZLejmBAyrGtTuraozwuz0xhxSgsbjdqEjcoebLwmkEFCTXZuAa8v2Oz8cmjgdhwT\nQkQ8rZQb3krlk+U7bb4cEzbsT6MT9Nr3mzlyrJDxg63vxBy/IZ2b0LVFfV6aY30pJnxYQTkB2TkF\nvPH9ZoZ3bUaXFvXdjmNCUEkrZWtWDp8stzu+THiwgnICXluwmSN5hdw22PpOzImzVooJN94MvfIH\nEannvH9IRD5yhrWPSNY6Mb5irRQTbrxpoTysqkdE5HfAEDwzOP7Hv7GCV0nrZLzd2WV8YEjnJnRr\naa0UEx68mrHR+Xk+MElVvwCq+y9S8CppnZzbrRmdm1vrxJw8EeH2wZ5WysfLfjO/nDEhxZuCkiki\nE/GMODxDRGp4+bmw89r3GdZ3YnxusNNKmTA33VopJqR5UxhG4ZkEa5iqHgJigXv8mioIHcrJ540F\nW6x1YnzOWikmXFQ2p3zJb82aeOZszxKRWCAPSPXFwUVkuIhsEJF0Ebm/nO01RORdZ/uPItK21LYH\nnPUbRGSYL/JU5vXv7c4u4z/WSjHhoLIWyv+cn0vwFJAlpV4nXVBEJBp4GTgX6AKMEZEuZXa7Ds88\nLO2B54CnnM92wTMHfVdgOPBv5/v8wlonxt+slWLCQYUFRVUvcH4mqmqS87PkleSDY/cF0lU1Q1Xz\ngWnAyDL7jAQmO+8/AAaLZ0LukcA0Vc1T1c1AuvN9fmGtExMIg3+54yudAmulmBDkzXMo15VZjhaR\nR3xw7JbA9lLLO5x15e6jqoVANtDYy8+W5B0nIqkikrpv374TCpp1NJ/zuze31onxq5JWyrYDOXxi\nrRQTgrzplB8sIjNEpLmIdAMWAfX8nMtnVHWSqqaoakp8fPwJfcfff9+dF8f08nEyY35rcOcmdG/Z\nwPpSTEjyZoKty/FcdloFfAHcrqp3++DYmUBCqeVWzrpy9xGRGKABkOXlZ30qOkr8+fXGACVPzyez\nNSuHj6yVYkKMN5e8koHxwIfAVuBKEantg2MvBpJFJFFEquPpZJ9eZp/pwFjn/aXAHFVVZ/1o5y6w\nRCAZ+MkHmYxx3aBOTivF+lJMiPHmktdneIZfuRE4E0jDUwxOitMncgueZ1zWAe+p6hoReUxERji7\nvQY0FpF04E7gfueza4D3gLXAV8CfVbWo7DGMCUUlrZRtB+yOLxNaxPMHfyU7iNRX1cNl1nVQ1Y1+\nTeYHKSkpmprqk0dojPErVWXEhAVk5xYw+64zqWazOhoXicgSVU2paj9v+lAOi0g3ERklIleJyFVA\nf5+kNMaUy1opJhR504fyCPCS8zobeBoYUemHjDEnzfpSTKjxph19KTAY2O3MM38KnrutjDF+ZK0U\nE2q8KSi5qloMFDrje+3l17fsGmP8pKSV8tKcNGulmKDnTUFJFZGGwH/xjOO1FFjo11TGGOD/Winb\nD+Ty8VJrpZjg5k2n/M2qekhVXwGGAmOdS1/GmAD4pZUy11op5vgdKyhi9ro9VHVHry8c772IV6vq\nSr8kMcaUq3Qr5cMlO9yOY0LMlEVbuW5yKit2ZPv9WMdbUOzuLmNcMKhTE05p1YCX5qSTX2itFOOd\nnPxCXpm3iQHtG9MzoaHfj3e8BcUGtDLGBSLCHUM7kHkol/eXbK/6A8YAby/cyv6f87lzaIeAHM+b\n51Aal1o81Y9ZjDGVOLNDPL1bN2TCnHSOFdhIQ6ZyP+d5Widndojn1DaxATmmNy2URSLyvoicB/i/\nV8cYUy4R4c6hHdmVfYx3F1srxVRu8g9bOJhTwB0Bap2AdwWlAzAJuBJIE5EnRCRwCY0xvxjQvjF9\nE2N5ea61UkzFDh8rYNL8DAZ3ahKQvpMS3tw2rKo6S1XHADfgGU7+JxGZJyKn+T2hMeYXnlZKB/Ye\nyeOdH7e5HccEqTe+30J2bmBbJ+BlH4qIjBeRVOBu4FYgDrgL+J+f8xljyuif1JjT2zXmP9+mk5Nf\n6HYcE2Sycwp49fsMzunSlG4tAztKljeXvBYC9YGLVPV8Vf1IVQtVNRV4xb/xjDHluWNoB/b/nM/b\nC7e6HcUEmVe/z+DIsUJuHxL4nglvCkpHVX1cVX/zRJWqPuWHTMaYKvRpG8vA5DhembeJn/OslWI8\nDh7N5/XvN3Ne92Z0aVE/4Mf3qg/F1wcVkVgRmSUiac7PRuXs01NEForIGhFZKSKXldr2pohsFpHl\nzqunrzMaE+zuHNqBgzkFTP5hi9tRTJCY9F0GOQVFrrRO4PgfbPSV+4HZqpoMzHaWy8oBrlLVrsBw\n4HlnkMoS96hqT+e13P+RjQkuvVo3YlCnJkyan8GRYwVuxzEu2/9zHpN/2MKFPVrQoWk9VzIc74ON\nvjISmOy8nwxcVHYHVd2oqmnO+514hs2P90MWY0LWHUM6kJ1bwGvfb3Y7inHZxHmbOFZQxG2Dk13L\ncFwPNoqIr4Zeaaqqu5z3u4Gmle0sIn2B6sCmUqv/7lwKe05EalTy2XEikioiqfv27Tvp4MYEk+6t\nGjCsa1Ne/W4zB4/mux3HuGRXdi6TF27lol4tad+krms5/PZgo4h8IyKry3mNLL2f00dTYT+NiDQH\n3gaucSb6AngA6AT0AWKB+yr6vKpOUtUUVU2Jj7cGjgk/d53TkaP5hfxn3qaqdzZh6cXZ6agqd7jU\nd1LCbw82quoQVe1WzutTYI9TKEoKxt7yvsOZIfIL4EFVXVTqu3c5ufKAN4C+x3HOxoSVDk3r8fte\nLZn8wxZ2Zx9zO44JsC37j/Je6nYu79uahNjarmZx68HG6XgKE87PT8s5bnXgY+AtVf2gzLaSYiR4\n+l9Wn2AOY8LCHUM6UKzKi3PS3I5iAuxfszZSPTqKPw9q73YU1x5sfBIYKiJpwBBnGRFJEZFXnX1G\nAWcAV5dze/A7IrIKWIWnuP3JNH2oAAAX/UlEQVTtBHMYExYSYmszpm9r3lu8nS37j7odxwTI2p2H\nmb5iJ9cMaEuTejXdjoNU9ZiJiIg/nkVxQ0pKiqamprodwxi/2Hv4GGc8M5fhXZvx/OhebscxAXD9\n5MX8uPkA3987iAa1q/ntOCKyRFVTqtovppIvmF7q/W+2q6rN3mhMEGlSvyZXn57IxPmbuOmsdnRq\nFvgnpU3gLNl6gG/W7eWeYR39WkyOR4UFBTgN2A5MBX7EZms0JujddGYS7/y4lX/O3MirY6v8g9KE\nKFXl6a82EFe3OtcMaOt2nF9U1ofSDPh/QDfgBWAosF9V56nqvECEM8Ycn4a1q3PjGUl8s24PS7Ye\ndDuO8ZPv0vbz4+YD3HJ2e2pXr6xdEFgVFhRVLVLVr1R1LNAfSAe+FZFbApbOGHPcrhmQSFzd6jwz\ncz1h0v1pSlFVnpm5gZYNazGmX2u34/xKpXd5iUgNEbkYmAL8GXgRz628xpggVadGDH8+uz2LMg6w\nID3L7TjGx2au2c2qzGxuH5JMjZhot+P8SoUFRUTewnPLcG/gr6raxxnGPjNg6YwxJ+Tyfq1p2bAW\nT321nuJia6WEi8KiYp6ZuYF28XW4uHcrt+P8RmUtlCuAZGA88IOIHHZeR0TkcGDiGWNORI2YaO46\npwOrMrP5bOVOt+MYH5m2eDub9h3lvuGdiI4KvvukKutDiVLVes6rfqlXPVW1+xGNCXIX9WxJ1xb1\nefqrDRwrKHI7jjlJP+cV8vw3G+mbGMvQLpWOp+sat+ZDMcb4WVSU8OB5nck8lGuTcIWBifM2sf/n\nfB48r3O5zwYGAysoxoSx09vHcXbHeCbMTbfh7UPY7uxj/Pe7DC48pQWnJDSs+gMusYJiTJh74LzO\nHM0rtIEjQ9izX2+guBjuHdbR7SiVsoJiTJjr0LQel/VJYMqirWzNsoEjQ826XYf5YOkOxp7exvXh\n6atiBcWYCHDHkA5Ui47i6a82uB3FHKd/fLme+jWrccvZ7k3t6y0rKMZEgCb1azLujCS+WLXLhmQJ\nIfM37mP+xn3cOqh90AwAWRkrKMZEiBsGJhFfrwZPzFhnQ7KEgKJi5YkZ60iIrcWVp7VxO45XXCko\nIhIrIrNEJM352aiC/YpKTa5Vejj9RBH5UUTSReRdZ3ZHY0wl6tSI4a6hHViy9SAz1+x2O46pwkdL\nd7B+9xHuG94p6IZYqYhbLZT7gdmqmgzMdpbLk6uqPZ1X6flXngKeU9X2wEHgOv/GNSY8/CElgQ5N\n6/Lkl+vJK7SHHYPV0bxCnv16Iz0TGnJ+9+Zux/GaWwVlJDDZeT8Zz7zwXnHmkR8ElMwzf1yfNyaS\nRUcJD53fhS1ZObz2/Wa345gKvDw3nd2Hj/HwBcH7EGN53CooTVV1l/N+N1DROAI1RSRVRBaJSEnR\naAwcUtVCZ3kH0NKPWY0JK2d0iOecLk2ZMCedXdm5bscxZWzef5RXv9vMxb1bcmqbWLfjHBe/FRQR\n+UZEVpfzGll6P2e++op6CNs48xhfDjwvIu1OIMc4pyil7tu37/hPxJgw9PAFXZxO3/VuRzFlPPbZ\nGqrHRHH/uZ3cjnLc/FZQVHWIqnYr5/UpsEdEmgM4P/dW8B2Zzs8M4FugF5AFNBSRkmnKWgEVDqmv\nqpNUNUVVU+Lj4312fsaEsoTY2tx0Zjs+W7GTRRk2Z0qwmL1uD3M37OP2Ick0qVfT7TjHza1LXtOB\nsc77scCnZXcQkUYiUsN5HwcMANY6LZq5wKWVfd4YU7k/ndWOlg1r8ej0NRQWFbsdJ+IdKyjir5+t\npX2Tuow9va3bcU6IWwXlSWCoiKQBQ5xlRCRFRF519ukMpIrICjwF5ElVXetsuw+4U0TS8fSpvBbQ\n9MaEgZrVonn4gi6s332EKYu2uh0n4r36XQbbDuTw6IVdqRYdmo8IujK7vapmAYPLWZ8KXO+8/wHo\nXsHnM4C+/sxoTCQY1rUpA5PjeHbWRi44pQVxdWu4HSkiZR7KZcLcdM7t1ozfJce5HeeEhWYZNMb4\nhIjwyIVdyc0v4hkb58s1T3yxDoAHz+/scpKTYwXFmAjXvkldrv1dIu+mbmf59kNux4k4C9L388Wq\nXdx8VntaNQru0YSrYgXFGMOtg9oTX68Gj3y6muJiG+crUAqKinl0+hoSYmsx7owkt+OcNCsoxhjq\n1azG/zuvEyt2ZDPlR+ugD5RJ8zNI2/szf7mgKzWrhcZ4XZWxgmKMAeCini0ZmBzHU1+uZ8fBHLfj\nhL30vT/zwuw0zuvejKFdKhosJLRYQTHGAJ4O+id+3x0FHvx4tQ1x70fFxcr9H66kVrVoHh3R1e04\nPmMFxRjzi4TY2tw7rCPzNu7j42UVDkBhTtKUH7eSuvUgD1/QJSSfiK+IFRRjzK9ceVpbTm3TiMc+\nX8u+I3luxwk7Ow7m8NSX6xmYHMclvcNrXFsrKMaYX4mOEp66pDs5eUU8+tkat+OEFVX1XE4Envh9\n95Aamt4bVlCMMb/Rvkk9bh3Uni9W7rLZHX3o42WZzNu4j3uGdSQhNrSfOSmPFRRjTLluPLMdnZrV\n4+FPVpOdW+B2nJC370gej32+lt6tG3LVaW3djuMXVlCMMeWqHhPF05f2YP/Pefxjxjq344S8Rz9b\nQ05eEU9d0oPoqPC61FXCCooxpkI9WjXkhoFJTFu8nfkbbYK6E/XV6l18sXIXtw5qT3LTem7H8Rsr\nKMaYSt0xtAPtm9TlrvdXsP9nu+vreGUeyuW+D1fRvWUDbjzzuCedDSlWUIwxlapZLZoJl/ciO7eA\nu95bYWN9HYfComJun7aMwqJiXhrTi+ox4f0rN7zPzhjjE52a1efh8zszb+M+Xl+w2e04IeOlOeks\n3nKQv/2+G23j6rgdx+9cKSgiEisis0QkzfnZqJx9zhaR5aVex0TkImfbmyKyudS2noE/C2MiyxX9\n23BOl6Y89dV6Vu3IdjtO0FuUkcVLc9K4uFdLft+rldtxAsKtFsr9wGxVTQZmO8u/oqpzVbWnqvYE\nBgE5wNeldrmnZLuqLg9IamMimIjw9KU9iKtbg1unLuXnvEK3IwWtg0fzuX3aclrH1uaxi7q5HSdg\n3CooI4HJzvvJwEVV7H8p8KWq2hCoxrioYe3qvDC6F9sO5PDwJ6vdjhOUVJV7PlhJ1tE8XhrTm7o1\nXJlp3RVuFZSmqrrLeb8bqGrs5tHA1DLr/i4iK0XkORGpcCJsERknIqkikrpvn932aMzJ6psYy22D\nk/l4WSYfLd3hdpyg8/airXyzbg/3De9E91YN3I4TUH4rKCLyjYisLuc1svR+6hkju8LbRkSkOdAd\nmFlq9QNAJ6APEAvcV9HnVXWSqqaoakp8fPzJnJIxxnHroGT6Jsby0Cerydj3s9txgsa6XYf52xfr\nOLtjPNf9LtHtOAHnt4KiqkNUtVs5r0+BPU6hKCkYeyv5qlHAx6r6y9gPqrpLPfKAN4C+/joPY8xv\nRUcJz1/Wk+oxUYx7e4kNzQJk/ZzHuLdTaVCrGs/84ZSwG/jRG25d8poOjHXejwU+rWTfMZS53FWq\nGAme/he7mGtMgLVoWIt//7E3W/Yf5Zb/LaWgqNjtSK45VlDEuLeXsPdwHv+9KoW4uhVehQ9rbhWU\nJ4GhIpIGDHGWEZEUEXm1ZCcRaQskAPPKfP4dEVkFrALigL8FILMxpozT28XxxMXd+S5tP49MXxOR\nszyqKvd+sJIlWw/yr1E96ZnQ0O1IrnHl9gNVzQIGl7M+Fbi+1PIW4Dcz0KjqIH/mM8Z4b1RKApv3\nH+U/324iKa4O1w9McjtSQL0wO43pK3Zyz7COnN+judtxXBU597MZY/zmnnM6smX/Uf4+Yx1tGtdh\naJeqbtwMD58uz+T5b9K4pHcrbj4rvMfp8oYNvWKMOWlRUcK/RvWke8sGjJ+2jNWZ4f8kfeqWA9zz\n/kr6Jcbyj4vDb/bFE2EFxRjjE7WqR/PqVSk0rFWN6yensjv7mNuR/GZbVg7j3l5Cy0a1eOWKU8N+\n0Edv2T8FY4zPNKlfk9eu7sORYwVc/cZPYTnc/a7sXMa+8RNFxcrrV/ehUZ3qbkcKGlZQjDE+1bl5\nfSZdlcKWrKNcNnEhew6HT0tl+4EcRk1cyP4jebx+dQqJETCC8PGwgmKM8bkB7eN469p+7M4+xqiJ\nC9lxMPSH4du8/yijJi7kcG4h79zQj1PbxLodKehYQTHG+EXfxFjevr4fB47mc9nERWzNOup2pBOW\ntucIoyYuJL+wmKk39KdHq8h91qQyVlCMMX7Tu3Ujpt7Qn5z8QkZNXEj63tAb92vNzmwum7QIAaaN\n60+XFvXdjhS0rKAYY/yqW8sGTBt3GkXFMHrSQtbvPux2JK+t2H6IMZMWUTMmivduPI3kpvXcjhTU\nrKAYY/yuY7N6vHtjf2Kiohj1ykK+Wr3b7UhV+nR5Jpf/dxENa1fn3RtPi4gpfE+WFRRjTEC0i6/L\n+zd5fjHfNGUJf/l0NccKityO9Rs5+YXc8/4Kxk9bTpcW9Xn/ptNIiK3tdqyQYEOvGGMCJiG2Nh/c\ndDpPf7WeV7/fTOqWg7x0eS/axdd1Oxrgmc/klv8tJWP/UW4d1J7xg5OJiba/u71l/6SMMQFVPSaK\nhy7owutXp7ArO5cLX/qeD5e4O/OjqjJl0VZGvryAw8cKeee6ftx1TkcrJsfJ/mkZY1wxqFNTZowf\nSLeWDbjr/RXc8e5y9h4J/EOQu7JzufmdpTz0yWr6JzXmy/EDOb19XMBzhAOJpPkLUlJSNDU11e0Y\nxphSioqVF2en8dKcNKrHRPHHfm248cwkmtSr6dfj7jyUy3++3cS7i7dTrMrdwzoybmASUVE2yGNZ\nIrJEVVOq3M8KijEmGGzef5SX5qTxybJMqkV7CstNZybRpL5vC8vOQ7n8+9t03lu8g2JV/pDSipvP\nam8d75UI6oIiIn8AHgU6A32dibXK22848AIQDbyqqiUzOyYC04DGwBLgSlXNr+q4VlCMCX5b9h9l\nwtx0Pl6WSUyUcHm/1lzUsyVdW9Q/4T6NgqJiVmVm8+GSHbyXuh2AP6QkcPNZ7WjVyApJVYK9oHQG\nioGJwN3lFRQRiQY2AkOBHcBiYIyqrhWR94CPVHWaiLwCrFDV/1R1XCsoxoSOrVlHmTAnnY+WZVJU\nrNSrEUOfxFj6J8VyWlIcXVrUJ7qCy1OFTgFZlHGAhRlZpG45QE5+EdWihVEpCdx8dntaNqwV4DMK\nXUFdUH45uMi3VFxQTgMeVdVhzvIDzqYngX1AM1UtLLtfZaygGBN69h3JY1FGFgszsliUkUXGPs+Y\nYPVqxtCsnMthCuw6lMvRfM8zLh2a1qV/UuNfXrE23Pxx87agBPNzKC2B7aWWdwD98FzmOqSqhaXW\n/2be+RIiMg4YB9C6dWv/JDXG+E18vRpceEoLLjylBQB7Dx9j0eYD/JiRxcGc8q90n+YUj35JscTV\nrRHIuBHNbwVFRL4BmpWz6UFV/dRfxy1LVScBk8DTQgnUcY0x/tGkfk1GnNKCEU6BMcHDbwVFVYec\n5FdkAgmllls567KAhiIS47RSStYbY4xxUTA/2LgYSBaRRBGpDowGpqun02cucKmz31ggYC0eY4wx\n5XOloIjI70VkB3Aa8IWIzHTWtxCRGQBO6+MWYCawDnhPVdc4X3EfcKeIpOPpU3kt0OdgjDHm1+zB\nRmOMMZXy9i6vYL7kZYwxJoRYQTHGGOMTVlCMMcb4hBUUY4wxPhFRnfIisg/YeoIfjwP2+zBOqLDz\njiyRet4QuefuzXm3UdX4qr4oogrKyRCRVG/ucgg3dt6RJVLPGyL33H153nbJyxhjjE9YQTHGGOMT\nVlC8N8ntAC6x844skXreELnn7rPztj4UY4wxPmEtFGOMMT5hBcUYY4xPWEEpQ0SGi8gGEUkXkfvL\n2V5DRN51tv8oIm0Dn9L3vDjvO0VkrYisFJHZItLGjZy+VtV5l9rvEhFREQmL20q9OW8RGeX8O18j\nIv8LdEZ/8OK/89YiMldEljn/rZ/nRk5fE5HXRWSviKyuYLuIyIvOP5eVItL7hA6kqvZyXkA0sAlI\nAqoDK4AuZfa5GXjFeT8aeNft3AE677OB2s77P0XKeTv71QPmA4uAFLdzB+jfdzKwDGjkLDdxO3eA\nznsS8CfnfRdgi9u5fXTuZwC9gdUVbD8P+BIQoD/w44kcx1oov9YXSFfVDFXNB6YBI8vsMxKY7Lz/\nABgsIhLAjP5Q5Xmr6lxVzXEWF+GZKTPUefPvG+Bx4CngWCDD+ZE3530D8LKqHgRQ1b0BzugP3py3\nAvWd9w2AnQHM5zeqOh84UMkuI4G31GMRnllxmx/vcayg/FpLYHup5R3OunL3Uc8kYNl4JvkKZd6c\nd2nX4flrJtRVed5O0z9BVb8IZDA/8+bfdwegg4gsEJFFIjI8YOn8x5vzfhS4wpkAcAZwa2Ciue54\nfweUy29zypvwJCJXACnAmW5n8TcRiQL+BVztchQ3xOC57HUWntbofBHprqqHXE3lf2OAN1X1WRE5\nDXhbRLqparHbwUKBtVB+LRNIKLXcyllX7j4iEoOnWZwVkHT+4815IyJDgAeBEaqaF6Bs/lTVedcD\nugHfisgWPNeWp4dBx7w3/753ANNVtUBVNwMb8RSYUObNeV8HvAegqguBmngGTwx3Xv0OqIoVlF9b\nDCSLSKKIVMfT6T69zD7TgbHO+0uBOer0aoWwKs9bRHoBE/EUk3C4ng5VnLeqZqtqnKq2VdW2ePqO\nRqhqqM8j7c1/55/gaZ0gInF4LoFlBDKkH3hz3tuAwQAi0hlPQdkX0JTumA5c5dzt1R/IVtVdx/sl\ndsmrFFUtFJFbgJl47gh5XVXXiMhjQKqqTgdew9MMTsfTyTXavcS+4eV5PwPUBd537kHYpqojXAvt\nA16ed9jx8rxnAueIyFqgCLhHVUO6Je7led8F/FdE7sDTQX91GPzBiIhMxfMHQpzTP/QIUA1AVV/B\n0190HpAO5ADXnNBxwuCflTHGmCBgl7yMMcb4hBUUY4wxPmEFxRhjjE9YQTHGGOMTVlCMMcb4hBUU\nE5GckYOnlFqOEZF9IvK5m7mcLDNEpKGX+74pIpdWsc+3x/MwpoicFQz/HEzosedQTKQ6CnQTkVqq\nmgsM5QSeDPYHVQ2LIdNN5LEWiolkM4DznfdjgKngGcNLRNJEJL7UcnrJcgkReUFE/uK8HyYi853x\nvyiz339EJNWZV+SvzroGzrwcHZ3lqSJyg/N+i4jEiUgdEflCRFaIyGoRuayykxGRv4jIYmffSWVG\nwb5SRJY72/o6+9dx5sn4yZn/o7yRlo3xmhUUE8mmAaNFpCbQA/gRwBkIcArwR2e/IcAKVS07BMcD\nwGUicjbwInBNBYMIPqiqKc4xzhSRHqqaDdwCvCkio/HMO/LfMp8bDuxU1VNUtRvwVRXnM0FV+zj7\n1gIuKLWttqr2xDOfz+slufAMHdQXz3w3z4hInSqOYUyFrKCYiKWqK4G2eFonM8psfh24ynl/LfBG\nOZ/PwTNvyCw8v8w3VXCoUSKyFM+EVV3xTNyEqs4CVgEvA9eX87lVwFAReUpEBjpFqDJni2cW0VXA\nIOdYJaY6x5wP1Hf6aM4B7heR5cC3eMatal3FMYypkPWhmEg3HfgnnnGOfpnXRlW3i8geERmEZ2Km\nP5b/cbrjGW26BYCIRANLSn33G8DdQB9VPSgib+L5xV0yPH5nPGMnNcIzwu8vVHWjMx/LecDfRGS2\nqj5WXginlfVvPDNKbheRR0uOU/J1ZT6ieGbnu0RVN5T5rqYVnKsxlbIWiol0rwN/VdVV5Wx7Fc+l\nr/dVtajsRhFpg2cwwV7AuSLST1WLVLWn8/oLntn/jgLZzi/qc0t9xR3AOuBy4A0RqVbm+1sAOao6\nBc/gnJXN811SPPaLSF08I2GXdpnznb/DM5JsNp5BEm8t6WtxRpQ25oRZC8VENFXdgaf/ozwlLYzf\nXO5yfgm/BtytqjtF5Do8/SF9VPWXqYJVdYWILAPW45kRb4Hz+Y54LnP1VdUjIjIfeAjPKLAluuPp\n1ygGCoA/VXIeh0Tkv8BqYDeeodpLO+bkqIbnEh54pjZ+HljptJY28+t+F2OOi402bEwFnGc3nlPV\ngW5nMSYUWAvFmHKIyP14WgQV9Z0YY8qwFooxxhifsE55Y4wxPmEFxRhjjE9YQTHGGOMTVlCMMcb4\nhBUUY4wxPvH/AYpb+TxZIHpMAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots()\n", "plt.plot(timestamps,np.sin(2*np.pi*timestamps*frequency))\n", "\n", "#We can add a title to the plot\n", "plt.title('My Plot')\n", "\n", "#And label the axes\n", "plt.xlabel('My x-axis label')\n", "plt.ylabel('My y-axis label')\n", "\n", "txt, info = get_plot_info(ax)\n", "print(txt)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "text/plain": [ "{'legendlabels': [],\n", " 'title': 'My Plot',\n", " 'x_label': 'My x-axis',\n", " 'x_ticks': ['', '', '', '', '', '', '', ''],\n", " 'y_label': 'My y-axis',\n", " 'y_ticks': ['', '', '', '', '', '', '', '', '', '', '']}" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Show the information returned about the chart axes\n", "# This is a subset of the axes data; modify get_plot_info() to add more details\n", "info" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Add Interactive Widgets\n", "\n", "It's a straightforward matter to decorate a function that can create an interactive chart where the controls are dynamically created based on the type of any arguments passed into the function." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "hide_input": false, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "ebeb5d7a54a84e6eaee7c30f87512968", "version_major": 2, "version_minor": 0 }, "text/plain": [ "A Jupyter Widget" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from ipywidgets import interact\n", "\n", "@interact(f=(0,10,1))\n", "def pltsin(f):\n", " plt.plot(timestamps,np.sin(2*np.pi*timestamps*f))" ] }, { "cell_type": "markdown", "metadata": { "hide_input": true, "slideshow": { "slide_type": "slide" } }, "source": [ "## Drawing Mathematical Diagrams\n", "\n", "Several packages exist that support the creation of print quality mathematically accurate scientific diagrams including:\n", "\n", "- `asymptote`\n", "- `TikZ`" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### `asymptote`\n", "\n", "The [`asympote` Linux package](http://asymptote.sourceforge.net/) *is a powerful descriptive vector graphics language that provides a natural coordinate-based framework for technical drawing. Labels and equations are typeset with LaTeX.*\n", "\n", "*A major advantage of Asymptote over other graphics packages is that it is a programming language, as opposed to just a graphics program.*" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "drawingspec = '''\n", "import math; import graph; import geometry;\n", "size(12cm); xaxis(\"$x$\"); yaxis(\"$y$\");\n", "real theta1={theta1}; real theta2={theta2};\n", "real L1=0.45; real L2=0.48;\n", "pair l1p = (L1*sin(theta1), L1*cos(theta1));\n", "pair l2p = l1p + (L2*sin(theta1+theta2), L2*cos(theta1+theta2));\n", "draw((0,0)--l1p--l2p); draw(l1p--l1p*1.5, dashed); dot(l2p); draw((0,0)--l2p, dashed); \n", "label(\"$J1(0,0)$\", (0,0), NW); label(\"$J2(u,v)$\", l1p, NW); label(\"$H(x,y)$\", l2p, NE);\n", "draw(\"$L1$\",(0,0)-0.02*I*l1p--l1p-0.02*I*l1p, red, Arrows, Bars, PenMargins);\n", "draw(\"$L2$\", l1p-0.02*I*l2p--l2p-0.02*I*l2p, red, Arrows, Bars, PenMargins);\n", "draw(\"$\\\\theta_1$\", arc((0,1),(0,0),l1p,0.1), blue, PenMargins);\n", "draw(\"$\\\\theta_2$\", arc(l1p,0.1,degrees(l1p),degrees(l2p-l1p),CW), blue, PenMargins);\n", "draw(\"$\\\\alpha$\", arc((1,0),(0,0),l2p,0.2), blue, PenMargins);\n", "'''" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "%load_ext asymptote_magic" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "The following code cell has a hidden input. Select the cell and click on the *Toggle selected cell input display* toolbar button to reveal the code.\n", "\n", "You can dynamically change the diagram by entering new parameter values into the text boxes." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "theta1='-pi/2'\n", "theta2='pi/3'\n", "\n", "diag=drawingspec.format(theta1=theta1,theta2=theta2)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%asy -v diag" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8adcd2bbc6944331920e2e06d60223e9", "version_major": 2, "version_minor": 0 }, "text/plain": [ "A Jupyter Widget" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "@interact(theta1='-pi/2', theta2='pi/3')\n", "def asym_demo(theta1,theta2):\n", " global fig\n", " fig = drawingspec.format(theta1=theta1,theta2=theta2)\n", " fig=%asy -v fig\n", " return fig " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "### `TikZ`\n", "\n", "The `TikZ` Linux package is a *TeX* package for creating graphics programmatically ([about](https://www.tug.org/TUGboat/tb29-1/tb91walczak.pdf)).\n", "\n", "It provides a front-end layer for the [PGFPlots](http://pgfplots.sourceforge.net/) LaTeX chart plotting package ([gallery](http://pgfplots.sourceforge.net/gallery.html)).\n", "\n", "See the [`Tikz.ipynb`](Tikz.ipynb) notebook for examples." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "## Symbolic Maths\n", "\n", "Supprt for *symbolic maths* means ...\n", "\n", "Support for symbolic mathematics is available via the Python `sympy` package.\n", "\n", "??Jupyter notebooks can also work directly with Mathematica kernel; is there also the free equivalent kernel?" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "#Import sympy packages\n", "import math\n", "from sympy import *\n", "from sympy import init_printing\n", "init_printing()\n", "\n", "b,c,B,C=symbols(['b','c','B','C'])" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAG8AAAAiCAYAAABRA4fSAAAABHNCSVQICAgIfAhkiAAABCVJREFU\naIHt2luoFXUUx/GPaaAHwrIIu2dqllke7WaWmg9ZLwVClOSDBb0ZdIMgop4isgsFYUF0OUE3MsKg\nEgsxoqi00i4kgZVFN+8IB5O07GHN0Jxxz3af4+w9neN8YTN7z/7v9V/7t2bW+l+GmpqE+7G6aicO\nF44o2d40rC/ZZk0BZQevG+tKtllTQJnBOx4n4m+swm5xF15UYh+DjZPwPP7AHnyDeZV6VMA87McX\nmINJeAs/YUSFflXFyfgFyzETE7AIM6p0qoi78BdOz5ybLAI6qQqHKubt5DWsakda4RW8mjt3ggje\n5M67Uymnif99QTs7KbPmdYuUmWUGerGxxH4GA93Yh8/b2UlZwevCmRieOTcMd+JFkU4PJ/aKOn9U\n1Y60wgzh8Ibk/QQRtJ9xXIV+VcWx2IGXcQ7Ows2YWmYnZY0Cu/E97sFrImArcDG2ldRHM27D0f1o\nv16MAtvFdlyNh/CJmD6tFaPvmhybxACh1VdPFU7W1NQMBdIJ5P5KvWidoglvmTVvsGgxZNikrnmF\n9BjYSOkYbMb4fv5umZgj/h/pMci0GK1/aSnlYbGqnmWVvnfBTryDUzJtzhXzpNED6LPdlKlFSjde\nEgvZe/CjCNqFKtKiSwTmstz5nbgbY8UW0lxsxQu5dp9hcZt97BRFWsCNYintOVyKUzFbLHI8m7Q5\nqBazxYSyF7uwBlOS73r0TRXv40k8ICbhW/CIvstt14orJjvIGC/utktyfa/G67lz9+HDZg63kU5o\nQeiwD7cX+DEmOTbUIu1gBN5MGkwVKyOPi5WBIhYmHc/ELWLEd33m+1liYTY7ejs/+U36qMSRuEGk\nh6U5+2vERu6oJj60g05pAY/iUzxWYHdHcmyqxZjE8JwCIz0OvNo+zrV5D89kPi93YCpcgn/EFd0r\nBNmOKxr0eV7iU38L/KHSKS0mJv0saMGnhlqkd96OxKmVYgPxDpF7m/FV7vNv4lGIlFGi+GaZjjdE\nge4WV+paPI2RubZ/Zux0kk5qQdSzg9FQi2xevkmkiA9wDb7DlU0M7s193p+zt00Mj7NMx0dif2+j\nSBkPit33/IZtmu+3NvGhXXRCi67k2NuCPw21yO/nfSlS2+UiHSxqwXAR6/QNyLjEifzTZWckxy25\n81Pwq5gbVUE7tSAeRqI4PXdl3jfUIg3eOHEHzBRb+HNFnv124P5aibPF3hYxWCGepBorgrYw6Ted\n42SZldjoNJ3QgigXK/CEmC5MFPug14maOT3TtqEW6X7ebrETvkzsxW0Wgi45BIe/FqOkBWIkmQZv\nQ3LcJVLnvf6bz6SMxHzNU1W76IQWKfNxq6irS8UTBz+IWpvWwsq0uErUi+EHa5hjMd4t351KKV2L\n/hrqLxtFav5d3GmtMg1PiWnEUKHWoqampqamZoD8C6VrJ+uS1fOgAAAAAElFTkSuQmCC\n", "text/latex": [ "$$\\frac{b}{\\sin{\\left (B \\right )}} = \\frac{c}{\\sin{\\left (C \\right )}}$$" ], "text/plain": [ " b c \n", "────── = ──────\n", "sin(B) sin(C)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#A simple example of the sine rule\n", "exp=Eq(b/sin(B),c/sin(C))\n", "exp" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFgAAAAkCAYAAAANdf2OAAAABHNCSVQICAgIfAhkiAAABLJJREFU\naIHt2muwlVMYwPFfKSoMYggplUwRpSRF6AMaH8xkDGGMy5hpyCV88oUZM4j64FZM47IZjQ8lDCGN\nYdxPF4UYlyaHEemiIoluPjzv1nveffY+e5+bs7P/M++s8673Wet93mev9axnredQo0YzyeHVZrQ7\nBL9gQIXt5uD2ZryvajkIBzej3TQ8nal7C7tT10a8hmNSMifh1+S9NYrQQxjvzEz9RtyBXjgK47AO\nz2TklmByG+vY6hwtRtQabMMKnIez8DG2YDMWYUiqXU5DF/EOZuJerMdaTEfnlMzFYhR2StUNEKN2\ndEavtzE3U3cn3k9XdNax6Y064RcvEgachq14WXzMUIzCg9jZRH9XYAfG4EZMwaWp52OxVBg0z4ik\nzfLkvisux0jMyPS/CKehe5nf958zP7k6Zep7CiOcXaJtTuEI/igjsxBPpO5fUjjt78cuMVO2iB9x\nA85t5J0nJ3r9u0A2NoKvT4SuLaF8e9AXF+AuDUcUMY1zWCB+gNvQp4w+P8vc/4TDU/fdhRtKMxzz\nMCy5xmAxZqFbRvbPVD9o3MAjknJpGQq3JcPE1CymxzXCNbyLC/E1zm+iz+2Z+90a2mC9cEdphuMD\nrEyuOkzFsTghI9szKdflK4oZeBu+aELZtmY7uuDAEjKfiil8jnABV7Xwncs0NFo/YbRlGbn+Sbk2\nUz8Eq0UcjUID74cTxVTa0UJlW0qdCI8eFzoNwnViUesnRtEY4UrGCf/3ZQvfuQCDcWhyn5/Na0SI\n1l8slFMxGz9m2o9N+ijKqWLazBRT9AXh0P/AmxqGQe3BGWJ6/o5NYlHqhSOEX1yNv/ADHhArfJ6c\nwkXu0Uz/WRliIczHsvdpuMHYJGLdSWJ2pekmwsXTS33QpKSj+cKocxPF30vq12re7qiaGC/8+T4V\ntpssBmEDsr/C8KQcJXYzad/zLK7EDSJYb4wpKvsBlovQqCPxhohve+P7Ctptx01NCS1RPEQblTx7\nvkT7eg2nVFNXrkzl9wq6Cn9Wr3BkE4vJbrzYjjpVPekoYgj2xSsajyD6JmUl0+Z/T3qk5kOS+iKy\nE5KywJGnaE0fnN29VT2PiY+6p5FnR4oDlm807j7y1Kv54KLUiY9ehf1T9QeI+HOnCGE6KjkdOIPR\nRRxUfIKv8K04FnxY7FZ24eYKFWhvWjODQWy08ru1bfhOGHVk8ryiDMZQMXpniQPuefgtuRaIvf7e\nSLEMxtVioX9K7Cb7iAP+5/BkSq4qMxilKJXFyGmdDMZoYdxbi+jQM/V3QQajmukiRtt04S8HiczC\n4OR5TqGBN+NuHI9LhOEuS8k8JNaXNB+K849yGI+/VVEGoxRNZTFyWp7BGJi8Y2KZOhVkMLJ09Jxc\nmuZkMSrNYOTPYpaUqVNBBiNLNRmYyrMYlWYweiTlljL1KchgZKk2A9O6WYxsBmNFUhZzQz0y9wUZ\njCzVZOC2yGJkMxiL8ToeEaHaQBwnFsiF9riQPE1mMEptezsaW0U0MAeHiVEzW4zm5vK5CPUm2vM/\nDhNwi/DxM0SUsEr4/bRv7pbINpVo/d/TqhmMLJV2ujeyUrjKn0XcXC6niAOyDW2hVI0aNWrUaDn/\nAFrdRYpcWwpxAAAAAElFTkSuQmCC\n", "text/latex": [ "$$b = \\frac{c \\sin{\\left (B \\right )}}{\\sin{\\left (C \\right )}}$$" ], "text/plain": [ " c⋅sin(B)\n", "b = ────────\n", " sin(C) " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#We can solve for b:\n", "distance_b = solve(exp)[0][b]\n", "Eq(b, distance_b)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "image/png": "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\nGEa34X/tpASXvc0EsAAAAABJRU5ErkJggg==\n", "text/latex": [ "$$b = \\frac{c \\sin{\\left (B \\right )}}{\\sin{\\left (C \\right )}} = 22375.2723037434$$" ], "text/plain": [ " c⋅sin(B) \n", "b = ──────── = 22375.2723037434\n", " sin(C) " ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Then we can substitute in values\n", "Eq(Eq(b,distance_b), distance_b.subs({c:27404,B:math.radians(45),C:math.radians(60)}))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [] } ], "metadata": { "hide_input": false, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "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.5.3" } }, "nbformat": 4, "nbformat_minor": 2 }