{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Initial Value Problems\n", "\n", "An initial value problem is an ordinary differential equation of the form $y'(t) = f(y, t)$ with $y(0) = c$, where $y$ can be a single or muliti-valued.\n", "\n", "The idea is that you specifty the starting point of a system and the rules that govern the system, and let the simulation go from there." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Your Zebra Sanctuary\n", "\n", "Let's say you are really enthusiastic about zebras.\n", "\n", "

\"Grevy's\n", "
\n", "

By Rainbirder - Grevy's Zebra Stallion, CC BY-SA 2.0, Link

\n", "\n", "You decide to start a zebra sanctuary in your backyard. Soon you have a bunch of zebras having a great time eating your grass and shrubbery." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### A Growing Problem\n", "\n", "Your zebras keep having babies. This is manageable for now, and the baby zebras are cute. However, you're a bit worried about the number of zerbas you're going to need to feed, and you want to figure out what will happen if you let things go unchecked. Naturally, you decide to write a program to simulate your zebra problem.\n", "\n", "Let's say you have $z_0$ zebras this month. The number of zebra babies that will appear next month is proportional to the current population, so \n", "\\begin{equation}\n", "z_1 = z_0 + \\Delta(z_0)\n", "\\end{equation}\n", "where $\\Delta(z_0) = \\alpha z_0$. You estimate $\\alpha$ is about $0.02$. \n", "\n", "We can write this as a differential equation\n", "\\begin{equation}\n", "z'(t) = \\alpha z(t)\n", "\\end{equation}\n", "\n", "Now it is time to fire up your Python interpreter. We'll use `solve_ivp` in `scipy.integrate` - this is a high-level wrapper with lots of options for solving initial value problems. The important arguments to provide are:\n", "* `f(t, y)` - a Python function that returns the right-hand side of the ODE - this can be a multivalued function\n", "* `t_span` - a tuple `(t0, t1)` which gives the start and end times of the simulation\n", "* `y0` - the state of the system at `t0`\n", "\n", "`solve_ivp` will do a lot of work for you - deciding on a backend algorithm, chooing time steps, etc. You might find it useful to specify `t_eval`, which gives an array of points to evaluate the function on." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from scipy.integrate import solve_ivp\n", "\n", "z0 = np.array([50])\n", "alpha = 0.02\n", "\n", "f = lambda t, z : alpha * z\n", "t_span = (0, 100)\n", "t_eval = np.linspace(0,100, 200)\n", "\n", "sol = solve_ivp(f, t_span, z0, t_eval=t_eval)\n", " \n", "plt.plot(sol.t, sol.y[0], c='k')\n", "plt.title(\"The Zebra Problem\")\n", "plt.ylabel(\"zebras\")\n", "plt.xlabel(\"months\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Things do not look good. There is no way you can afford to feed even 100 zerbas while paying tuition at the University of Chicago. Hard choices will need to be made.\n", "\n", "### A Natural Solution\n", "\n", "When posting a \"Zebras for sale\" ad on craigslist, you see an add for a family of lions that need a home. You feel bad for the lions, and realize you can use them to solve your zebra problem. However, before commiting, you want to make sure the lions won't eat all the zebras (you just want to keep the population controlled, not exterminated). You read a bit about how lions and zebras might interact and decide to use a [Predator-Prey model](https://en.wikipedia.org/wiki/Lotka%E2%80%93Volterra_equations). \n", "1. Zebras will continue to have babies at rate $\\alpha$.\n", "2. A lion will catch and eat every $100$th zebra it sees. The number of zebras a lion sees depends on the zebra population, we'll denote the rate at which a lion encounters a single zebra in a month as $\\beta$.\n", "3. For every 5 zebras the lions eat, a lion baby is born. \n", "4. Lions die of old age at a rate of $\\gamma$\n", "\n", "We'll use $x$ to denote the number of lions, and $z$ for the number of zebras. Now, the amount the zebra population changes every month is $\\Delta_z(z,x) = \\alpha z - \\frac{\\beta}{100} x z$. The amount the lion population changes every month is $\\Delta_x(x,z) = \\frac{\\beta}{500} x z - \\gamma x$. \n", "\n", "In order to solve this problem, we can use a vector $y = [x, z]^T$, and the following ODE system:\n", "\\begin{equation}\n", "y_0'(t) = \\frac{\\beta}{500} y_0 y_1 - \\gamma y_0\\\\\n", "y_1'(t) = \\alpha y_1 - \\frac{\\beta}{100} y_0 y_1\n", "\\end{equation}\n", "\n", "You estimate $\\gamma$ to be $0.02$, and $\\beta$ to be $1.0$.\n", "\n", "You plan to start with 5 lions and 50 zebras." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEWCAYAAABhffzLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3deXgUVdb48e9JCASQJexhB0F2DYKI8srmIOo4yqAoJmwyyoij4oqi89MXfQQUBpcXRFERFBRRZnABRER0RkZFEJRdEAGBsIUlCAmB5Pz+qOrQhJB0lk6lu8/nee7T3dVV1aeCnlt1761boqoYY4yJHFFeB2CMMaZkWeI3xpgIY4nfGGMijCV+Y4yJMJb4jTEmwljiN8aYCGOJ35Q6InKFiGzyOo7SQkS6i8hOr+Mw4cMSv/GMiGwTkT/kXK6q/1HVFl7EFAxuRfZ7LiVLRKZ5HZ+JPJb4jQkytyI7z78AfYHfgYnF/XsiEl3c+zThxRK/KXVyNm2ISCsR+VJEDovIOhG53u+76SIyWUTmi8hREflORM53vxMReV5E9onIERH5SUTa5vJ7/UVkRY5l94vIR7msO0REtrq/9auIJBXi+BoAs4C7VHWtu6yciEwQkR0isldEXhGR8jm2e0xEDrhXSkl+y6eLyBQRWSAix4AeIvJHEVklIqki8puI/K/f+rEiMlNEUty/6fciUrugx2FClyV+U6qJSAzwMfAZUAu4B5glIv5NQbcCo4E4YAvwjLv8KqArcAFQFbgFSMnlZz4CWohIc79licA7OWKpCLwEXKOqlYDLgdWFOJ45wAeqOtPvq2fdOBOAZkA94Am/7+sANdzlg4GpOf4GiTjHXQn4GjgGDMI57j8Cw0Wkj7vuYKAK0ACoDtwJpBXkOExos8RvSrvOwHnAOFXNUNUvgE9wkr3PP1V1uaqewjmTTnCXn8RJhC0BUdUNqpqc8wdU9TjwoW+fbgXQEqdCyCkLaCsi5VU1WVXXFfB4JgJlgPt8C0REgDuA+1X1oKoeBcYA/XNs+/9U9YSqfgXMB272++5DVV2mqlmqmq6qX6rqGvfzT8C7QDd33ZM4Cb+Zqmaq6kpVTS3gcZgQZonflHZ1gd9UNctv2XacM1+fPX7vj+NUFLiVxCRgMrBXRKaKSOVz/M47nK5MEoF5boWQTVWP4Vw13Akku81LLQM9EBHp7+77JlU94fdVTaACsNJtejkMfOou9znk/r7Pdpy/jc9vOX7rUhFZKiL7ReSIG3MN9+u3gUXAbBHZLSLPuVciJkJY4jel3W6ggYj4/7faENgVyMaq+pKqdgDa4DSlPHyOVT8DaohIAk4F8E5uK6nqIlXtBcQDG4HXAolDRFoBU4GBqro9x9cHcJpa2qhqVbdUcTuBfeLcpiafhjh/m+zQcuzzHZwrlgaqWgV4BRD3GE6q6mhVbY3TXHUdTrOQiRCW+I3XYtzORl8pk+P773Daq0eKSIyIdAf+BMzOb8cicol75hvj7iMdyMxtXbeZ6ANgPFANWJzL/mqLyPVuAj6BMyon1/3l2K4iMBd4UVUX5PLbWTgVyPMiUsvdpp6I9M6x6mgRKSsiV+Ak6/fz+NlKwEFVTReRTjhXGr54eohIO3f0TypO00++x2HChyV+47UFOGe7vvK//l+qagZwPXANzpnxy8AgVd0YwL4r4yTUQzhNIynAhDzWfwf4A/C+WxEgIkki4mvHjwIexDnTPojTZn6Xu94VIvL7OfZ7I9AKeCCXsfwL3XUewemY/lZEUoHPAf/O2z3ucezG6ce4M5+/wV3AUyJyFKeTeI7fd3VwKrlUYAPwFTDzrD2YsCX2IBZjjIksdsZvjDERxhK/McZEGEv8xhgTYSzxG2NMhMk5dK5UqlGjhjZu3NjrMIwxJqSsXLnygKrWzLk8JBJ/48aNWbFiRf4rGmOMySYiOW8WBKypxxhjIo4lfmOMiTCW+I0xJsKERBu/Mcb4O3nyJDt37iQ9Pd3rUEqF2NhY6tevT0xMYJOsWuI3xoScnTt3UqlSJRo3bozzOIPIpaqkpKSwc+dOmjRpEtA2QW3qcR8Rt0ZEVvsebSci1URksYhsdl/jghmDMSb8pKenU7169YhP+gAiQvXq1Qt09VMSbfw9VDVBVTu6nx8Flqhqc2CJ+9kYYwrEkv5pBf1beNG5ewMww30/A+iTx7pFsnTpUsaNGxes3RtjTEgKduJX4DMRWSkiw9xltX3PPXVfa+W2oYgME5EVIrJi//79hfrx+fPn8/jjj7Nly5ZCbW+MMUXVuHFjDhw44HUYZwh24u+iqhfjPETjbyLSNdANVXWqqnZU1Y41a551x3FAHnroIWJiYhg7dmyhtjfGmJJw6tSpEv29oCZ+Vd3tvu4D/gV0wnnodTyA+7ovWL9fp04d7rjjDt566y22b8/1zmVjjCmwV155hYSEBBISEmjSpAk9evTgs88+47LLLuPiiy+mX79+/P776QeyjR8/nk6dOtGpU6fsFoghQ4bwwAMP0KNHDx555BGWL1/O5ZdfTvv27bn88svZtGkTAOvWraNTp04kJCRw4YUXsnnz5iLHH7QncLnPGY1S1aPu+8XAU8CVQIqqjhORR4Fqqjoyr3117NhRCztXz2+//cb555/PHXfcweTJkwu1D2NM6bJhwwZatWoFwH333cfq1auLdf8JCQm88MIL+a538uRJevbsybBhw3jttddYuHAhFStW5Nlnn+XEiRM88cQTNG7cmDvuuIPHH3+ct956izlz5vDJJ58wZMgQDhw4wIcffkh0dDSpqalUqFCBMmXK8PnnnzNlyhTmzp3LPffcQ+fOnUlKSiIjI4PMzEzKly+f59/ER0RW+g2syRbMcfy1gX+5vc1lgHdU9VMR+R6YIyJ/AXYA/YIYAw0aNGDIkCG88cYbPP7449StWzeYP2eMiSAjRoygZ8+exMXFsX79erp06QJARkYGl112WfZ6t956a/br/fffn728X79+REdHA3DkyBEGDx7M5s2bERFOnjwJwGWXXcYzzzzDzp076du3L82bNy964Kpa6kuHDh20KH755ReNjo7W+++/v0j7McaUDuvXr/c6BH3zzTf12muv1czMTP3oo4+0f//+ua7XqFEj3bp1q6qqZmRkaPXq1VVVdfDgwfr+++9nrzd48GB98cUXVVX1119/1UaNGmV/t2XLFn3xxRe1SZMmumTJklx/J7e/CbBCc8mpETFXT9OmTUlKSuKVV14hJSXF63CMMSFu5cqVTJgwgZkzZxIVFUXnzp1ZtmxZdvv98ePH+fnnn7PXf++997Jf/a8E/B05coR69eoBMH369OzlW7dupWnTptx7771cf/31/PTTT0WOPyISP8DDDz9MWloar776qtehGGNC3KRJkzh48CA9evQgISGBUaNGMX36dG699VYuvPBCOnfuzMaNG7PXP3HiBJdeeikvvvgizz//fK77HDlyJKNGjaJLly5kZmZmL3/vvfdo27YtCQkJbNy4kUGDBhU5/qB17hanonTu+uvduzc//fQT27Zto1y5csUQmTHGC7l1ZEa6gnTuRswZP8CDDz7Inj17si+7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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "z0 = 50\n", "x0 = 5\n", "alpha = 0.02\n", "beta = 1.0\n", "gamma = 0.02\n", "\n", "y0 = np.array([x0, z0])\n", "f = lambda t, y : np.array([\n", " -gamma*y[0] + beta/500 * y[0]*y[1],\n", " alpha*y[1] - beta/100 * y[0]*y[1]\n", "] )\n", "\n", "t_eval = np.linspace(0, 100, 200)\n", "\n", "sol = solve_ivp(f, t_span, y0, t_eval=t_eval)\n", "\n", " \n", "plt.plot(sol.t, sol.y[1], label=\"zebras\", c='k')\n", "plt.plot(sol.t, sol.y[0], label=\"lions\", c='r')\n", "plt.title(\"Lions v.s. Zebras\")\n", "plt.ylabel(\"population\")\n", "plt.xlabel(\"months\")\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Oh no! Soon the zebras will be eaten, and you'll be left with a pack of hungry lions. You wonder what would happen if you do some landscaping to make it easier for the zebras to hide. Then you might have $\\beta = 0.3$." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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HTdl7c+Li4sjMTGRatWqkZSURMWKFalQocJxU7ly5ShdujQJCQmULFky4zE+Pp7Y2Fgg+MqY+cj98OHDHDx4kAMHDnDw4MGM+X379mXsXNK/TezevZvt27ezefNmFixYwI4dO46rMSYmhjp16pCUlETDhg1JSkqicePGtGjRgipVqoT/jypSQB05coRixfIvjhX8EZYe8MuWLWP58uUsW7YsY37//mM3dCpdujT16tUjKSmJbt26Ub9+fWrXrk316tWpXr06FStWJCYm70/ZFCtWjISEBMqXL3/a26amprJt2zY2bdrE+vXrWbNmDatXr2bNmjXMmTPnuPZVrVqVli1b0qpVK1q2bEnr1q1JSkoKS5tEfqm///3v/P3vfwdg79691KlTh/vuu4+HHnqI1NRU6tevz6uvvkrp0sFtk59++mlmz54NwBtvvEGDBg0YMGAAFSpU4JtvvuGcc86hb9++3HHHHRw4cICEhAReffVVGjVqxLJlyxg4cCCHDh0iLS2NyZMn07Bhw19Uf6G4A1ebNm28KIzVkx7yCxYsYOHChRmPu3fvznhN1apVadq0Kc2aNct4bNSoEZUrVy5Sfejuzvbt21m+fDmLFy9m0aJFLF68mOXLl3P48GEAypUrR9u2bWnXrh3t27fn/PPPP6MdkBQ9K1asoEmTJgDccccdLFq0KE/fv1WrVowcOfKUrzt8+DBdunRhyJAhjBkzhpkzZ1KqVCmeeuopUlNTefDBB6lTpw6DBw/mgQceYMKECbz99tt88MEHDBgwgF27djF16lRiY2PZt28fJUuWpFixYnzyySe89NJLTJ48maFDh9KuXTtuuOEGDh06xNGjR0lISMjxb5LOzBa6e5usr9URfxjt27ePL7/8krlz5/L111+zYMECdu3aBQRH0snJyVx99dWcc845NG/enCZNmlCxYsUIV50/zIyqVatStWpVunTpkrH+0KFDrFixgoULFzJ//nzmz5/PI488knGyuWnTplx00UV06dKFTp06Fah+U4k+t99+O126dKF8+fIsX76cCy64AAj+Hbdv3z7jdddff33G45133pmxvk+fPhndrHv37qV///6sWbMGM8s4AGrfvj2PPfYYmzdvpnfv3r/4aB8U/Hlq8+bNzJkzh7lz5zJnzhyWLFlCWloaMTExJCcnc+WVV3LuuefSpk0bWrRoQXx8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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "z0 = 50\n", "x0 = 5\n", "alpha = 0.02\n", "beta = 0.3\n", "gamma = 0.02\n", "\n", "y0 = np.array([x0, z0])\n", "f = lambda t, y : np.array([\n", " -gamma*y[0] + beta/500 * y[0]*y[1],\n", " alpha*y[1] - beta/100 * y[0]*y[1]\n", "] )\n", "\n", "t_eval = np.linspace(0, 100, 200)\n", "\n", "sol = solve_ivp(f, t_span, y0, t_eval=t_eval)\n", "\n", " \n", "plt.plot(sol.t, sol.y[1], label=\"zebras\", c='k')\n", "plt.plot(sol.t, sol.y[0], label=\"lions\", c='r')\n", "plt.title(\"Lions v.s. Zebras\")\n", "plt.ylabel(\"population\")\n", "plt.xlabel(\"months\")\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That looks a bit better - what if we run the simulation for longer?" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEWCAYAAABhffzLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOydeVxTV/r/P0+AFERQBK1YEbRulV1AQbHiWve2aqe1TrW21i7fdpzamY7OTKe1006ny7S1v87Yvdpaa1frioIoIe6CKyoudUNBUREQlS15fn+cBJGyBEhyk9zzfr3uK8nNved87r3J5577nI2YGRKJRCJRDxqlBUgkEonEvkjjl0gkEpUhjV8ikUhUhjR+iUQiURnS+CUSiURlSOOXSCQSlSGNX+JwENEgIjqitA5HgYiSiOis0jokroM0foliENEpIhpeez0z65m5lxKabIHpRlZax2Ikoi+U1idRH9L4JRIbY7qRta65AJgIoBTAu9bOj4jcrJ2mxLWQxi9xOGqHNojoLiJKJ6IiIjpIRBNqfLeIiP5LRGuI6CoR7SCiO03fERG9R0QFRFRMRPuJKKyO/B4iosxa654nopV1bPsoEZ0w5XWSiKY24/iCAHwD4Blmzjatu42I3iGiM0R0gYg+IiKvWvv9lYgumZ6UptZYv4iIFhLRWiK6BmAIEY0loj1EVEJEuUT0So3tPYloCRFdNp3TXUR0e1OPQ+K8SOOXODRE5AFgFYAUAB0APAfgGyKqGQqaAmA+AD8AxwG8blo/EsDdAHoCaAvgQQCX68hmJYBeRNSjxrqHASytpcUbwAcARjOzD4ABAPY243i+B/AjMy+p8dWbJp1RALoDuAPAP2p83xFAgGn9dACf1DoHD0Mctw+AzQCuAZgGcdxjATxNRPeZtp0OoA2AIAD+AJ4CcKMpxyFxbqTxSxydeACtAfybmSuYeSOA1RBmb+ZnZt7JzFUQJeko0/pKCCPsDYCY+TAz59fOgJmvA1hhTtN0A+gNcUOojRFAGBF5MXM+Mx9s4vG8C8AdwB/NK4iIADwB4HlmLmTmqwD+BeChWvu+xMzlzKwDsAbA72p8t4KZtzCzkZnLmDmdmQ+YPu8H8C2AwaZtKyEMvzszG5g5i5lLmngcEidGGr/E0ekEIJeZjTXWnYYo+Zo5X+P9dYgbBUw3iQ8B/BfABSL6hIh868lnKW7eTB4G8IvphlANM1+DeGp4CkC+KbzU29IDIaKHTGlPZubyGl+1B9AKQJYp9FIEYJ1pvZkrpvzNnIY4N2Zya+XVn4g2EdFFIio2aQ4wff01gPUAlhFRHhG9ZXoSkagEafwSRycPQBAR1fytdgFwzpKdmfkDZo4BEAoRSvlzPZumAAggoiiIG8DSujZi5vXMPAJAIIAcAJ9aooOI7gLwCYBHmPl0ra8vQYRaQpm5rWlpY6oENuNnCjWZ6QJxbqql1UpzKcQTSxAztwHwEQAyHUMlM89n5j4Q4apxEGEhiUqQxi9RGg9TZaN5ca/1/Q6IePWLRORBREkAxgNY1ljCRBRnKvl6mNIoA2Coa1tTmOhHAG8DaAcgtY70bieiCSYDLodolVNnerX28wbwE4AFzLy2jryNEDeQ94iog2mfO4jonlqbziciLRENgjDrHxrI1gdAITOXEVE/iCcNs54hRBRuav1TAhH6afQ4JK6DNH6J0qyFKO2al1dqfsnMFQAmABgNUTL+H4BpzJxjQdq+EIZ6BSI0chnAOw1svxTAcAA/mG4EIKKpRGSO42sAvABR0i6EiJk/Y9puEBGV1pPuJAB3AZhTR1v+ZNM2f4GomN5ORCUANgCoWXl73nQceRD1GE81cg6eAfAqEV2FqCT+vsZ3HSFuciUADgPQAVjymxQkLgvJiVgkEolEXcgSv0QikagMafwSiUSiMqTxSyQSicqQxi+RSCQqo3bTOYckICCAQ0JClJYhkUgkTkVWVtYlZm5fe71TGH9ISAgyMzMb31AikUgk1RBR7c6CAGSoRyKRSFSHNH6JRCJRGdL4JRKJRGU4RYxfIqlNZWUlzp49i7KyMqWlOASenp7o3LkzPDzkIJuSxpHGL3FKzp49Cx8fH4SEhEAMZ69emBmXL1/G2bNn0bVrV6XlSJwAGeqROCVlZWXw9/dXvekDABHB399fPv1ILEYav8RpkaZ/E3kuJE1BtaGeX3/9Fb/88gt8fHzw0EMPwde3vomZJLYkMzMTer0evXr1wqhRo6DRyLKIRGJrVPkvW7p0KUJDQ/GnP/0JTz75JCIiInDixAmlZakKo9GIP/7xj4iLi8OcOXMwduxYjB8/HtevX298ZycjJCQEly5dUlpGgxw6dAg//fQTcnNzG99Y4vSozvg3bdqEadOmIT4+HqdPn4Zer8fVq1cxfvx4GSO1I//85z+xYMECPPfcc8jPz8cHH3yA5ORkzJo1S2lpilBVVaVIvgaDAU899RRCQ0MxefJkdOvWDR988IEiWtSM0WjEO++8g+DgYHTs2BF//vOfUVFRYbsMmdnhl5iYGLYGpaWl3LVrV+7ZsyeXlJRUr09OTmYA/Oqrr1olH0nDbN++nTUaDT/yyCNsNBqr18+fP58BcHJycqNpHDp0yJYSG2XhwoUcGRnJkZGRHBISwklJSbx+/XqOj4/n6Ohonjx5Ml+9epWZmYODg/nFF1/kuLg4jouL42PHjjEz8/Tp0/n555/npKQknjNnDu/YsYMTEhI4KiqKExISOCcnh5mZs7OzOS4ujiMjIzk8PJyPHj1ap6bmnJOnn36aAVTnP2HCBAbA33zzTTPPjKSpGI1Gnj59OgPgESNG8OTJkxkAjx49mquqqlqUNoBMrsNTFTd1SxZrGf8//vEPBsAZGRm/+e7+++9nX19fLioqskpekroxGo08YMAAvv3222+5+TIzl5eXc/fu3Tk0NJQNBkOD6dQ0udmzZ/PgwYOtusyePdui46moqODExET+6quveNCgQVxaWsrMzP/+9795/vz5zCyM/7XXXmNm5sWLF/PYsWOZWRj/2LFjq//cxcXFXFlZyczMqampPHHiRGZmfvbZZ3nJkiXV5+j69euNnhNLWLVqFQPgP/3pT785nrZt23JBQUGT0pM0jw8++IAB8D/+8Y/qgtDChQsZQPXvprnUZ/yqCfUUFRXh/fffx6RJkzBo0KDffP/3v/8dJSUl+OijjxRQpx7WrFmDrVu34tVXX4WPj88t32m1Wrz88ss4ePAg1q9fr5DCpjF79mwMHToUfn5+OHToEAYOHIioqCgsXrwYp0/fHB9rypQp1a/btm2rXv/AAw/Azc0NAFBcXIwHHngAYWFheP7553HwoJjqNyEhAf/617/w5ptv4vTp0/Dy8mqx7oqKCsyePRthYWF4/fXXq9d7eHjg448/xtWrVzF//vwW5yNpmLy8PMydOxejR4/Gyy+/XN0666mnnsKkSZPw+uuv48yZM9bPuK67gaMt1ijxv/baawyA9+zZU+82SUlJ3K1bt1vCDxLrMmTIEA4KCqou2damvLycAwMDedSoUQ2mo3Soh5n5yy+/5DFjxrDBYOCVK1fyQw89VOd2wcHBfOLECWYWJWp/f39mFiX+H374oXq76dOn84IFC5iZ+eTJkxwcHFz93fHjx3nBggXctWtXTktLqzOfppwTc4ly7dq1dX4/c+ZM9vT0lKV+GzNjxgzWarV8/Pjx33x36tQpvvPOO1mn0zU7fai5xG8wGPDJJ59g+PDhiIqKqne7xx57DCdOnMDmzZvtqE497N+/H5s2bcKzzz4Ld/e6WxJrtVo8/vjjSElJwYULF+ys0HKysrLwzjvvYMmSJdBoNIiPj8eWLVtw/PhxAMD169dx9OjR6u2/++676teEhIQ60ywuLsYdd9wBAFi0aFH1+hMnTqBbt274wx/+gAkTJmD//v0t0m4wGPDWW28hISEBo0aNqnObOXPmoKysDB9//HGL8pLUz5kzZ/DVV1/h6aefxp133vmb74ODg3HkyBHcfffdVs9bFcafkpKCM2fO4Mknn2xwu4kTJ6J169a3/Okk1mPhwoXw8vLCzJkzG9xuypQpMBqN+PHHH+2krOl8+OGHKCwsxJAhQxAVFYV58+Zh0aJFmDJlCiIiIhAfH4+cnJzq7cvLy9G/f38sWLAA7733Xp1pvvjii5g3bx4GDhwIg8FQvf67775DWFgYoqKikJOTg2nTprVI+/r163Hy5Ek8//zz9Xb8uuuuuzBs2DAsWrRIVAZKrI659dScOXPq3cYcBrQ6dT0GONrS0lDPfffdxx06dODy8vJGt506dSr7+/u3uDZdcivl5eXs5+fHDz/8sEXbh4eHc2JiYr3fO0Kox9Gw9JyMGTOGO3bsyBUVFQ1u9+WXXzIA3rp1qzXkSWpw9epV9vX15SlTptg0H6g11FNYWIjVq1fjkUcegVarbXT7CRMm4PLly9i6dasd1KmH5ORkXLlyBb///e8t2n7SpEnYsmULLl++bGNl6uLMmTNITk7GE0880ehInhMnToSnpyeWLFliJ3XqYfny5SgpKcEzzzyjSP4ub/wrVqxAVVUVHnzwQYu2HzVqFDw8PLBy5UobK1MXS5YsQfv27TFixAiLth89ejSYGampqTZWpi6+//57MDOmT5/e6La+vr4YNWoUVq5cKcM9Vmbx4sXo1q0bBg4cqEj+NjV+IjpFRAeIaC8RZZrWtSOiVCI6Znr1s6WGH3/8ESEhIYiNjbVoe19fXwwZMgQrVqywpSxVce3aNaxevRq/+93v6q3UrU1MTAzatWuHdevW2Viduli2bBni4uLqrEysi7Fjx+Ls2bM4cOCAjZWph9zcXGzcuBHTpk1TbHA9e5T4hzBzFDObnXcugDRm7gEgzfTZJhQVFSE1NRWTJ09u0gkeM2YMjh07dks7bEnz2bBhA8rKynD//fdbvI+bmxtGjhyJdevWwWg02lCdejh27BiysrLw0EMPWbzPmDFjAIj+FxLrsGzZMjAzHnnkEcU0KBHquRfAYtP7xQDus1VGK1asQGVlJSZPntyk/YYOHQpAjOsjaTkrV66Er69vnR3nGuKee+7BhQsXqjsySVqGuUnpAw88YPE+nTp1Qt++faXxW5Hly5cjJiYG3bp1U0yDrY2fAaQQURYRmUffup2Z8wHA9Nqhrh2JaBYRZRJR5sWLF5uV+datW9GlSxf069evSfuFhoaiffv22LhxY7PyldzEaDRi9erVGD16tEWV6zUxt1/W6/W2kKY6fvzxRwwcOBBBQUFN2m/UqFHYvn07SktLbaRMPeTn52P79u247z6blXctwtbGP5CZ+wIYDeD/iMjingjM/AkzxzJzbPv27ZuV+UcffYRdu3Y1OY6m0WgwZMgQpKWlyUqtFrJz504UFBRgwoQJTd63a9euuOOOO5CRkWEDZS2ndevWAES3+6Y+Vdqb3Nxc7Nu3r1mGk5SUBIPBgC1btthAmbpYtWoVmNm1jZ+Z80yvBQCWA+gH4AIRBQKA6bXAVvkTETp0qPOBolGGDh2KvLw8HDlyxMqq1MWqVavg5uaG0aNHN3lfIsKgQYOg1+sd+gbcqVMnh+5sBtyM0Y8bN67J+w4YMADu7u5IT0+3sir1sXz5cnTv3h2hoaGK6rCZ8RORNxH5mN8DGAkgG8BKAOa2ZNMBOGTzmSFDhgCQYYaWkpKSgvj4ePj5Na/x1qBBg5CXl4eTJ09aWZn1OHXqFMLCwgCIuYBnzJiB8PBwREdHV9cTLVq0CBMnTsSoUaPQo0cPvPjiiwDE8AmPPvoowsLCEB4eXm+v3payevVq3HnnnejVq1eT9/X29kZcXBx0Op0NlKmHq1evIi0tDffdd5/iU2XacurF2wEsNx2gO4ClzLyOiHYB+J6IHgdwBoDlNU12pEePHvD398e2bdvwxBNPKC3HKSksLERWVhZefvnlZqdhrhDW6/X1V4b98Y/A3r3NzqNOoqKA999v8m7//e9/AQAHDhxATk4ORo4cWT1mz969e7Fnzx7cdttt6NWrF5577jkUFBTg3LlzyM7OBiBaolmb69evIy0tDbNmzWq24SQlJeHtt99GaWlpdYhL0jQ2bdqEysrK6pZSSmKzEj8zn2DmSNMSysyvm9ZfZuZhzNzD9FpoKw0tgYiQkJBwyxC6kqaxadMmMDOGDx/e7DRCQ0PRpk0bp7kOmzdvrm6m17t3bwQHB1cb/7Bhw9CmTRt4enqiT58+OH36NLp164YTJ07gueeew7p162wy9/OmTZtQVlbWrDCPmcGDB6OqqspproMjkpKSAm9vbwwYMEBpKeqdbN0SEhISsHr1ahQWFqJdu3ZKy3E6NmzYgNatWze5VVVNNBoN4uLisHPnzvo3akbJ3FY0VBdx2223Vb93c3NDVVUV/Pz8sG/fPqxfvx7//e9/8f333+OLL76wqqa1a9eidevWLRrlsX///gCAHTt2WNz7WnIrKSkpSEpKuuV3oBQuP2RDSzDfmbdv366wEudkw4YNSEpKanRMmMaIi4vDgQMHcOPGDSspsx133303vvnmGwDA0aNHcebMmQbj6pcuXYLRaMSkSZPwz3/+E7t377a6pk2bNmHQoEEtMpy2bduid+/e2LFjhxWVqYeTJ0/i2LFjGDlypNJSAEjjb5C4uDi4ubnJx9tmcOrUKRw/frxFYR4z/fr1Q1VVFfZaO45vA5555hkYDAaEh4fjwQcfxKJFixo03HPnziEpKQlRUVF49NFH8cYbb1hVT0FBAQ4fPozBgwe3OK3+/ftjx44dDt3CylExjznlKMYvQz0N4O3tjYiICGn8zSAtLQ0ArGb8gOgTUN8kJkpg7tAUEhJSXTnr6elZ53wOjz76KB599NHqz6tXr65+b4tSvhlzHwhrGH98fDwWL16MU6dOoWvXri1OT02kpKQgKCioWa2qbIEs8TdC//79kZmZKUs5TWTDhg3o2LEj+vTp0+K0OnXqhDvuuKPhOL+kTnQ6Hby9vRETE9PitGrG+SWWU1VVhbS0NIwcOVLxZpxmpPE3QkxMDIqLi/Hrr78qLcVpYGbodDokJSVZ7YceFxeHXbt2WSUtNaHT6TBgwIAW17MAQHh4OLy8vKTxN5HMzEwUFRU5TJgHkMbfKOaSUlZWlsJKnIcTJ04gPz/fqnOF9uvXD8eOHUNh4c3Wv/Ip7CZ1nYvCwkIcOHDAKmEeAHB3d0dMTIw0/iZiHvPLPPijIyCNvxFCQ0Oh1Wql8TcBc2/npo7G2RDm+RT27NkDQMTSL1++LM0fwvQvX74MT0/PW9abr4O1jB8QN+Ddu3ejqqrKamm6OjqdDmFhYQgICFBaSjWycrcRtFotIiIipPE3Ab1eDz8/P6vE981ERUUBEL1fhw0bhs6dO+Ps2bNo7sitroanpyc6d+58yzqdTgdPT0/ExcVZLZ++ffuivLwcOTk51cNUSOqnqqoKW7ZssWjGM3sijd8CYmJi8N1334GZHaZyxpHR6/VITEyERmO9B8r27dvjjjvuqC7xe3h4yJYljaDT6RAfH2/VDkPR0dEAREskafyNs2fPHly7ds2qT13WQIZ6LCAmJgZFRUU4ceKE0lIcnvPnz+PYsWNWDfOYiY6Odoq2/I5AcXEx9u7da3XD6dWrF7y8vKpvwJKGMQ9sZ4v/Q0uQxm8BsoLXcsxxZWtW7JqJiopCTk6OU/TgVZrNmzfDaDRa3fjd3NwQGRkpjd9CMjIy0KNHDwQGBiot5Rak8VtAWFiYrOC1EL1ej1atWqFv375WTzsqKgoGg6G6s5SkfnQ6HbRaLeLj462ednR0NPbs2SPnQm4Eo9EIvV7vcGEeQBq/RWi1WoSFhclSjgXo9XrEx8dbpd14bczxZRnuaRydTod+/frBy8vL6mlHR0ejpKTEoedIcAQOHDiAoqIimzz9thRp/BYSGRmJ/fv3Ky3DoSkuLsa+fftsFs8MCQmBr6+vvAE3wtWrV5GVlWWzkqb5BiyvQ8OYh8uQxu/ERERE4MKFC7hw4YLSUhyWrVu3gpltZvwajQZRUVGyxN8IW7duhcFgsJnxh4WFwd3d3aZjDLkCGRkZCA4ORnBwsNJSfoM0fguJiIgAAFnqbwC9Xg93d3ebxJXNREVFYf/+/TAYDDbLw9nR6XRwd3e32YQf5olkZIm/fpgZGRkZDlnaB6TxW4w0/sbR6/WIiYmBt7e3zfKIiorCtWvXcPz4cZvl4ezodDrExsba9DqYK3gldXPkyBEUFBRI43d2AgIC0KlTJ2n89VBWVoadO3favL2yrOBtmOvXr2PXrl02b0liDn0WFBTYNB9nxZrDYdsCafxNICIiAvv27VNahkOyc+dOVFRU2Nz4+/TpA3d3d2n89bB9+3ZUVlbavKRpfgI+cOCATfNxVjIyMtCxY0d0795daSl1Io2/CURGRuLQoUOorKxUWorDYe64NXDgQJvmo9Vq0bt3b2k49aDT6aDRaJCYmGjTfMLDwwFI468L87Dkd999t8MO8SKNvwlERESgsrISOTk5SktxOPR6PUJDQ+Hv72/zvMLDw6Xh1INOp0N0dDR8fX1tms/tt9+ODh06yNBnHZw6dQpnz5512Pg+II2/ScgK3roxGAzYunWr3cYjiYiIwJkzZ1BUVGSX/JyFsrIybN++3W5xZXkDrhtHj+8D0vibRK9evaDVaqXx12Lfvn24evWq3Uo45jCDHLrhVnbu3Iny8nK7GU5ERASys7Nl09pa6HQ6tGvXzqrDklsbafxNwMPDA3369JEVvLWwxcQrDSErFutGp9OBiOx2HcLDw1FWVianJa1FRkYGBg0aZNVhya2N4ypzUCIiImSJvxZ6vR4hISG/mQjEVnTu3Blt2rSR16EWOp0OERER8PPzs0t+MvT5W86dO4dff/3VocM8gDT+JhMZGYn8/Hw585MJcw9Fe443TkQyvlyLiooKbN261a6G06dPH2g0GnkdauDI4/PURBp/E5HN2G7l6NGjuHjxot0nmoiIiMCBAwfknLsmMjMzcePGDbsav5eXF3r06CFL/DXIyMiAj48PIiMjlZbSINL4m4h8vL0Ve8f3zYSHh6OkpARnzpyxa76OilIzPcknr1vJyMhAYmIi3N0de1ZbafxNxNx+Wf7YBXq9Hu3bt0evXr3smq+8Ad+KTqdDnz590L59e7vmGxERgV9//RWlpaV2zdcRuXjxIg4dOuTwYR5AGn+zCA8Pl4ZjQq/XY9CgQXbvoWie6FvegIGqqips2bJFkQpFc+jz4MGDds/b0bDltKPWxubGT0RuRLSHiFabPrcjolQiOmZ6tU8TBCsSERGBgwcPqr798rlz53Dy5ElFJpL29fVFSEiINH4Au3fvRmlpqSLGL5vW3iQjIwNeXl6IjY1VWkqj2KPEPxvA4Rqf5wJIY+YeANJMn52K8PBw3LhxQ/Xtl5WK75uRT14CJXuKhoSEwNvbW14HiHBbQkICtFqt0lIaxabGT0SdAYwF8FmN1fcCWGx6vxjAfbbUYAtkKUeQkZGB1q1bK9aCITw8HEeOHEF5ebki+TsKOp0OPXv2RMeOHe2et0ajkRW8AIqKirBv3z6nCPMAti/xvw/gRQDGGutuZ+Z8ADC9dqhrRyKaRUSZRJTpaG3mze2X1V7K0ev1GDhwoGItGCIiImAwGHD48OHGN3ZRDAYD9Hq9oh2GzE9eam5au2XLFjCzw3fcMmMz4yeicQAKmDmrOfsz8yfMHMvMsfZuqdAYsv0yUFhYiOzsbMXCPIDsUwGIVk3FxcWKGk5ERAQKCwuRn5+vmAal0el08PDwQP/+/ZWWYhG2LPEPBDCBiE4BWAZgKBEtAXCBiAIBwPTqlFP4qP3xdvPmzQCUbcHQs2dPaLVaVV8Hc/t9Ja+DbForwp79+vWDl5eX0lIswmbGz8zzmLkzM4cAeAjARmb+PYCVAKabNpsOYIWtNNgStbdf1uv10Gq1iIuLU0yDu7s7+vTpo2rD0el06Nq1K4KCghTTYH7yUut1KC0tRWZmptOEeQBl2vH/G8AIIjoGYITps9NhLuWotf2yuYTj6empqA41P3kZjUZkZGQobjh+fn7o3Lmzao1/69atMBgMil+HpmAX42fmdGYeZ3p/mZmHMXMP02uhPTRYGzWXcq5du4bdu3c7RAuGiIgI5OXl4fLly0pLsTsHDx5EYWGhQxiOeewkNaLT6eDm5oYBAwYoLcViZM/dZhISEoLWrVur8se+fft2VFVVKVqxa0bNFbzm+L4jGH94eDgOHz6MiooKpaXYnYyMDMTExKB169ZKS7EYafzNRKPRICwsTJUl/oyMDGg0Goco4ai5YlGn0yEoKAghISFKS6mej/rIkSNKS7ErN27cwM6dOx3i5tsUpPG3APOkLGprv6zX6xEVFWXzCb0toWPHjvD391ddiZ+ZodPpMHjwYLuPk1QXau3UuH37dlRUVEjjVxPh4eG4cuUK8vLylJZiNyoqKrBt2zaHCPMAYlIWNcaXDx8+jIsXL2LIkCFKSwEg5qP28PBQ3ZOXebrLxMREpaU0CWn8LUCNYYasrCyUlZU5jPED4gacnZ0No9HY+MYuwqZNmwAASUlJygox4eHhgbvuuktV/wVAhD2joqLQpk0bpaU0CWn8LUCNFYtKD8xWF+Hh4bh27RpOnjyptBS7kZ6ejqCgIHTt2lVpKdWobT7q8vJybNu2zenCPIA0/hahxvbLGRkZ6NWrFzp0qHOIJUVQ25MXMyM9PR1DhgxxiPi+mYiICJw7dw6FhU7ZQrvJ7Nq1C2VlZdL41Yia4ssGgwGbN292qNI+AISGhoKIVGP8Bw8exKVLlxwmzGNGbU/A5uGwHe3/YAnS+FuImtovZ2dno7i42OF+6N7e3ujRowf27duntBS7kJ6eDsBx4vtm1PbkpdPpEBYWBn9/f6WlNBlp/C1ETe2XHdVwACAqKgp79+5VWoZdSE9PR5cuXRyi/X5NAgMD4e/vrwrjr6ysVGy6S2sgjb+FqOnxduPGjejWrRu6dOmitJTfEBUVhZMnT6K4uFhpKTbFaDRCp9M5XHwfEE1r1TJ2UlZWFq5duyaNX62opf2ywWCATqfD0KFDlZZSJ1FRUQBcP8zgqPF9M+Y6L1dvWpuWlgbAMZ9+LYuV7CcAACAASURBVEEafwvRarXo3bu3y5dy9u7di+LiYofpMFQbs/G7erjHkcNtgDD+69ev48SJE0pLsSlpaWmIjIyEo00SZSnS+K2AGtovmzsMOarxd+zYEe3bt1eF8YeEhDhcfN+MGoZuuHHjBrZu3Yphw4YpLaXZSOO3AuHh4Th79iyuXLmitBSbsXHjRvTu3RuBgYFKS6kTInL5Cl5zfN9RS/uAOprWbtmyBeXl5eowfiJyI6JORNTFvNhSmDPh6qWcyspK6PV6hy3tm4mKikJ2djYqKyuVlmIT9u7di8uXLztsPQsAtGrVCt27d3dp49+4cSPc3d0dYj6K5mKR8RPRcwAuAEgFsMa0rLahLqfC1dsvZ2VlobS01CmMv6KiAjk5OUpLsQmpqakAgOHDhyuspGFcPfSZlpaG/v37O9X4+7WxtMQ/G0AvZg5l5nDTEmFLYc5Ep06d4Ofn57IlfkcbEKw+zBW8rtqRKzU1FeHh4Q4bbjMTHh7usvNRFxUVITMz06nDPIDlxp8LwLUbSLcA89DArlrK2bhxI8LDwx2+BUPPnj3h6enpknH+69evQ6/XY8SIEUpLaZTo6Ggws0vegHU6HYxGo2qM/wSAdCKaR0RzzIsthTkbrjo0cEVFBbZs2eLwYR4AcHd3R3h4uEsav16vR0VFhVMYf0xMDABg9+7dCiuxPmlpaWjVqhXi4+OVltIiLDX+MxDxfS0AnxqLxERERARKS0tx6tQppaVYla1bt+LGjRsOXaFYE3PLHlebFS01NRVardYpKhQ7deqEDh06ICsrS2kpVictLQ2DBg2CVqtVWkqLcLdkI2aeDwBE5CM+susF71qIeeiG/fv3o1u3bgqrsR7r16+Hu7u7U5T4AWH8n376Kc6dO4fOnTsrLcdqpKamIjExEa1atVJaSqMQEWJiYlzO+PPy8nDo0CE8+uijSktpMZa26gkjoj0AsgEcJKIsIgq1rTTnIiwsDETkcnHNlJQUDBgwwCHm17WEyMhIAK7Vg/f8+fPYv38/Ro4cqbQUi4mJicGhQ4dw/fp1paVYjXXr1gEA7rnnHoWVtBxLQz2fAJjDzMHMHAzgBQCf2k6W89G6dWv06tXLpUo5BQUF2L17t1MZjrlprSsZ/4YNGwDAKeL7Zvr27Quj0ehSDR7WrVuHTp06VT/dOzOWGr83M28yf2DmdADeNlHkxMTGxiIzM1NpGVbD3G7cmUo4Pj4+6NWrl8tdh4CAgOrmqs6Aq1XwVlVVITU1FaNGjXK4UVGbg8WteojoJSIKMS1/B6CeCU4tJDY2Fvn5+cjLy1NailVISUmBv78/oqOjlZbSJOLi4rBr1y6lZVgFo9GIdevWYcSIEdBonGeElaCgIAQEBLjME/D27dtRVFSE0aNHKy3FKlj6S3oMQHsAPwNYbno/w1ainJXY2FgAcIkfOzMjJSUFI0aMgJubm9JymkRcXBzy8vJc4gacmZmJgoICjBs3TmkpTYKI0LdvX5f4LwAizOPm5ubwvaYtxSLjZ+YrzPwHZu7LzNHMPJuZXXdEsmYSFRUFjUbjEmGG/fv34/z5804V5jETFxcHAC5R6l+zZg00Gg1GjRqltJQmExMTg4MHD6KsrExpKS0mOTkZCQkJaNu2rdJSrEKDxk9E75teVxHRytqLfSQ6D97e3ujTp49LGH9KSgoA56pQNBMVFQV3d3eXMP7Vq1cjISEB7dq1U1pKk4mJiUFVVZXTD2Vy/vx57N692ylvvvXRWDv+r02v79haiKsQGxuLtWvXgpmduhJo3bp1CAsLwx133KG0lCbj5eWFsLAwpzf+vLw87N69G2+88YbSUpqFuYI3Kyur+inMGTEXglwlvg80UuJnZnOALoqZdTUXAM7TxMCOxMbGoqCgAOfOnVNaSrMpKipCRkaG08WVa2Ku4HXmHrxr164FAIwdO1ZhJc0jODgY/v7+2Llzp9JSWsTatWvRoUMHp2pV1RiWVu5Or2Pdow3tQESeRLSTiPYR0UEiMvf+bUdEqUR0zPTq10TNDo25gteZwz3r1q1DVVUVxo8fr7SUZhMXF4crV67g119/VVpKs1mzZg2CgoIQFhamtJRmQUSIj4/H9u3blZbSbCoqKpCcnIxx48Y5Vauqxmgsxj+FiFYB6Forvr8JwOVG0i4HMJSZIyGeDkYRUTyAuQDSmLkHgDTTZ5chIiIC7u7uTm38q1atQkBAAPr376+0lGbj7BW85eXlSE1Nxbhx45w6ZJiQkIDDhw877ex06enpKCkpwb333qu0FKvS2C1sK4D/AMgxvZqXFwA0WNPBAvOYPh6mhQHcC2Cxaf1iAPc1S7mD4uzx5aqqKiQnJ2Ps2LFO14yzJqGhofD09HTa65Ceno5r1645bZjHjHkUS2cN96xYsQKtWrVyykYODdFYjP80M6czc0KtGP9uZq5qLHHTdI17ARQASGXmHQBuZ+Z8U/r5ADrUs+8sIsokosyLFy82/cgUpH///tixY4dTDtG8ZcsWXLlyBRMmTFBaSovw8PBAdHS00xrOL7/8Am9vb6cZFbU++vXrByLCtm3blJbSZJgZK1aswD333AMvLy+l5VgVSwdpiyeiXURUSkQVRGQgopLG9mNmAzNHAegMoB8RWRysZOZPmDmWmWMdfQKQ2gwYMADFxcU4dOiQ0lKazKpVq6DVap1qfJ76iI+PR1ZWFsrLy5WW0iQMBgOWL1+OMWPGOL3h+Pj4ICwszCnj/FlZWTh37pzLhXkAyyt3PwQwBcAxAF4AZgL4f5ZmwsxFANIhwkMXiCgQAEyvBU3Q6xQMGDAAgBjL3tlYuXIlhgwZ4tTziZpJTExEWVmZ040Xs23bNly4cAETJ05UWopVSEhIcMon4BUrVkCj0Th167b6sLiampmPA3AzleK/BNDgAO1E1J6I2preewEYDlFXsBI3WwlNB7CiOcIdmTvvvBPt27d3OuPPycnBsWPHnLo1T00GDhwIANi8ebPCSprGzz//DK1WizFjxigtxSrEx8ejqKgIR44cUVpKk/jll18waNAg+Pv7Ky3F6lhq/NeJSAtgLxG9RUTPo/HROQMBbCKi/QB2QcT4VwP4N4ARRHQMwAjTZ5eCiDBw4ECnM/4ffvgBAHDffa5R33777beje/fu2LJli9JSLIaZ8fPPP2PkyJFOMwdCY5greJ0pzn/8+HFkZ2e7ZJgHsNz4HwHgBuBZANcABAGY1NAOzLzfNK5PBDOHMfOrpvWXmXkYM/cwvRa25AAclQEDBuDYsWNwporpH374AQMHDnTK3rr1kZiYiM2bNztNR649e/bg9OnTLhPmAYBevXqhXbt2TvXk9d133wEAJk+erLAS22DpIG2nmfkGM5cw83xmnmMK/UjqwRznd5ZSzpEjR3DgwAE88MADSkuxKomJibh8+bLThBl+/vlnuLm5uUy4DQA0Gg0GDx6M9PR0paVYzLJlyzBw4EAEBQUpLcUmNNaB6wAR7a9vsZdIZyQmJgYeHh5OE2Ywh3kmTWrwQc7pSExMBACnuA7MjB9++AGDBw9GQECA0nKsSlJSEk6ePInTp08rLaVRDh06hOzsbDz00ENKS7EZjZX4xwEY38AiqQdPT0/ExMQ4zePtDz/8gAEDBrjUBOUA0LNnTwQEBDjFdcjKysLRo0cxZcoUpaVYnaSkJACATqdTVogFfPfdd9BoNC4b5gEs68BV72Ivkc7KkCFDsHPnTpSWlja+sYIcPXoU+/fvd7kwDyAq2hMTE50izLB06VJotVqXe+oCgLCwMLRr187hrwMzY9myZUhKSkLHjh2VlmMzLO3AdZWISkxLmaUduNTO0KFDUVVV5fClTXNFlisaDgAMGzYMp06dwokTJ5SWUi8GgwHLli3DmDFj4OfnUuMWAnCeOP++fftw9OhRPPjgg0pLsSmWVu76MLOvafGEaNHzoW2lOT8DBgyAh4cHNm7cqLSUemFmfPXVV0hKSnLZiizzdHlpaWkKK6mf9PR05OfnY+rUqUpLsRnOEOdfsmQJ3N3dXapVVV00a5xRZv4FgHMPImIHWrVqhYSEBIc2/u3bt+P48eOYNm2a0lJsRq9evdCpUyds2LBBaSn1snTpUvj4+Dj9oGwNMWSI6PPpqP+HyspKfP311xg/frzLVa7XxtJQz8Qay2Qi+jfESJuSRhg6dCj27NnjsMPSfv311/Dy8nLZMA8g4vzDhw9HWlqaQw4bcOPGDfz000+YNGmS04/N0xBhYWEIDAxEcnKy0lLqJDk5GQUFBZgxY4bSUmyOpSX+mi157gFwFWJ4ZUkjDB06FEajERkZGUpL+Q3l5eVYtmwZ7r//fpfpJVofw4cPx+XLl7Fv3z6lpfyGn3/+GcXFxXjkkUeUlmJTiAijRo1CamoqqqoaHdzX7ixatAgdOnRwqbl168PSGP+MGssTzPw6M7vc4Gq2oH///mjVqhVSU1OVlvIb1qxZgytXrrh0mMfMsGHDAMAhwz2ffvop7rzzzuomj67M6NGjUVRUhB07digt5RYuXryIVatW4ZFHHoGHh4fScmyOpaGebkS0ioguElEBEa0gom62FucKaLVaDB06tHoCdkdi0aJF6NixY7UpujKdOnVCaGho9Ty2jsLRo0eh0+kwc+ZMl5rarz6GDx8OjUbjcOGepUuXoqqqCo8++qjSUuyCpb+0pQC+hxh4rROAHwB8aytRrsbYsWNx8uRJ5OTkKC2lmtzcXKxZswYzZsyAu7u70nLswoQJE6DX6x2qvuXzzz+Hm5sbpk+va1pr18PPzw8JCQlYt26d0lKqYWZ88skniI2Nddr5jZuKpcZPzPw1M1eZliWQlbsWY26psXr1aoWV3OSzzz4DM2PWrFlKS7EbEyZMgMFgcBjTqaysxKJFizBu3DgEBgYqLcdujBkzBllZWTh79qzSUgCIprSHDh3C//3f/yktxW5YavybiGguEYUQUTARvQhgDRG1I6J2thToCgQFBSEiIgJr1qxRWgoAYTiffvopRo8ejZCQEKXl2I1+/fqhQ4cOWLlypdJSAIhK3YKCAjzxxBNKS7Er5hZkP//8s8JKBB9++CH8/f1dvtNWTSw1/gcBPAlgE8RMWk8DeAxAFoBMmyhzMcaNG4fNmzejqKhIaSlYtWoV8vPz8dRTTyktxa5oNBqMHz8eycnJqKioUFoO3n//fXTv3h2jR49WWopd6dWrF8LCwvDTTz8pLQW5ublYsWIFHn/8cZduSlsbS1v1dG1gkZW8FjB+/HgYDAaHCPcsXLgQQUFBLjPDU1OYMGECiouLFR86YPv27di+fTtmz56tikrd2kyaNAl6vR7nz59XVMfHH38Mo9GIp59+WlEd9sbSVj0eRPQHIvrRtDxLRK7f5smK9OvXD0FBQdXj4ijF/v37sWHDBjz99NNwc3NTVIsSjBgxAj4+Pvj2W2XbJixYsABt2rRRTSuS2kyePBnMjF9++UUxDdeuXcPHH3+M8ePHqyrkCVge6lkIIAbA/0xLjGmdxEI0Gg1+97vfYf369Yq2KnnnnXfg7e2tujCPGXMv5Z9++gk3btxQRMPZs2fx448/YubMmS4xqX1zCA0NRe/evbF06VLFNHz++ee4dOkSXnzxRcU0KIWlxh/HzNOZeaNpmQEgzpbCXJEHH3wQlZWVWL58uSL55+bm4ttvv8XMmTNdcgRIS5k6dSquXr2qWNjtP//5D5gZzz77rCL5OwJEhGnTpkGv1+P4cftP5ldRUYF33nkHiYmJGDhwoN3zVxpLjd9ARHeaP5g6bxlsI8l1iY2NRbdu3RQL9yxYsADMjD/+8Y+K5O8oDBkyBIGBgfjmm2/snvf58+fx0UcfYdq0aaoLL9Rm2rRp0Gg0WLRokd3zXrp0KXJzczFv3jy75+0QMHOjC4BhAM5AtOhJB3AKwBBL9rXGEhMTw67C3/72N9ZoNJybm2vXfAsKCtjb25unTJli13wdlTlz5rCHhwefP3/ervm+8MILrNFo+NixY3bN11EZPXo0d+7cmauqquyWZ2VlJffs2ZMjIiLYaDTaLV8lAJDJdXiqpSX+LQA+BmA0LR8DcI5ZxB2Mxx57DEajEV988YVd833zzTdx48YNvPTSS3bN11GZNWsWKisr8dlnn9ktz4KCAixcuBBTp05F9+7d7ZavIzNjxgycPXsWKSkpdsvzyy+/xNGjR/Hqq6+CiOyWr0NR192g9gIxXMNnAIaYlk8A/GDJvtZYXKnEz8w8YsQI7tKli91KOXl5eezp6cmPPPKIXfJzFoYPH86dO3fmyspKu+T37LPPspubG+fk5NglP2egvLycAwMD+Z577rFLftevX+dOnTpxQkKCy5f2mesv8Vtq/PssWWerxdWM//vvv2cAvGbNGrvkZzac48eP2yU/Z2H58uUMgH/66Seb55WTk8Pu7u781FNP2TwvZ+O1115jAHzgwAGb5/Xmm28yANbpdDbPyxFoqfEvAhBf43N/AP+zZF9rLK5m/OZSzrBhw2ye16FDh9jd3Z1nzZpl87ycjcrKSu7atSvHxcXZvPR37733cuvWre1ep+AMXLx4kb28vPjxxx+3aT55eXns6+vLY8aMsWk+jkRLjf8wRGz/lGkxAjgI4ACA/Zak0ZLF1Yyf+WbJIzMz02Z5GI1GHjlyJLdp04YvXLhgs3ycmU8//ZQB8Nq1a22Wx7p16xgAv/766zbLw9l56qmn+LbbbrNpo4epU6eyVqvlo0eP2iwPR6Olxh/c0GJJGi1ZXNH4i4qK2NfXlx944AGb5bFixQoGwO+9957N8nB2ysvLOTg4mPv372+TUn9paSmHhIRw7969uayszOrpuwonT55kDw8Pmz2Zbtq0iQHwSy+9ZJP0HZUWGb/SiysaPzPzvHnzmIh47969Vk+7qKiIO3fuzH369OGKigqrp+9KmEv9y5Yts3rac+bMYQCs1+utnrarYa6LsnZT15KSEu7WrRt369aNr1+/btW0HR1p/A5IYWEh+/n58ciRI62e9mOPPcYajYZ37Nhh9bRdjaqqKo6OjubOnTtzaWmp1dJNS0tjIpIVuhaSn5/PrVq14gkTJlj16evxxx9njUajypuvNH4H5d1332UAnJycbLU0V61axQB47ty5VkvT1dm8eTMD4BdeeMEq6V24cIE7duzIvXv3turNxNV5++23rdrS6ttvv2UAPG/ePKuk52zY3fgBBEGM33/YVBE827S+HYBUAMdMr36NpeXKxl9WVsY9e/bk4OBgLikpaXF6v/76K7dt25YjIyNlTLmJPPnkk0xEvGnTphalU1ZWxoMHD+bbbruN9+3bZx1xKqGyspKjoqI4MDCQL1682KK0srKy2MvLixMTE7m8vNxKCp0LJYw/EEBf03sfAEcB9AHwFoC5pvVzAbzZWFqubPzMorRJRPz000+3KJ2rV69yZGQkt23bVrbZbwalpaXco0cPDgoKanYrKKPRyFOnTmUA/M0331hZoTrYvXs3a7VaHjlyZLM7OZ48eZI7d+7MQUFBqm5Cq3ioB8AKACMAHAEQyDdvDkca29fVjZ9ZjOECgJcuXdqs/cvKynj48OGs0Wjs1jHMFcnMzGQvLy+Oj49vckVgVVUVz5o1SzbdtAIff/wxA+DZs2c3Od5/5swZ7tq1K7dt29YmDSecCUWNH0AIxCBvvgCKan13pbH91WD85eXlPGjQIPb09OTNmzc3ad9r167xuHHjGAB/+eWXthGoIn788UcGwMOHD+erV69atM/Vq1f5gQceqI4nq2E4AFtiNBr5D3/4AwPgv/zlL2wwGCzab9euXRwYGMi+vr68c+dOG6t0fBQzfgCtIebmnWj6bJHxA5gFMZ9vZpcuXWx5bhyGgoIC7tGjB3t7e3NaWppF+5w9e5bj4+OZiHjhwoU2VqgeFi1axG5ubhwZGckHDx5scNsdO3bwXXfdxRqNht966y07KXR9DAYDP/nkkwyA77///gbDbxUVFfzGG2+wVqvl4OBguwz/4AwoYvwAPACsBzCnxjoZ6mmAvLw87tOnD7u5ufH8+fPrraCtqqriL774gv38/LhVq1b8888/21mp67N27VoOCAhgrVbLzzzzDGdmZlaXPEtLS3n9+vU8efJkBsCBgYG8YcMGhRW7Hkajkd977z12d3fnNm3a8N/+9jfes2cPV1RUcEVFBR88eJDfeustDg4OZgA8ceJELigoUFq2w6BE5S4B+ArA+7XWv12rcvetxtJSk/EzMxcXF/PDDz/MADgoKIhfeuklTklJ4d27d3Nqaiq/8sor3L17dwbA8fHxquqCbm/Onz/PM2fOZA8PDwbAHh4e7OfnxxqNhgGwn58f//Wvf7VKiyxJ/Rw+fJgnTJhQfd5rLwMGDOC1a9fKEFst6jN+Et9ZHyJKBKCHGM/HaFr9VwA7IIZ57gIR93+AmQsbSis2NpYzMzNtotORSUtLw7/+9S+kp6fDaDTe8t3gwYPx7LPPYtKkSeodU9yOXLp0CcnJyTh48CBKS0sREBCAuLg4DB06FF5eXkrLUw3nzp1DRkYGjh8/DqPRiODgYCQlJal+NrP6IKIsZo79zXpbGb81Uavxm7l06RKys7Nx5coVtGnTBhEREQgICFBalkQicXDqM353JcRImkZAQACSkpKUliGRSFwES6delEgkEomLII1fIpFIVIY0folEIlEZ0vglEolEZUjjl0gkEpUhjV8ikUhUhjR+iUQiURnS+CUSiURlSOOXSCQSlSGNXyKRSFSGNH6JRCJRGdL4JRKJRGVI45dIJBKVIY1fIpFIVIY0folEIlEZ0vglEolEZUjjl0gkEpUhjV8ikUhUhjR+iUQiURnS+CUSiURlSOOXSCQSlSGNXyKRSFSGNH6JRCJRGdL4JRKJRGVI45dIJBKVIY1fIpFIVIY0folEIlEZ0vglEolEZUjjl0gkEpXhrrQAl6C4GDh5Erh2DfD3B0JCAE9PpVWpj8JC4MIFgAi4/XbAz09pReqEGbhxA9BqAXdpMY6IzUr8RPQFERUQUXaNde2IKJWIjplenfefeeUK8O67QHS0MJjoaCAxEbjrLqBNG+Duu4GFC4GiIqWVujaHDwMvvADceae46fbpI65Bu3ZA167AE08AGRnCjCS24+JF4O23gcGDAR8fwNsb8PAAOnQAxo8HPv5Y/hccCGIb/SGI6G4ApQC+YuYw07q3ABQy87+JaC4AP2b+S2NpxcbGcmZmpk10NpmqKuB//wPmzxclzP79gbFjgdBQ8WO/dAnYtw9ITgays8WfYM4csfj6Kq3edTh/Hpg3D1i8WJQqR40SN96gIGHy584BO3YA69cDpaXixjx/PjBunHgikFiHkhLg9deB998HKiqAvn2BgQOBTp3E51OngM2bgWPHxFPwk08Cc+cCHTsqrVwVEFEWM8f+5gtmttkCIARAdo3PRwAEmt4HAjhiSToxMTHsEOTmMt99NzPAPHw4c1ZW/dsajcy7djFPnCi279SJecUK+2l1ZdasYQ4IYNZqmf/8Z+YLF+rftrSU+fPPmbt1E9fhnnuYT5ywn1ZXZssW5qAgcV6nT2c+dKju7YxG8V957DFmNzfmVq2Y332XuarKrnLVCIBMrsub61ppraUO4y+q9f2VBvadBSATQGaXLl1seGosZMsWZn9/Zm9v5q++Ej9mS9mxgzkiQpzuqVOZS0psp9OVMRqZ335bnMeIiPqNpi4qKpg/+IC5dWtmLy/mhQubdg0lt/L//p8w8W7dmLdts3y/Y8eYx44V1zAujvnIEdtplDif8ddcFC/x//ILs6cnc48ezf+hlpczv/IKs0bD3LMn8/791tXo6hiNzM8/L36yv/sd840bzUvnzBnmkSNFOg8+yFxcbF2dro7RyDxvnjh/EyYwFxU1L41ly0RBqnVr5m++sb5OCTM7jvE7X6hn1SpRsomLYy4oaHl66enMHTuKUueSJS1PTy3MnSt+rn/4A7PB0LK0DAbmN94Q17VHj6Y9OagZo5H5uefEdZg1q+Whmtxc5oEDRXpPPMFcVmYdnZJqHMX43wYw1/R+LoC3LElHMePfvl0YdEyMdcMz+fnMgweL0//Xv7bcyFyd//5XnKsnn7RueCYjg7lDB2ZfX+bkZOul66q89pq4Ds8/b73rUFl586Y+YADz+fPWSVfCzAoYP4BvAeQDqARwFsDjAPwBpAE4ZnptZ0laihj/kSOiArFbN9v8GMvLRSkHEBXApaXWz8MVWL6cmYh5/HhhEtbm9GnmyEgRgnvvPRn3r4/PPhO/1d//3jYFle+/F4Wszp0bbjQhaRKKlPittdjd+M+fZ+7aVRj/0aO2y8doFGaj0TBHR4tHX8lNtmwRdSv9+zNfu2a7fK5eZb7/fvF3mDlT3JQlN1m5UvxG77lHVJLbit27RSshLy9RByBpMdL4LaWkhLlvX9HkbMcO++S5ejWzj4+I/dsrT0cnJ4e5XTvm7t2tU7fSGAYD89/+Jv4SgwbZJ09nwHzzjYsTN0hbc/78zbj/3/4mw6AtRBq/JVRUiBYfbm7CjO3JgQPMISHiT/btt/bN29HIzxfnokMH5uPH7Zv30qXiGgQHM+/da9+8HY2DB5n9/EQFuD1vhOXl4snL3HJItrxqNvUZvxykzQwzMHMmkJIiupePHWvf/MPCgJ07gbg4YMoU4B//AIxG+2pwBK5eFee+oABYvVoMxWBPpkwRQzxUVooeqMuX2zd/R+HsWeCee4DbbhO9n9u3t1/eWi3wySfABx8Aa9YACQnAr7/aL39H4sIF26Rb193A0Ra7lPjNbZPnz7d9Xg1RXi56OALMkyapq9K3okLEkZV44qpNXh5zv37iOrz6qroqfQsLmUNDRWunPXuU1bJhgwj5+fmJ92oiNVXUd7TgvwAZ6mmADz/k6rbEjvAHNxqZ//Mf0ZpFLZW+RqPo9g8wf/qp0moEN26IViwA8wMP2LaC2VEoLRXNKrVa5k2b4tp7mwAADN9JREFUlFYjOH5c3Ijc3JgXLHCM/6it2bVLdG4LD29eJzkT0vjrY9ky2zYXbAlr1tys9M3IUFqNbfnLXxzjias2RiPzm2+K30hkpG1beSlNeTnzqFGiBc+PPyqt5lZKSkS8H2CeMcO1b8KHD4sWhSEhzOfOtSgpafx1sW4ds4eHaMVx/bpt8mgp2dmiZYubm+ht6oqtHN5/X/wUn3rKcUtza9aIkEPr1q5Z+W4wME+Z4lhPXLUxGJhfekloDA0Vlc+uRm6uaNLaoYMY16iFSOOvzZYtoslmVFSLHqXsQnGxGFcGECWyixeVVmQ9Fi/m6k5sjj5a45kzIgxiHrLAUQsLTcVgEMcDMP/730qraZz164UxenmJjmWOWlhoKmfPinG8fH1FnwYrII2/JjqdKLn16OE8XcSNRub//U/EXjt1co0hBhYvFiGUYcOaP+iavamouBmWuusu5+93UVUlQifm4UOchbw88bsx1784e7+L06eZ77xThHY3b7ZastL4zZhryu+6S/x4nI3du5n79BGX7vHHHf9ppT6+/FKY/vDhzhmvXb9eDC+g0YgbgbPcuGpSXs788MPit/TKK85Xcq6qYv7Xv0S4NiBA1Nc52zEwi8rrrl1FSb8pQ1xbgDR+ZjGOvlYrxnJvaPIOR+fGDWE2Go2IB65c6Tw/eKOR+fXXuXoyG2c0fTNFRTc7GvXuLQoVzkJhIfOQIUL7G28oraZlZGeLnsUA8333MZ86pbQiy9myRdy02rVj3rnT6smr2/gNBvEYC4gf++XLLUvPUdi2TTy5AMyjRzt+i5Py8pux5Icfdp1heNetE4/pgBjzx9Fn+Dp0SMSStVrmr79WWo11qKxkfust8TTv6cn8j384fqHi66+Zb7tNNN6w0X9XvcZ/9uzNWOATT9h2kCklqKgQbf59fMQj7/PPO2a9xYkTN0tl8+Y5zxOKpdy4IcIOrVqJP/OcOY53HYxG5k8+EebYvj2zXq+0Iutz5gzzQw+J31lQkDheRxt0r7T0Zr3K3XfbtLGGOo1/+XLxCNWqlfgBuJrZ1CQ/X/T41WjE8b74omNUeBkMzB9/zNymjVh++klpRbYlN1d0RNNohMH+6U/i2ijNyZPM48ZxdYjNGeu3mkJGxs2e18HB4jfoCE+Y5qdDIua//93mfYfUafyvvCJG2szJad7+zsiRI2JeXyJR8pwxQ7lu99u23Wz+OHiw44dArMmRI6LXr0YjnsSmThUT+9ibK1eYX35Z3IS8vcXToSv2BakLo1G0fuvfX/wG27cXT5unT9tfS3a2aLIMiDBberpdslWn8VdWOt5jnr04fJj56adF6R8QpZ8FC2xf+jQaxY961Kibf7ZFi1z7aashjh4V00X6+HD1JPFvvCFK4LYkN1d0dmrTRuQ7ebIIg6gRo5E5JUX0/NVoxDJyJPPnn4tKblvmu3mzmCOaSDQhf/VVuz55qNP4JaLE9+67oqMaIH70gweLeHRWlvVKf0eOiKENevYU+QQEiMo2e4zh7gyUlIgpJBMSxPkBxNPovHliTBxrNAfNzxdmNmaMuM7mymalB1pzJE6dEg09unYV58fDQ9QBvvGGGB+npZ0IjUbmffvENJVhYSIPHx8xvaQCHS/rM34S3zk2sbGxnJmZqbQM5+fQIeDbb8Vwx3v3inV+fkBsLBATA0RFAV27AiEhYhheot+mYTCIIZNPnxZpZGaKYYyPHRPfDxwIzJoFTJ4MtGplt0NzKk6eBL77Dli7Fti2DaiqAtzdxdDcMTHiNSRELLffDrRuLc4lEVBeDly/DuTnA7m5YrjirCxxHbKzRfpBQcD06cBjj4nrKfktzOKcff+9GHb6wAGx3tsbiIwEoqOB0FBxLoOCxHVo1UoszOIaXLsGnDsHnDoFHD0K7NolhlbPzxdpxccDjz8OPPSQuIYKQERZzBz7m/XS+FXK+fNi7gG9XhjHgQPCgMxotYCPj1g8PIThlJcDly/fup2/P9C/PzBmjBhHPyTE7ofi1JSUAOnp4gaQlSWWwsKmpdGhg7h5DxworkFERN03bUn9nD8PpKUBO3YAe/aIQk1padPS6NlTzKcxeDAwbhwQGGgbrU1AGr+kYcrKRKnl9GlRIs3LE5OilJYKw/f0FJNy+PsDnTuLUlB4OBAcLE3GmjAL4z91SlyHS5fENTCbkKcn4OUFdOworkFIiDAYeQ2si9Eobga5uWK5eBG4cUOU8jWam6X/wECgSxfxZNWmjdKqf4M0folEIlEZ9Rm/nHpRIpFIVIY0folEIlEZ0vglEolEZUjjl0gkEpUhjV8ikUhUhjR+iUQiURnS+CUSiURlSOOXSCQSleEUHbiI6CKA083cPQDAJSvKcQbkMasDeczqoCXHHMzM7WuvdArjbwlElFlXzzVXRh6zOpDHrA5sccwy1CORSCQqQxq/RCKRqAw1GP8nSgtQAHnM6kAeszqw+jG7fIxfIpFIJLeihhK/RCKRSGogjV8ikUhUhksbPxGNIqIjRHSciOYqrccaEFEQEW0iosNEdJCIZpvWtyOiVCI6Znr1q7HPPNM5OEJE9yinvmUQkRsR7SGi1abPLn3MRNSWiH4kohzT9U5QwTE/b/pdZxPRt0Tk6WrHTERfEFEBEWXXWNfkYySiGCI6YPruA6ImTMNW1wzsrrAAcAPwK4BuALQA9gHoo7QuKxxXIIC+pvc+AI4C6APgLQBzTevnAnjT9L6P6dhvA9DVdE7clD6OZh77HABLAaw2fXbpYwawGMBM03stgLaufMwA7gBwEoCX6fP3AB51tWMGcDeAvgCya6xr8jEC2AkgAQABSAYw2lINrlzi7wfgODOfYOYKAMsA3KuwphbDzPnMvNv0/iqAwxB/mHshjAKm1/tM7+8FsIyZy5n5JIDjEOfGqSCizgDGAvisxmqXPWYi8oUwiM8BgJkrmLkILnzMJtwBeBGRO4BWAPLgYsfMzBkACmutbtIxElEgAF9m3sbiLvBVjX0axZWN/w4AuTU+nzWtcxmIKARANIAdAG5n5nxA3BwAdDBt5irn4X0ALwIw1ljnysf8/9u7vxCpyjCO498f9I80tLwIymCtJKGILSIkuzD1SsL+QCAl7UXQhRdhl+WN3QlJV4E3G13Y0k2KCkYESgRCf2lZbUvCjJqo1C5SisLap4vnXT3YzuxMuzrOOb8PDHPm3fPOnOfM8syc9z3znNuBU8CbZXhrVNICahxzRPwI7AC+B34CfouI96lxzBW9xnhrWb64vSt1TvwzjXfV5txVSQuB3cCWiDjTadUZ2gZqP0h6FDgZEZ9322WGtoGKmfzmez+wMyLuA34nhwDaGfiYy7j2Y+SQxi3AAkmbOnWZoW2gYu5CuxjnFHudE38LuK3yeCl52DjwJF1NJv2xiNhTmn8ph3+U+5OlvQ77YRWwQdJ35JDdGklvUe+YW0ArIj4uj98hPwjqHPM64EREnIqIc8Ae4CHqHfO0XmNsleWL27tS58T/KbBc0jJJ1wAbgf193qY5KzP3bwBfRcRrlT/tB0bK8giwr9K+UdK1kpYBy8lJoYERES9FxNKIGCLfx0MRsYl6x/wz8IOku0rTWmCSGsdMDvGslHR9+T9fS85h1TnmaT3FWIaDzkpaWfbVs5U+s+v3DPclnj1fT571chzY2u/tmaeYHiYP6SaA8XJbDywBDgLflPubKn22ln1wjB5m/q/EG7CaC2f11DpmYBj4rLzXe4EbGxDzK8DXwFFgF3k2S61iBt4m5zDOkd/cn/s/MQIPlP10HHidUomhm5tLNpiZNUydh3rMzGwGTvxmZg3jxG9m1jBO/GZmDePEb2bWME78ZvOkVNPcXHm8erqSqNmVxInfbP4sBjbPupZZnznxWyNJGip17kdL7fcxSeskHS410R8sNdL3SpqQ9JGke0vfbaWm+geSvpX0Qnna7cAdksYlvVraFlZq6o9N10yXtF3SZHnuHX3YBdZgV/V7A8z66E7gKeB5ssTH0+QvozcAL5NVEb+IiMclrSFL3w6XviuAR8hrIhyTtJMsonZPRAxDDvWQ1VPvJuuoHAZWSZoEngBWRERIWnwZYjU7z9/4rclORMSRiJgCvgQORv6U/QgwRH4I7AKIiEPAEkmLSt8DkTXST5MFtW5u8xqfRESrvMZ4ed4zwJ/AqKQngT8uSXRmbTjxW5P9VVmeqjyeIo+GO5W+rfb9h/ZHz/9ZLyL+Ji8Yspu8eMZ7vW222dw48Zu19yHwDJwftjkdna99cJYc+umoXEthUUS8C2zhwvCR2WXhMX6z9raRV8CaIIdjRjqtHBG/lsnho+Q1UA+0WfUGYJ+k68ijihfnb5PNZufqnGZmDeOhHjOzhnHiNzNrGCd+M7OGceI3M2sYJ34zs4Zx4jczaxgnfjOzhvkXnaJOki2gSaMAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "z0 = 50\n", "x0 = 5\n", "alpha = 0.02\n", "beta = 0.3\n", "gamma = 0.02\n", "\n", "\n", "y0 = np.array([x0, z0])\n", "f = lambda t, y : np.array([\n", " -gamma*y[0] + beta/500 * y[0]*y[1],\n", " alpha*y[1] - beta/100 * y[0]*y[1]\n", "] )\n", "\n", "t_eval = np.linspace(0, 1000, 2000)\n", "t_span = (0, 1000)\n", "\n", "sol = solve_ivp(f, t_span, y0, t_eval=t_eval)\n", "\n", " \n", "plt.plot(sol.t, sol.y[1], label=\"zebras\", c='k')\n", "plt.plot(sol.t, sol.y[0], label=\"lions\", c='r')\n", "plt.title(\"Lions v.s. Zebras\")\n", "plt.ylabel(\"population\")\n", "plt.xlabel(\"months\")\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This seems like a good solution - you install some hiding places for zebras, and give the lions a home. You start charging interested visitors for tours, and open a gift shop. Soon you are able to cover the expenses for the zerba hay. You quit your day job and become a safari guide in your own backyard." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercises\n", "\n", "1. Come up with agent-based models for the zebra growth model and lion-zebra predator-prey model. How do these compare to the ODE models in terms of speed?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "## Your code here\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Symbolic Solutions of ODEs\n", "\n", "You can use SymPy for symbolic solutions of ODEs. For instance, in our zebra growth problem, we had an ODE of the form\n", "\\begin{equation}\n", "y'(t) = a y(t)\n", "\\end{equation}\n", "We can use SymPy to classify the ODEs and find a symbolic solution (if one exists)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "import sympy as sym\n", "from sympy.solvers import ode" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle - a y{\\left(t \\right)} + \\frac{d}{d t} y{\\left(t \\right)}$" ], "text/plain": [ "-a*y(t) + Derivative(y(t), t)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a, t = sym.symbols('a t') # symbol\n", "y = sym.Function('y') # symbolic function\n", "eqn = y(t).diff(t) - a * y(t) # eqn = 0\n", "eqn" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('separable',\n", " '1st_exact',\n", " '1st_linear',\n", " 'Bernoulli',\n", " 'almost_linear',\n", " '1st_power_series',\n", " 'lie_group',\n", " 'nth_linear_constant_coeff_homogeneous',\n", " 'separable_Integral',\n", " '1st_exact_Integral',\n", " '1st_linear_Integral',\n", " 'Bernoulli_Integral',\n", " 'almost_linear_Integral')" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ode.classify_ode(eqn)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You might recognize some of the above from an ODE class. We see that this ODE is fairly simple, and a variety of methods might be used to solve the equation symbolicly." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle y{\\left(t \\right)} = C_{1} e^{a t}$" ], "text/plain": [ "Eq(y(t), C1*exp(a*t))" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ode.dsolve(eqn, hint='separable') # we solve the differential equation using the hinted method" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you have taken a class on ODEs, hopefully this looks correct. If you don't remember your ODEs, or haven't seen them before, try verifying that the solution satisfies `y'(t) = a * y(t)`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The Logistic Equation\n", "\n", "Another ODE is the Logistic equation\n", "\\begin{equation}\n", "y'(t) = y(t) (1 - y(t))\n", "\\end{equation}\n", "\n", "This models growth of a population with resource limits. \n", "\n", "First, let's use SymPy to find a symbolic solution" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle - \\left(1 - y{\\left(t \\right)}\\right) y{\\left(t \\right)} + \\frac{d}{d t} y{\\left(t \\right)}$" ], "text/plain": [ "-(1 - y(t))*y(t) + Derivative(y(t), t)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t = sym.symbols('t') # symbol\n", "y = sym.Function('y') # symbolic function\n", "eqn = y(t).diff(t) - y(t) * (1 - y(t))\n", "eqn" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('separable',\n", " '1st_exact',\n", " 'Bernoulli',\n", " '1st_power_series',\n", " 'lie_group',\n", " 'separable_Integral',\n", " '1st_exact_Integral',\n", " 'Bernoulli_Integral')" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ode.classify_ode(eqn)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle y{\\left(t \\right)} = \\frac{1}{C_{1} e^{- t} + 1}$" ], "text/plain": [ "Eq(y(t), 1/(C1*exp(-t) + 1))" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f = ode.dsolve(eqn, hint='separable')\n", "f" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's just set the constant $C_1$ to be 1" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "exp = 1 / (sym.exp(-t) + 1)\n", "sym.plot(exp)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's look at solving the ODE with $y(0) = 0.1$ . We can pass this into SymPy's `ode.dsolve` using the `ics` keyword:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle y{\\left(t \\right)} = \\frac{1}{1 + 9.0 e^{- t}}$" ], "text/plain": [ "Eq(y(t), 1/(1 + 9.0*exp(-t)))" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f = ode.dsolve(eqn, hint='separable', ics={y(0): 0.1})\n", "f" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "now, because we actually solved the IVP, there are no constants to fill in, and we can plot the right hand side of the equation:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.plot(f.rhs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, let's solve the IVP numerically using `scipy`" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3de5yN9d7/8dfHjBxqh8JWJELtsKN+E9qlg+xulbuTDtqFqFtqU0qYHNpEuSNRlEM23XRAqRx2u7aK1KYYKnRQky2GDsNWcoqZ+fz+mKU9psEMc801a13v5+OxHrPWdVjrvRzmvb7Xda3rMndHRESiq0zYAUREJFwqAhGRiFMRiIhEnIpARCTiVAQiIhGnIhARiTgVgSQsMxtvZgMPY73aZrbdzJKCyBUkM/u7mXUKO4fEF9P3CKQ0MLN1wG3u/ma8vraZ3QL8FdiVZ/Iz7t79SJ73IK83CKjv7jcH8fwSHclhBxBJMEvc/bywQ4gUhTYNSalmZuXMbLSZbYrdRptZuTzz+5jZN7F5t5mZm1n92LxnzGxo7H5VM5tnZj+Y2b/N7F0zK2Nm04DawNzY5qA+ZlYn9jzJsXWPM7MpsdfYamavFvE93GJm7+Wblj/nk2b2NzP7ycw+MLN6eZZtZGbzY7m/M7N+ZtYG6AfcEMv9cWzZhWZ2W+x+GTMbYGZfm9n3ZjbVzCrF5u17j53MbL2ZbTaz/kX9+5HEoCKQ0q4/0AJoCjQBmgEDAGK/DO8FWgP1gQsO8jy9gAygGvBbcn+Jurt3ANYD/+3ux7j78ALWnQZUBBoB1YFRR/62fuVGYDBQBUgHHgIws98AbwKvAyeS+z7fcvfXgYeBGbHcTQp4zltit4uAU4BjgLH5ljkPOA24GHjAzE4v1nclcUFFIKXdTcCD7v69u2eS+8uyQ2ze9cAUd//E3XfG5h3IXuAE4GR33+vu73ohdpCZ2QnApUA3d98aW/edg6zSIjbq2HdrUZg3Cbzs7kvdPQt4jtziA2gLfOvuI919t7v/5O4fFPI5bwIec/e17r4duB9ov2+kEzPY3Xe5+8fAx+SWrUSMikBKuxOBr/M8/jo2bd+8DXnm5b2f3whyP2n/w8zWmllqIV//JODf7r61kMu/7+6V89zeL+R63+a5v5PcT+/7Xv+rQj5HfgX92SWTOyI61OtKhKgIpLTbBJyc53Ht2DSAb4BaeeaddKAniX2S7uXupwD/DdxrZhfvm32Q198AHGdmlYuc/D92kLtpCQAzq1GEdTcA9Q4w71AjmoL+7LKA74rw+hIBKgIpTcqaWfk8t2TgBWCAmVUzs6rAA8CzseVnAp3N7HQzqxibVyAza2tm9c3MgG1AduwGub8YTyloPXf/Bvg78JSZVTGzsmZ2fhHf18dAIzNramblgUFFWHceUMPMesZ2nP/GzJrnyV3HzA70//gF4B4zq2tmx/CffQpZRcwvCU5FIKXJa+Qeg7/vNggYCqQBK4FVwIrYNNz978ATwAJyN/ssiT3PzwU8dwNyd7pujy33lLsvjM0bRm7Z/GBm9xWwbgdy9zF8DnwP9CzKm3L3L4AHY6//JfDewdfYb92fgD+SO4r5Nrb+RbHZL8Z+bjGzFQWsPpncHd2LgH8Bu4EeRcku0aAvlEnCiB3xshoop0+9IoWnEYHENTO72syOMrMqwCPAXJWASNGoCCTe3Q5kkntkTTZwR7hxROKPNg2JiEScRgQiIhEXdyedq1q1qtepUyfsGCIicWX58uWb3b1aQfPirgjq1KlDWlpa2DFEROKKmX19oHnaNCQiEnEqAhGRiFMRiIhEnIpARCTiVAQiIhEXWBGY2eTY5fFWH2C+mdkTZpZuZivN7KygsoiIyIEFOSJ4BmhzkPmXkntGyAZAV2BcgFlEROQAAvsegbsvMrM6B1nkSmBq7HKB75tZZTM7IXb+dxGRQnN3srKy9rtlZ2f/atqhbnnXyc7OJicnB3c/5M/CLHOwdQp7a9myJX/84x+L/c8vzC+U1WT/SwtmxKb9qgjMrCu5owZq165dIuFEpPBycnLYtm0b27ZtY8eOHezcuZNdu3axc+fO/W55p+3atYs9e/b8cvv555/3e1yUaXv27An7j6BEpKamJlwRWAHTCjwDnrtPBCYCpKSk6Cx5IgHJzs5my5YtZGZm8v333+/3c/Pmzfzwww/8+OOPv/zcd/vpp58o6gksK1SoQLly5TjqqKMKvO2bV7FixQPOy3srW7YsZcuWJSkpieTk5CLdClqnTJkyv9zM7IA/DzavMOsU9hakMIsgg/2vMVuL/1yLVkSKkbuzdetWMjIyyMjIYMOGDfvd37RpE5mZmWzZsqXAX+hmRpUqVahSpQqVKlWiUqVK1K9f/5f7lStXplKlShx77LEcc8wxVKxY8Ve3ChUq/HK/fPnygf9yk8ILswjmAN3NbDrQHPhR+wdEDt+uXbtYu3Yt6enpfPXVV6Snp5Oens7XX39NRkYGO3fu3G/5MmXKcOKJJ1KrVi1OP/10LrjgAqpXr061atV++bnv/vHHH09SUlJI70yCFlgRmNkLwIVAVTPLAP4ClAVw9/HkXp/2MnKvNbsT6BxUFpFEsnXrVlavXs2qVatYvXo1n376Kenp6WzcuHG/5apUqUL9+vVp0qQJbdu2pVatWpx00knUqlWLWrVqUaNGDZKT4+68kxKAII8auvEQ8x34c1CvL5IINm7cyNKlS1m2bBkrVqxg1apVbNr0ny2olSpVolGjRrRu3Zr69etTv3596tWrR7169TjuuONCTC7xRB8HREqJ3bt388EHH/DPf/6TpUuXsnTpUr75JndraXJyMo0bN6Z169Y0btyY3//+9zRu3JiaNWtqW7scMRWBSEh+/vlnli5dyoIFC1i4cCFLlixh9+7dAJx66qlcfPHFnH322TRr1oymTZtSvnz5kBNLolIRiJSgdevW8be//Y158+bxzjvvsGvXLsyMJk2acMcdd3DRRRdx3nnnUaVKlbCjSoSoCEQC5O6sWLGCl156iXnz5rF6de6pt+rXr89tt91Gq1atOP/887U9X0KlIhApZu7OypUrmTFjBjNnzuSrr74iOTmZli1bMnLkSNq2bcupp54adkyRX6gIRIpJZmYmU6dOZfLkyXz66ackJSXRqlUr7r//fq6++mp96pdSS0UgcgSys7OZP38+kyZNYs6cOezdu5cWLVowbtw42rVrR7Vq1cKOKHJIKgKRw7Bjxw6eeeYZRo8eTXp6Oscffzzdu3fn1ltvpVGjRmHHEykSFYFIEWzcuJGxY8cyYcIEtm7dSvPmzRkyZAhXX3015cqVCzueyGFREYgUQkZGBg8//DCTJk0iOzuba665hnvvvZdzzjkn7GgiR0xFIHIQmzZtYtiwYUycOBF3p0uXLvTt25e6deuGHU2k2KgIRArw448/MnToUMaMGUN2djadO3emf//+nHzyyWFHEyl2KgKRPLKzs5k0aRIDBw5k8+bNdOrUiQceeEAjAEloQV68XiSuLFiwgLPOOotu3brxu9/9jrS0NKZMmaISkISnIpDI27JlCx07dqRVq1b8+OOPzJw5k3feeYezzjor7GgiJUKbhiSy3J2ZM2fSo0cPtm7dyoABA+jXrx8VKlQIO5pIiVIRSCRt3LiRO+64g7lz55KSksKbb77JGWecEXYskVBo05BEzqxZs2jcuDFvvvkmjz76KEuWLFEJSKSpCCQydu7cSbdu3bj22mtp0KABK1eupFevXrpur0SeikAiYdWqVZx99tlMmDCBPn368N5771G/fv2wY4mUCvooJAlvypQp3HHHHVSuXJk33niDSy65JOxIIqWKRgSSsLKysujZsyddunThvPPOY+XKlSoBkQJoRCAJacuWLdxwww289dZb9OzZkxEjRmhfgMgB6H+GJJxPPvmEK664goyMDCZPnkznzp3DjiRSqqkIJKEsWLCAK6+8kqOPPpqFCxfqNNEihaB9BJIwZs2aRZs2bahduzbLli1TCYgUkopAEsKECRO47rrrSElJYdGiRdSqVSvsSCJxQ0Ugcc3dGTJkCN26deOyyy5j/vz5HHfccWHHEokrKgKJW+7OfffdxwMPPEDHjh155ZVXqFixYtixROKOikDikrvTp08fHnvsMXr06MGUKVMoW7Zs2LFE4pKOGpK44+7cf//9PProo/z5z3/m8ccfx8zCjiUStzQikLji7gwYMIBHHnmEbt26MWbMGJWAyBFSEUhcGTRoEA8//DD/8z//w5NPPqkSECkGKgKJG6NGjeLBBx+kS5cujB8/njJl9M9XpDjof5LEhenTp3Pvvfdy7bXXMnHiRJWASDEK9H+TmbUxszVmlm5mqQXMr2Rmc83sYzP7xMx0Uhj5lbfffpuOHTty/vnnM23aNJKSksKOJJJQAisCM0sCngQuBRoCN5pZw3yL/Rn41N2bABcCI83sqKAySfz5+OOPueqqqzj11FN59dVXKV++fNiRRBJOkCOCZkC6u6919z3AdODKfMs48BvL3eN3DPBvICvATBJH1q1bx6WXXkqlSpV4/fXXqVKlStiRRBJSkN8jqAlsyPM4A2ieb5mxwBxgE/Ab4AZ3z8n/RGbWFegKULt27UDCSumybds2Lr/8cnbt2sV7772ncweJBCjIEUFBx/V5vsf/BXwEnAg0Bcaa2bG/Wsl9orunuHtKtWrVij+plCrZ2dncdNNNrFmzhpdffplGjRqFHUkkoQVZBBnASXke1yL3k39enYGXPVc68C/gdwFmkjgwcOBA5s2bx+OPP85FF10UdhyRhBdkESwDGphZ3dgO4PbkbgbKaz1wMYCZ/RY4DVgbYCYp5V544QWGDRtG165dufPOO8OOIxIJge0jcPcsM+sOvAEkAZPd/RMz6xabPx4YAjxjZqvI3ZTU1903B5VJSrfly5fTpUsXWrZsqVNHiJQgc8+/2b50S0lJ8bS0tLBjSDH77rvvSElJoUyZMixbtozq1auHHUkkoZjZcndPKWiezj4qocvOzubGG29ky5YtLF68WCUgUsJUBBK6Bx98kAULFjB58mSaNm0adhyRyNEJWyRU//jHPxgyZAi33HILnTvrDCMiYVARSGg2btzIzTffTMOGDXnyySfDjiMSWSoCCUVWVhY33ngjO3fu5MUXX9S1hkVCpH0EEoqBAwfy7rvvMm3aNE4//fSw44hEmkYEUuLefvttHnnkEW677TZuvvnmsOOIRJ6KQErU1q1b6dSpEw0aNGD06NFhxxERtGlISpC7c8cdd/Dtt9+yZMkSjj766LAjiQgqAilBzz//PDNmzGDo0KGkpBT4BUcRCYE2DUmJ+Prrr7nzzjs599xzSU391VVLRSREKgIJXHZ2Nh07dsTddc1hkVJIm4YkcKNGjWLRokU888wz1K1bN+w4IpKPRgQSqDVr1jBgwACuuuoqOnbsGHYcESmAikACk52dTZcuXahYsSLjxo3T9QVESiltGpLAjBkzhsWLFzN16lRq1KgRdhwROQCNCCQQ6enp9OvXj8svv1zfHhYp5VQEUuxycnK47bbbKFu2LBMmTNAmIZFSTpuGpNiNHz+ed955h0mTJlGzZs2w44jIIWhEIMVq/fr19OnTh0suuYQuXbqEHUdECkFFIMXG3enevTvurk1CInFEm4ak2Lz66qvMnTuXESNGUKdOnbDjiEghmbuHnaFIUlJSPC0tLewYks+2bdto2LAhVatWZdmyZZQtWzbsSCKSh5ktd/cCz/aoEYEUi4EDB7Jp0yZmzZqlEhCJM9pHIEds2bJljBkzhjvvvJPmzZuHHUdEikhFIEckKyuL22+/nRo1avDQQw+FHUdEDoM2DckRGTNmDB9++CEzZ86kUqVKYccRkcOgEYEctm+++YYHHniANm3acO2114YdR0QOk4pADlvfvn3Zs2cPTzzxhL4zIBLHVARyWN577z2mTZtGr169aNCgQdhxROQIqAikyLKzs+nRowe1atWif//+YccRkSOkncVSZBMnTuSjjz5ixowZHH300WHHEZEjpBGBFMnmzZvp378/F110Edddd13YcUSkGKgIpEj69+/Ptm3bGDNmjHYQiyQIFYEU2vLly3n66afp0aMHjRo1CjuOiBSTQIvAzNqY2RozSzez1AMsc6GZfWRmn5jZO0HmkcOXk5ND9+7dqVatGoMGDQo7jogUo8B2FptZEvAk8EcgA1hmZnPc/dM8y1QGngLauPt6M6seVB45MlOnTuX9999nypQp+gaxSIIJckTQDEh397XuvgeYDlyZb5k/AS+7+3oAd/8+wDxymH766Sfuv/9+WrRoQceOHcOOIyLFLMgiqAlsyPM4IzYtr1OBKma20MyWm1mBv2XMrKuZpZlZWmZmZkBx5UCGDx/Ot99+y6hRoyhTRruVRBJNkP+rCzqkJP9VcJKB/wdcDvwXMNDMTv3VSu4T3T3F3VOqVatW/EnlgDIyMhg5ciTt27enRYsWYccRkQAE+YWyDOCkPI9rAZsKWGazu+8AdpjZIqAJ8EWAuaQI+vfvT05ODsOGDQs7iogEJMgRwTKggZnVNbOjgPbAnHzLzAZamlmymVUEmgOfBZhJimDFihVMnTqVu+++W9cgFklggY0I3D3LzLoDbwBJwGR3/8TMusXmj3f3z8zsdWAlkANMcvfVQWWSwnN3evXqRdWqVenXr1/YcUQkQIGea8jdXwNeyzdtfL7HI4ARQeaQopszZw4LFy5k7NixOlxUJMGZe/79t6VbSkqKp6WlhR0joe3du5fGjRtTpkwZVq5cqYvRiyQAM1vu7ikFzdPZR+VXxo8fzxdffMHcuXNVAiIRoIPCZT8//PADgwcPplWrVlx++eVhxxGREqAikP089NBD/Pvf/2bkyJE6u6hIRByyCMysu5lVKYkwEq61a9fyxBNP0KlTJ5o2bRp2HBEpIYUZEdQg94RxM2NnE9XHxASVmppKcnIyQ4cODTuKiJSgQxaBuw8AGgB/BW4BvjSzh82sXsDZpAQtXryYF198kd69e1OzZv5TQolIIivUPgLPPcb029gtC6gCvGRmwwPMJiVk35fHTjjhBHr37h12HBEpYYc8fNTM7gI6AZuBSUBvd99rZmWAL4E+wUaUoM2cOZP333+fv/71r7oYvUgEFeZ7BFWBa9z967wT3T3HzNoGE0tKyu7du0lNTeWMM86gU6dOYccRkRAcsgjc/YGDzNMJ4uLcmDFjWLduHfPnzycpKSnsOCISAn2PIMIyMzMZOnQol112Ga1btw47joiEREUQYYMHD2bHjh2MGKFz/olEmYogoj7//HPGjx9P165dadiwYdhxRCREKoKI6tOnDxUrVmTQoEFhRxGRkOnsoxG0YMEC5s6dy7Bhw6hevXrYcUQkZBoRRExOTg69evWidu3a9OzZM+w4IlIKaEQQMdOmTePDDz/kueeeo3z58mHHEZFSQCOCCNmxYwf9+/fn7LPPpn379mHHEZFSQiOCCBk5ciQbN25k+vTplCmjzwAikku/DSLim2++Yfjw4bRr147zzjsv7DgiUoqoCCJi4MCB7Nmzh0ceeSTsKCJSyqgIImDlypVMnjyZ7t27U6+eLiMhIvtTESS4fdcaqFy5MgMGDAg7joiUQtpZnOBee+013nzzTUaPHs1xxx0XdhwRKYUs9+Jj8SMlJcXT0tLCjhEX9u7dy+9//3vcndWrV1O2bNmwI4lISMxsubunFDRPI4IENn78eNasWcOcOXNUAiJyQNpHkKC2bt3KoEGDaNWqFW3b6kJyInJgKoIENWTIELZu3cpjjz2GmYUdR0RKMRVBAvryyy8ZO3YsXbp0oUmTJmHHEZFSTkWQgPr06UO5cuUYOnRo2FFEJA6oCBLMggULePXVV7n//vupUaNG2HFEJA6oCBJIdnY29957L7Vr1+aee+4JO46IxAkdPppApk6dykcffcTzzz9PhQoVwo4jInFCI4IEsX37dvr160eLFi10rQERKZJAi8DM2pjZGjNLN7PUgyx3tpllm9m1QeZJZMOHD+fbb7/V4aIiUmSBFYGZJQFPApcCDYEbzazhAZZ7BHgjqCyJbsOGDTz66KO0b9+ec845J+w4IhJnghwRNAPS3X2tu+8BpgNXFrBcD2AW8H2AWRJa7969cXeGDRsWdhQRiUNBFkFNYEOexxmxab8ws5rA1cD4gz2RmXU1szQzS8vMzCz2oPFs4cKFzJgxg759+1KnTp2w44hIHAqyCAraUJ3/VKejgb7unn2wJ3L3ie6e4u4p1apVK7aA8S4rK4u77rqLk08+mb59+4YdR0TiVJCHj2YAJ+V5XAvYlG+ZFGB6bOdmVeAyM8ty91cDzJUwxo8fz6pVq5g1a5YOFxWRwxZkESwDGphZXWAj0B74U94F3L3uvvtm9gwwTyVQOJmZmQwcOJCLL76Yq6++Ouw4IhLHAisCd88ys+7kHg2UBEx290/MrFts/kH3C8jB9e/fn+3bt/PEE0/ocFEROSKBfrPY3V8DXss3rcACcPdbgsySSJYvX86kSZPo2bMnDRv+6ohcEZEi0TeL40xOTg49evSgWrVq/OUvfwk7jogkAJ1rKM4899xzLFmyhMmTJ1OpUqWw44hIAtCIII5s27aNPn360Lx5czp16hR2HBFJEBoRxJFBgwbx3XffMXv2bMqUUYeLSPHQb5M48eGHH/L444/TtWtXmjVrFnYcEUkgKoI4kJ2dTbdu3ahatarOJyQixU6bhuLA008/zdKlS3n22WepUqVK2HFEJMFoRFDKfffdd6SmptKqVSv+9Kc/HXoFEZEiUhGUcr169WLXrl089dRT+gaxiARCRVCKvfXWWzz33HOkpqZy2mmnhR1HRBKUuec/M3TplpKS4mlpaWHHCNzu3btp0qQJ2dnZrF69mvLly4cdSUTimJktd/eUguZpZ3EpNXjwYL744gvmz5+vEhCRQGnTUCm0YsUKRowYQZcuXWjdunXYcUQkwakISpm9e/dy6623Ur16dUaOHBl2HBGJAG0aKmVGjBjBRx99xCuvvELlypXDjiMiEaARQSny2WefMXjwYK6//nquuuqqsOOISESoCEqJ7Oxsbr31Vo455hieeOKJsOOISIRo01ApMXbsWJYsWcK0adP47W9/G3YcEYkQjQhKgc8++4zU1FQuv/xybrrpprDjiEjEqAhCtnfvXjp06MDRRx/NpEmTdBoJESlx2jQUsiFDhrB8+XJmzZpFjRo1wo4jIhGkEUGIPvjgAx5++GE6derENddcE3YcEYkoFUFIduzYQYcOHahZsyaPP/542HFEJMK0aSgkvXv3Jj09nQULFlCpUqWw44hIhGlEEIK5c+cybtw47r33Xi644IKw44hIxKkIStj69evp1KkTZ511Fg899FDYcUREVAQlae/evbRv356srCxmzJhBuXLlwo4kIqJ9BCVpwIABLFmyhBkzZlC/fv2w44iIABoRlJjXXnuN4cOHc/vtt3P99deHHUdE5BcqghKQkZFBx44dOeOMMxg1alTYcURE9qMiCNiePXu44YYb2L17NzNnzqRChQphRxIR2Y/2EQTsrrvuYvHixUyfPp3TTjst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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "y0 = np.array([0.1])\n", "\n", "f = lambda t, y : y * (1 - y)\n", "t_span = (0, 10)\n", "t_eval = np.linspace(0,10, 200)\n", "\n", "sol = solve_ivp(f, t_span, y0, t_eval=t_eval)\n", " \n", "plt.plot(sol.t, sol.y[0], c='k')\n", "plt.title(\"Logistic Function\")\n", "plt.ylabel(\"y\")\n", "plt.xlabel(\"t\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercises\n", "\n", "1. Get an exact expression for the zebra growth IVP using SymPy. What is the worst-case error over the 100-month simulation we conducted?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "## Your code here\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Euler Method\n", "\n", "The [(forward) Euler Method](https://en.wikipedia.org/wiki/Euler_method) is a numerical method for solving Initial Value Problems. The basic idea is to choose a step size `h`, and iteratively compute `y(t0), y(t0+h), y(t0+2h), ...` using `y(t0 + (k+1)h) = y(t0 + kh) + h f(t, y(t0 + hk))`\n", "\n", "Here's an example implementation" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "def forward_euler(f, y0, t0=0, h=1e-2, n=100):\n", " \"\"\"\n", " compute n forward euler steps\n", " \"\"\"\n", " y = [y0]\n", " t = [t0]\n", " for k in range(n-1):\n", " fk = f(t[-1], y[-1])\n", " y.append(y[-1] + h*fk)\n", " t.append(t[-1]+h)\n", " \n", " return np.array(y), np.array(t)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's use this function to compute the solution to the Logistic equation:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "f = lambda t, y : y * (1 - y)\n", "\n", "y, t = forward_euler(f, 0.1, h=1e-1, n=100)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(t, y, c='k')\n", "plt.title(\"Logistic Function\")\n", "plt.ylabel(\"y\")\n", "plt.xlabel(\"t\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise\n", "\n", "1. write a version of `forward_euler` that will take in arguments in the same manner as `solve_ivp` (`f`, `tspan`, `y0`, and `t_eval`). You can define `h` for every step in `t_eval`. Return a solution class which has fields `y` and `t`, just like `solve_ivp`. Compare the output of your function to the output of `solve_ivp` on the logistic equation IVP above. How accurate is either compared to a ground truth logistic function?\n", "\n", "2. Try using some of the different methods in the [`solve_ivp` documentation](https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.solve_ivp.html). How does your accuracy change in both the Logistic equation and growth equation?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Events\n", "\n", "You can ask `solve_ivp` to find the location of events. An event is defined as a function `event(t, y)`, and `solve_ivp` will find values of `t` where `event(t,y) = 0`. For instance, in the zebra growth problem, we might want to find the value of `t` where the number of zebras reaches 100. We can pass in an event or list of events using the `events` keyword." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from scipy.integrate import solve_ivp\n", "\n", "z0 = np.array([50])\n", "alpha = 0.02\n", "\n", "f = lambda t, z : alpha * z\n", "t_span = (0, 100)\n", "t_eval = np.linspace(0,100, 200)\n", "\n", "def zebra100(t, y): \n", " return y - 100\n", "\n", "sol = solve_ivp(f, t_span, z0, t_eval=t_eval, events=zebra100)\n", " \n", "plt.plot(sol.t, sol.y[0], c='k')\n", "plt.title(\"The Zebra Problem\")\n", "plt.ylabel(\"zebras\")\n", "plt.xlabel(\"months\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "we can access the time at which events occur using the `t_events` field of the solution" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[array([34.65385735])]" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sol.t_events" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you want to end the simulation when an event occurs, you can set a flag `terminal=True`. You can also specify a direction flag to only trigger an event when the root of the function goes from negative to positive (`direction=1`), or positive to negative (`direction=-1`)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "image/png": "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27ZttGnThgoVKrB48WIGDRrE999/T/fu3cmfP7/f8UQkxDT3US61Z88eBg0axDvvvEO+fPno0aMHvXv3plChQn5HExEfqRRymQMHDvDqq6/y5ptvkpycTKdOnejbty/FihXzO5qIhAGVQi5x5MgRXnvtNV577TWOHTtG69atGTBggCarE5E/UCnkcL/++itvvfUWQ4cO5eDBgzRp0oR//vOflCtXzu9oIhKGVAo51IkTJxg3bhyvvPIKiYmJ1KtXj4EDB+rylyJyRiqFHObkyZNMnDiRQYMGsXv3bqpXr85HH33EX//6V7+jiUgE0KQJe08AAAqESURBVFdSc4jk5GQmTZpEqVKl6NKlCyVKlCAuLo6vvvpKhSAiWaZSiHApKSm8//77lClThvbt23P11VcTGxvL0qVLqVmzpt/xRCTCqBQiVEpKCtOmTaNcuXK0bduWyy+/nHnz5rF69Wrq1aunOYpE5LyoFCJMamoqM2bMoHz58rRs2ZL8+fPz8ccfs3btWho1aqQyEJELolKIEKmpqXz44YdUqFAhbYK6mTNnsn79eh555BHNTyQi2UK/ScJcamoqM2fOpEKFCjz22GOkpqYyffp0vv32W6Kjo1UGIpKt9BslTKWkpKQNEzVr1iztgjcbNmygWbNmKgMRCQr9ZgkzKSkpTJ06lfLly9O8eXMApk+fzoYNG2jRogV58+b1OaGI5GQqhTCRnJzMe++9R9myZWnVqhV58uRJK4NmzZqpDEQkJFQKPktKSmLixImULl2adu3acckll/DRRx/x7bffaphIREJO01z45Pfff2fSpEkMGTKEnTt3ctdddzFnzhwaNWqkIhAR36gUQuz48ePExMQwdOhQdu/eTZUqVRg9erROOBORsKBSCJEjR44wZswYRowYwf79+7n//vt59913qVWrlspARMKGSiHIDh48yJtvvsnIkSM5dOgQderUoW/fvlSrVs3vaCIi/0OlECQ//fQTr732GmPGjOHYsWNERUXRt29f7rnnHr+jiYhkSqWQzXbu3MnQoUOZMGECSUlJNGvWjN69e1OhQgW/o4mInJVKIZskJCQwZMgQpk6dSp48eWjXrh09e/akZMmSfkcTEckylcIFWrVqFa+88gpz5syhQIECdO/eneeee44bbrjB72giIudMpXAenHN8+eWXDBkyhEWLFnHllVfy4osv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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from scipy.integrate import solve_ivp\n", "\n", "z0 = np.array([50])\n", "alpha = 0.02\n", "\n", "f = lambda t, z : alpha * z\n", "t_span = (0, 100)\n", "t_eval = np.linspace(0,100, 200)\n", "\n", "def zebra100(t, y): \n", " return y - 100\n", "\n", "zebra100.terminal=True # we can set this a flag on the function object\n", "zebra100.direction=1\n", "\n", "sol = solve_ivp(f, t_span, z0, t_eval=t_eval, events=zebra100)\n", " \n", "plt.plot(sol.t, sol.y[0], c='k')\n", "plt.title(\"The Zebra Problem\")\n", "plt.ylabel(\"zebras\")\n", "plt.xlabel(\"months\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[array([34.65385735])]" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sol.t_events" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python (pycourse)", "language": "python", "name": "pycourse" }, "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.17" } }, "nbformat": 4, "nbformat_minor": 4 }