{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Numerical Solution of Ordinary Differential Equations: Part I\n", "\n", "This notebook and its companion illustrate some basic ideas in numerical solution of ODEs. We will first demonstrate the methods, then use the python library implementations, and finally discuss problems that go beyond the libraries. The first notebook deals with initial value problems, and the second with boundary value problems." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Initial Value Problems\n", "\n", "As a first step, let us distinguish initial value problems from boundary value problems. Recall that an ODE requires some number of boundary conditions -- as many boundary conditions as the order of the ODE system. An initial value problem is one where all of the boundary conditions are specified at the same value of the independent variable. For example, if we are considering an ODE describing orbital motion of point masses, an initial value problem would be one where the positions and velocities of all the point masses are specified at some time. The second part of the notebook will deal with boundary value problems, which is the class of ODEs where the boundary conditions are specified at different values of the independent variable." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Import some useful stuff\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "plt.rcParams[\"figure.figsize\"] = (7,5) # Make default figure size bigger" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Forward Differencing\n", "\n", "As a first example to work with, we will conisder a very simple ODE for which we can obtain an analytic solution: the logistic equation\n", "\\begin{equation*}\n", "\\frac{dx}{dt} = r x (1 - x).\n", "\\end{equation*}\n", "This equation can be used to model the growth of a population in an environment with a carrying capacity, i.e., a maximum population it can support. Here $x$ is the fraction of the carrying capacity, and $r$ is the rate of population growth. This equation has the analytic solution\n", "\\begin{equation*}\n", "x(t) = \\frac{1}{1+(1/x_0 - 1)e^{-r t}},\n", "\\end{equation*}\n", "where $x(0) = x_0$ is the initial condition.\n", "\n", "Suppose that we did not know the analytic solution, and wanted to integrate this equation numerically. The simplest and most basic method one could come up with is called forwards Euler differencing. The idea is to approximate the differential equation as a series of finite-sized steps. That is, consider some time step $\\Delta t$. We approximate the solution to the problem via a finite series of steps\n", "\\begin{eqnarray*}\n", "x_1 & = & x_0 + \\Delta t \\left(\\frac{dx}{dt}\\right)_{t_0} \\\\\n", "x_2 & = & x_1 + \\Delta t \\left(\\frac{dx}{dt}\\right)_{t_1} \\\\\n", "& \\ldots & \\\\\n", "x_{i+1} & = & x(i\\Delta t) + \\Delta t \\left(\\frac{dx}{dt}\\right)_{t_2},\n", "\\end{eqnarray*}\n", "where we have introduced the shorthand $x_i = x(t_i)$ and $t_i = i\\Delta t$.\n", "\n", "Note that, at every step, everything on the right hand side is a known quantity, so it is straightforward to implement this algorithm. Below is an implementation for the logistic equation." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# For this exmaple, we'll use r = 1, x0 = 0.1, Delta t = 0.1\n", "r = 1.0\n", "x0 = 0.1\n", "dt = 0.1\n", "\n", "# Define the function dxdt\n", "def dxdt(x):\n", " return r*x*(1-x)\n", "\n", "# Here is the exact solution\n", "def xsol(t):\n", " return 1.0 / (1.0+(1.0/x0-1)*np.exp(-r*t))\n", "\n", "# We'll integrate for 100 steps\n", "t = np.arange(101)*dt\n", "x = np.zeros(101)\n", "x[0] = x0\n", "for i in range(100):\n", " # Here is the update step\n", " x[i+1] = x[i] + dt*dxdt(x[i])\n", " \n", "# Plot the numerical and exact solutions on top of each other\n", "plt.plot(t, xsol(t), label='Exact')\n", "plt.plot(t, x, label='Numerical')\n", "plt.xlabel('$t$')\n", "plt.ylabel('$x$')\n", "leg=plt.legend(loc='lower right')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This looks reasonably good, but of course that depends on the choice of step size. Suppose instead of $\\Delta t = 0.1$ we chose $\\Delta t = 0.5$. Then things look a lot worse..." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Change to dt = 0.5, then integrate for 20 steps to the same final time\n", "dt = 0.5\n", "t1 = np.arange(21)*dt\n", "x1 = np.zeros(21)\n", "x1[0] = x0\n", "for i in range(20):\n", " x1[i+1] = x1[i] + dt*dxdt(x1[i])\n", "\n", "# Plot this case\n", "plt.plot(t, xsol(t), label='Exact')\n", "plt.plot(t, x, label=r'Numerical, $\\Delta t = 0.1$')\n", "plt.plot(t1, x1, label=r'Numerical, $\\Delta t = 0.5$')\n", "plt.xlabel('$t$')\n", "plt.ylabel('$x$')\n", "leg=plt.legend(loc='lower right')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the example above, the numerical solution grows too slowly compared to the analytic one. This is because the derivative is underestimated near the beginning of the calculation, when $x\\ll 1$. Specifically, when we do the first update step\n", "\\begin{equation}\n", "x_1 = x_0 + \\left(\\frac{dx}{dt}\\right)_{t_0},\n", "\\end{equation}\n", "the derivative $dx/dt$ evaluates to 0.09, since it is evaluated at $x=0.1$. We assume the solution looks like a straight line until the next time we evaluate the derivative at $t=\\Delta t$, so we are assuming that the slope is constant between $t=0$ and $t=\\Delta t$. This is clearly incorrect, however, which we can verify by plotting the true slope from $t=0$ to $t=\\Delta t$." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Points between 0 and dt\n", "tplot = np.linspace(0, dt, 100)\n", "\n", "# Plot dx/dt evaluated using the true solution\n", "plt.plot(tplot, dxdt(xsol(tplot)), label='Exact')\n", "plt.plot(tplot, dxdt(x0)*np.ones(100), 'r', label=r'Numerical, $\\Delta t=0.5$')\n", "plt.xlabel('$t$')\n", "plt.ylabel('$dx/dt$')\n", "xlim=plt.xlim([0,dt])\n", "ylim=plt.ylim([0,0.15])\n", "leg=plt.legend(loc='lower right')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Second Order Differencing: The Midpoint Method\n", "\n", "Formally, we can understand how the error depends on this size of the time step via series expansion. The true solution at $t = \\Delta t$ can be written as a series expansion of the solution at $t=0$:\n", "\\begin{equation}\n", "x(\\Delta t) = x(0) + \\Delta t \\left(\\frac{dx}{dt}\\right)_{t_0} + \\frac{\\Delta t^2}{2}\\left(\\frac{d^2x}{dt^2}\\right)_{t_0} + O(\\Delta t^3).\n", "\\end{equation}\n", "So our forwards Euler difference just amounts to throwing out all the terms in the series expansion higher than $\\Delta t$ to the first power. The size of the error per time step is therefore clearly proportional to $\\Delta t^2$. Since the number of time steps required to integrate for a fixed amount of physical time scales as $1/\\Delta t$, the error in our solution after a fixed amount of time thus scales as $\\Delta t$. Since the error for fixed time scales as the first power of the time step, this is said to be a first order method.\n", "\n", "Suppose we want more accuracy in our solution. How can we get it? One solution is to use a smaller time step, since the error scales as $\\Delta t$, but of course that costs more CPU time. If the cost is linear in the number of steps, then for every doubling of the CPU time (corresponding to taking twice as many steps of half the size), the error will go down by a factor of 2. That's not a great tradeoff, and we can do much better.\n", "\n", "Here's one way, called the midpoint method: we take a trial step of half of $\\Delta t$, evaluate the derivative at that trial point, and use that derivative for our advance. To be precise, we do the following steps:\n", "\\begin{eqnarray*}\n", "x_{1/2} & = & x_0 + \\frac{\\Delta t}{2} \\left(\\frac{dx}{dt}\\right)_{t_0} \\\\\n", "x_{1} & = & x_0 + \\Delta t \\left(\\frac{dx}{dt}\\right)_{t_{1/2}} \\\\\n", "& \\cdots & \\\\\n", "x_{i+1/2} & = & x_i + \\frac{\\Delta t}{2} \\left(\\frac{dx}{dt}\\right)_{t_i} \\\\\n", "x_i & = & x_i + \\Delta t \\left(\\frac{dx}{dt}\\right)_{t_{i+1/2}}.\n", "\\end{eqnarray*}\n", "Here we have introduced the notational shorthand that $t_{1/2} = (1/2)\\Delta t$, and so forth.\n", "In this update, there are two steps. In the first, we compute $x$ at half a step past where we are currently located. In the second, we evaluate the derivative at the new point, and use that for the full advance.\n", "\n", "We can code this up as follows:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# We'll keep dt at 0.5, but use a higher order method\n", "t2 = np.arange(21)*dt\n", "x2 = np.zeros(21)\n", "x2[0] = x0\n", "for i in range(20):\n", " # Advance half a step\n", " xmid = x2[i] + (dt/2)*dxdt(x2[i])\n", " # Now advance whole step using derivative evaluated at halfway point\n", " x2[i+1] = x2[i] + dt*dxdt(xmid)\n", " \n", "# Now plot the solution we've gotten\n", "plt.plot(t, xsol(t), label='Exact')\n", "plt.plot(t, x, label=r'Euler, $\\Delta t = 0.1$')\n", "plt.plot(t1, x1, label=r'Euler, $\\Delta t = 0.5$')\n", "plt.plot(t2, x2, label=r'Midpoint, $\\Delta t = 0.5$')\n", "plt.xlabel('$t$')\n", "plt.ylabel('$x$')\n", "leg=plt.legend(loc='lower right')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As the plot shows, even though we used a big time step, $\\Delta t = 0.5$, the midpoint method produced a solution whose accuracy is about as good as the Euler method using $\\Delta t = 0.1$. We can understand why the midpoint method is more accurate if we go back to thinking about Taylor expansions. The exact solution at $t=\\Delta t$ is given by\n", "\\begin{equation*}\n", "x(\\Delta t) = x_0 + \\Delta t\\left(\\frac{dx}{dt}\\right)_{t_0} + \\frac{\\Delta t^2}{2}\\left(\\frac{d^2x}{dt^2}\\right)_{t_0} + O(\\Delta t^3).\n", "\\end{equation*}\n", "To see why it is useful to evaluate the derivative at the midpoint, $t=\\Delta t/2$, rather than $t=0$, let us Taylor expand the derivative term:\n", "\\begin{equation*}\n", "\\left(\\frac{dx}{dt}\\right)_{t_{1/2}} = \\left(\\frac{dx}{dt}\\right)_{t_0} + \\frac{\\Delta t}{2}\\left(\\frac{d^2x}{dt^2}\\right)_{t_0} + O(\\Delta t^2).\n", "\\end{equation*}\n", "If we solve this for $(dx/dt)_{t_0}$ and substitute back into the first equation, we have\n", "\\begin{equation*}\n", "x(\\Delta t) = x_0 + \\Delta t\\left(\\frac{dx}{dt}\\right)_{t_{1/2}} + O(\\Delta t^3).\n", "\\end{equation*}\n", "The $\\Delta t^2$ term cancels completely! Thus by using the derivative evaluated at the midpoint, we analytically cancel out the second order error term, leaving only a third order term. (We've glossed over something a little here, because we didn't use the true derivative at the midpoint, we used the derivative evaluated at our numerical estimate of the midpoint; however, one can show that this does not introduce any additional error up to order $\\Delta t^3$.) This shows that the midpoint method is second order accurate, meaning that the error involved in integrating forward a fixed amount of time scales as the square of $\\Delta t$, rather than linearly in it.\n", "\n", "The price for this is that we required twice as many evaluations of $dx/dt$ for each step as for the simple forward Euler method. However, this price is generally worth it for the faster reduction in error. A useful way of thinking about this is that we want to \"buy\" a solution at a certain level of accuracy by spending as few CPU cycles as possible, where the cost in CPU cycles is roughly proportional to the cost of evaluating the function $dx/dt$. Suppose that the simple Euler method produces an error $e_0$ for a calculation with $n_0$ steps. In this case the formula for the error as a function of the number of evaluations, which is equal to the number of steps, is\n", "\\begin{equation}\n", "e(n) = e_0 \\frac{n_0}{n}.\n", "\\end{equation}\n", "For the midpoint method, which requires $2n_0$ function evaluations per step, the corresponding error versus $n$ is\n", "\\begin{equation}\n", "e_m(n) = e_{0,m} \\left(\\frac{2 n_0}{n}\\right)^2.\n", "\\end{equation}\n", "Which method requires a lower value of $n$ to produce a certain error will depend on the normalisation constants $e_0$ and $e_{0,m}$. However, it is clear that in the limit of large $n$, the midpoint method will eventually be better. In practice, we are usually in that large $n$ limit.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Higher Order Differencing Methods: Runge-Kutta\n", "\n", "One can generalise the midpoint method by picking additional points spaced about the interval $\\Delta t$, strategically chosen to cancel out additional terms in the Taylor expansion. Methods of this type are generally called Runge-Kutta methods, and are characterised by the number of midpoints, which correlates with the number of terms in the Taylor expansion that can be cancelled. A particularly famous example is the fourth-order Runge-Kutta method, which has four points in the interval:\n", "\\begin{eqnarray*}\n", "k_1 & = & \\left(\\frac{dx}{dt}\\right)_{t_i,\\, x_i} \\\\\n", "k_2 & = & \\left(\\frac{dx}{dt}\\right)_{t_{i+1/2},\\, x_i+\\Delta t k_1/2} \\\\\n", "k_3 & = & \\left(\\frac{dx}{dt}\\right)_{t_{i+1/2},\\, x_i+\\Delta t k_2/2} \\\\\n", "k_4 & = & \\left(\\frac{dx}{dt}\\right)_{t_{i+1}, \\, x_i+\\Delta t k_3} \\\\\n", "x_{i+1} & = & x_i + \\frac{\\Delta t}{6} \\left(k_1 + 2 k_2 + 2 k_3 + k_4\\right) \\\\\n", "\\end{eqnarray*}\n", "One can show that this cancels all error terms up to the 5th, and thus the error diminishes as $\\Delta t^4$. We can implement this easily:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEMCAYAAAArnKpYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi40LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcv7US4rQAAIABJREFUeJzt3Xd4VFX6wPHvmUlvQOgkgSAtoYQAIUgRkA6yIq4r6rrqYl3FtuKK5eeuHTVYwYJURQMIgoI0RZCmkNAhtNBDSUJCQnqmnN8fCSOBIIFkcpPM+3meeTL3njv3vkPCvHPOvfe8SmuNEEIIAWAyOgAhhBBVhyQFIYQQDpIUhBBCOEhSEEII4SBJQQghhIMkBSGEEA6SFIQQQjhIUhBCCOEgSUEIIYSDm9EBXK169erp0NBQo8MQQohqZfPmzWe01vWvtF21SwqhoaHEx8cbHYYQQlQrSqmjZdlOho+EEEI4SFIQQgjhIElBCCGEgyQFIYQQDpIUhBBCODgtKSilpimlUpRSuy7TrpRSHymlEpVSO5RSnZ0VixBCiLJxZk9hBjDkT9qHAq2KHw8BnzoxFiGEEGXgtPsUtNZrlFKhf7LJCOBLXVQP9HelVG2lVGOt9SlnxSSEqHxaayx2S9HDZvnjud2C1W7Fpm3Ytb3op91ecvmCn3Ztx2q3OtZprdHajt1uQ9utaLsVu7ag7XbsditWqxWb1YrNasNmsRf9tNqx2WzYrXaw2tFWO1htYNNgs6OtgM1e9LBrsFHUZrej7Apt06BB2QGtwa6Kfuqi9dgpaj9f5bh4+Y+HQhWvVxSvo2g96D9ep1Xxz6Ifqri9TotA/vbUc878dRl681oQcPyC5aTidZckBaXUQxT1JmjatGmlBCeEK7DZbWQVZpFrzSXXkkuONYdcS65jOc+a51jOseQ41udac8mz5JFnzaPQVoDFVojFVkChrbD4w9+KtpjAasZkc8fN7oG71QOfQs+iR4EH3hZP3G3uuNvMuNnccLO742Z3w83uhtnuhkm7YdbumOxmTBQtK9xR2g2UGwozYKZowMOEVt6g/Iqfm0Fd/UCIKmf7efoa264ka+ev5Xh12RiZFEr79y3130trPRmYDBAVFVWef1MhajytNVmWLM7knSEtL420vDTO5J3545F/xrEuPT8du7aXshNwt3niZfXDy+qLl8WHWoV+1M3xpVaeD00K6+Jl8cHD5oPJ7onSnoAnGk+08kKbPK46bpPdgsluQdmtmBwPC0pbMWkrStswkQPaigkbqvhruFJ2VPHXc6WKvsYrBUoBJl30vChvoEwKkwkwKUwmBSaFMplQJlXcbsJkMqHMJpQJlNlctM5sKn6uMJkVJrMbmFXx9kXrldmEyWxGmcyO/RZta/5jO7NCmYqWlVmhVPG+TSZUcdBFrzMXP1dwfv8mE351HynfH0cZGJkUkoCQC5aDgZMGxSJEtVJgK+BgxkH2pe9j/9n9nMg+UeLDv9BeeMlr3JSZuvjSsDCQJjm1aZ8bTu1zfvjm+uFm8QabL3a7P1blh1X5otVlPh60HTdrLu6WHNytuZit+Zjt2Zi0BRNWTCYbZpMdk1ljcjdh9jTj5uWBu48Hbr4+eNbywdvfB+/avngHeOHt6427jxcmL09MXl4oT0+UhwcmT8+i52azk/81xYWMTAo/AGOUUrOBbkCmnE8QoiStNadzTrP/7P4SjyPnjji+4XuZvQj2aUB9kydBNn9q5dcj4JwH/tke+GZ7Y84NpNBaj1xdnzxV55JhFXvhObBkF33IW1Jxsx7BrCy4udlx8zLj6eeBd4A3fnX9qNWoFn6N6uBRtwnmwEDMdepg9vVFeVx9z0BUTU5LCkqpWKAvUE8plQT8F3AH0Fp/BiwBhgGJQC7wT2fFIkR1kGvJ5UDGgaIP/vSiD/8DZw+QZclybBPk3YBWHnXoZQ6nSYoPgWe8UZn1yLQ0IVvXJ99U27FtDpCrbXgWZOCVn06t/APUt2bh6aXxqe1B7Sa1qH9dA3xCmmAObIZbYCDmwEBMfn5FQxnCJTnz6qM7r9CugcecdXwhqoPEs4ksP7qcn4/+TGJGomO9r7svrX2DGOzbnKD0QhqfNlPnrBdZec1ILWxJJo3JUCYyAI+CTHxzT1EnfzeehRl4etjxq+NJ3aBa1A6tj2dICO7BbfEIDsJUq5Z84Is/Ve2mzhaiuks8m8iKoytYfmQ5hzIPoVBENYjk0eDBNErNIfBwPt7pJtLzm5FS2IIs1ZgjwBHAM/8s/tnHCc3ehr9PIY1aBlIvsg1eraNxDwnBrX59lEkmKhDXTpKCEJXgYMZBVhwpSgQHMw+iUHQJaMHN7p1plehJ7uYgkgvbcJIGjqstvPLT8M86Rr3seGr5FND4ukBq92iNV/s+eIW1weTjY+h7EjWTJAUhnORQ5iGWH1nOiiMrSMxIRKGI9G7MmJxQ2h2vRVpWJ05aOrBTueFeeI46GYk0zNqAv1cejVvWpVZ0G7za34BX27aY/fyMfjvCRUhSEKICHc48XJQIjq7gwNkDKBQRHvUZkxZC+OmGJGdHk2Jvw3bAOy+V4NTV1DcnE9qnLX7du+Pd/kHMtWoZ/TaEC5OkIEQFWJu0lo+2fsTe9L0AdPRoxGOprWh5ugnJ2dFkEMxOwD/rKM3PLCKoVg5NbuxMwKD78WzRwtjghbiAJAUhyuHYuWO8E/cOvyb9SjP3BjyS1o3mSXVJzo0il7rs0zbqZCTSOu1bQoIUDQZ3x3/As7g3aWJ06EKUSpKCENcg15LLlJ1TmLF7Bj4WLx45NAiP1N4UKn+O2gqom55As7NLadbaj7q398HvxjdwCww0OmwhrkiSghBXQWvNsiPLiNk4nnPZBfztcD8Cz9yIVXkTkLadxmlbaBbZiDq39sP3hkcw+/kaHbIQV0WSghBltC99H2+seYF9qafpd6wPTVNuwI47galbuM62m5YP3Ib/4McwyZQPohqTpCDEFWQWZPLer//HT4e30S3pRu5NeQiNiQbJcbQyJxL68B34DxwrN42JGkGSghCXYbPbiI2fxJebFxJ2oh9/T30JpaHR6Y209jlGsyfvwq/v8zJthKhRJCkIUYqNh37m/eUf0Ph4L25Oex6TttPk1Hra1D5NyHP34NujhyQDUSNJUhDiAslZJ3lr9ku4HWxLr7NPYbZbCDq5mrCGGQS/fB8+XbsaHaIQTiVJQYhis378lIRf82l17m7M1jyCT/xEWNN8gt74J96RkUaHJ0SlkKQgXF5e9jkmT3wd05E+NLVCSNKPtGmhCZ7wAF5t2xodnhCVSpKCcGnbVi3mt8XbccsZQq3Mg3Tw2Eybj/6NV+vWRocmhCEkKQiXlJOTw/rPXuNQYgR2ezeaHl9K19vCaHjfJ3JpqXBpkhSEy9mxdSPJ33zJgXM341GYQ4tTX9A95kX82kcYHZoQhpOkIFyGza5Z9tUnWDblcsL2V+qm7cS3zlpunDcdNz9/o8MTokqQpCBcwum0DDZOfIW0kz3I1wE0O/otmcNNDB/zrdxvIMQFJCmIGi9u+26SZ3xFUu5NeOelUj91AmnPDuSe/mMlIQhxEUkKosbSWjN//o9YViaRrgfRKPl39gR+S/N3nubeDvcYHZ4QVZIkBVEj5VtszHpvOvaDDbDbm9I86Su+6hHP7Xe+yshWI40OT4gqS5KCqHGSz+bx/euzsOS0wD/nKN6Fcxg/8jQvDo5hcOhgo8MTokqTpCBqlK27kombuBoLLQhJWklC2w3M63CO9278iN7BvY0OT4gqT5KCqDHWxR9j9+StKKsXEaemMH14Mrtr5/Jp/8/o2kgmshOiLCQpiBph2fqDHJu5HWU107Eglv/+PZkscyFTBkyhQ/0ORocnRLUhSUFUe/N/2cPZ2F1ouzcdC+fw3LAT4GZm+qDptK4jcxgJcTUkKYhqLXZlArlztmPVAUQVLOD//pKMm8mTqYOn0iygmdHhCVHtSFIQ1daXPydgnbuFQl2PbnkLmXWvD6dPp/Ll0C8lIQhxjWQ6SFEtTftpN7a5ceRTn6ishex7tjs/nVrFU12eknMIQpSDJAVR7Xy1ej/q243k0YTOZxfiG/MQ7+78kD7BfbinrdypLER5yPCRqFbm/naEwm/Wkq+aEXlmPm2/+C93rr6fQK9AXu/5usxlJEQ5SVIQ1cYPW06QMWMlFlNzOpyeR7fpb/LCjrc4kX2CaYOnUdurttEhClHtyfCRqBbW7Evh+ORlWFRz2p76jh5TX+P71F9YemQpj0U+RueGnY0OUYgawalJQSk1RCm1TymVqJQaV0p7LaXUIqXUdqXUbqXUP50Zj6iedhzPIP6DpUBz2pxcSK/JL3HYlM5bm96ie+Pu3N/hfqNDFKLGcFpSUEqZgUnAUKAtcKdSqu1Fmz0GJGitOwJ9gQlKKQ9nxSSqnyNnslny9o946hBanlxMn0lPYwkMYOyvY/Fz9+PNG97EpKTDK0RFceb/pmggUWt9SGtdCMwGRly0jQb8VdHZQT8gHbA6MSZRjaRnF/DVa0vxtzam+cll3BhzH+4hzXlr01sczjzM+N7jqeddz+gwhahRnJkUgoDjFywnFa+70EQgHDgJ7ASe1FrbL96RUuohpVS8Uio+NTXVWfGKKqTQamfiqysILKhL01Mr6ffyEDxaR7Do4CIWJi7koYiHuL7x9UaHKUSN48ykUNq1gfqi5cHANqAJEAlMVEoFXPIirSdrraO01lH169ev+EhFlaK15oM3VlL3nC9Bp9cw8Im2eEX143DmYV77/TW6NOzCIx0fMTpMIWokZyaFJCDkguVginoEF/on8J0ukggcBsKcGJOoBiZ/uA7fU2YapfzO4DsUXv3/Tr41n7G/jsXT7MnbN7yNm0muphbCGZyZFOKAVkqp5sUnj+8Afrhom2NAfwClVEOgDXDIiTGJKm7xsn1Y9xRQ/8xWBvfZjfeolwGIiY9h/9n9vNHrDRr6NjQ4SiFqLqd93dJaW5VSY4DlgBmYprXerZR6pLj9M+A1YIZSaidFw03Paa3POCsmUbXtO5bB0Xl78bLk07/lYvweXQpKsfzIcubsm8M/2/1TqqcJ4WRO7YNrrZcASy5a99kFz08Cg5wZg6gezuUV8v1bK/EzBdA9fyJ1x30J7l4czzrO/zb8j4j6ETze+XGjwxSixpMLvIXhtNZMePdXfHUdWiV/T/h/n4HaIVhsFp799VmUUrzT+x3cTe5GhypEjSdn64Thvli0h4ZJNmqfO0CvUb6otkMAeH/L++xO280HfT8gyO/iq5mFEM4gSUEYalPiGQq+T8ATD/o0XoL3Hd8DsOrYKr5K+Iq7wu6if7P+BkcphOuQ4SNhmLTsAha9vxqTeyCdz35Jk1emgMnMqexTvLT+JcIDw3km6hmjwxTCpUhSEIaw2zVvTNpAI1sgIcmr6PTyvaiARmiteWHdC9i0jZg+MXiYZSosISqTJAVhiC9W7KfVgWx8s0/Qd2A65si/ALD40GLik+N5NupZmgY0NThKIVyPnFMQlW7H8Qyy5m3HVwXQyyOWgIcWApBVmMWE+AlE1ItgZKuRBkcphGuSpCAqVU6BlZnv/8p1bvVod2oWLSa/B25FQ0SfbPuE9Px0JvWfJNNhC2EQSQqiUr01cwstsr2pd3Yb1z/SHtWwaKqr/Wf3E7s3ltta30a7eu0MjlII1yVJQVSaJVtO0mjjCTxsdvq1WoXHkKKpsLTWvPH7G/h7+PNEpycMjlII1yZ9dFEpUrLyiZu8AeXmT3TOVOqNmwyqaHb1Hw//yJaULTzZ+Ulqe9U2OFIhXJskBeF0Wms++Gg99QikRfIS2j/3DwhoDEB2YTYT4ifQvm57bm11q8GRCiFk+Eg4XezKRIKPFBKQfYLefY9i6jLB0fbJ9k9Iy0vj434fy8llIaoASQrCqY6dyeb07J344Elvr8n43L/IMWx04OwBvtnzDbe2upX29dobHKkQAmT4SDiR1pqv3lmNp1ttIlNnEPLUWPBv6Gh7c+Ob+Hn48WTnJw2OVAhxniQF4TRfz99J7UwvmqRsIOpmUBF/c7QtPbyU+OR4nuj0BHW86hgYpRDiQjJ8JJzi8IlzZCw7ik9hNn2DvsLtb6sdw0Y5lhxi4mNoW7ctf231V2MDFUKUID0FUeHsdjvfv/ULJpMnPfMmUuee/ziuNgL4dNunpOal8mK3FzGbzAZGKoS4mCQFUeHmztqCuzWA1inf03qQH3T5p6PtYMZBvt7zNbe2upWI+hEGRimEKI0MH4kKlZKeR9qak/jmZ9Cj5QLULavBVPTd4/zJZW93bzm5LEQVJT0FUaG+fmcluPkRXTgDn+FPQP3WjrblR5az6fQmnuz0JIFegQZGKYS4HEkKosL8tOEoHumeND7zO2HXZ0Cvpx1tOZYc3o17l/DAcG5rfZuBUQoh/owMH4kKkVtgZef0OHy0Nz0DZmC65Qtw83S0f779c1LyUpjQd4KcXBaiCpOegqgQU6ZuxNMcSNiZhTS4qQ9c18fRdijjEF8lfMUtLW8hskGkgVEKIa5Eegqi3PYmZWDakoZffgbd2vyMGrzR0aa15s1NRSeXn+r8lIFRCiHKQnoKoly01sx7/1eUmx9RBTPwvu0l8GvgaF9xdAUbT23k8U6PU9e7roGRCiHKQpKCKJe5PydSJ8uHxqm/E9bbAl3uc7TlWnJ5N+5dwgLDuL317cYFKYQoMxk+EtcsI6eQ43O346e96eE/A/PIb+CCk8if7/ic5NxkYvrEyMllIaoJ6SmIa/bZlE14mwNpc2YhDW8ZCMFRjrbDmYf5MuFLbm5xs5xcFqIakZ6CuCbbD6fjt/Msfvln6db6Z9TAOEeb1pq3Nr6Ft9mbp7s8/Sd7EUJUNdJTEFfNbtcs/Hgdys2XqPwZ+Nz2AvjWc7SvPbGW3079xqORj1LPu96f7EkIUdVIT0FctTkrE6mX7U3jtN8JuyEPokY72qx2KxPiJ9AsoBmjwkYZGKUQ4lpIT0FclYzcQpLm7sBsL6S73wzMt7xb4uTydwe+41DmIZ7u8jTuJncDIxVCXAtJCuKqfDE1Hh9zHdqkLqTRTd0htJejLceSw6Rtk+jcoDP9QvoZGKUQ4lo5NSkopYYopfYppRKVUuMus01fpdQ2pdRupdSvzoxHlM+e4xl4bU/DNzuJbi2WoQa9XqJ92q5ppOenMzZqLKq4ypoQonpx2jkFpZQZmAQMBJKAOKXUD1rrhAu2qQ18AgzRWh9TSjUofW/CaFpr5n+8jjpuvkTlvY/PzY9B7RBH++mc03y5+0uGNh9Kh/odDIxUCFEezuwpRAOJWutDWutCYDYw4qJt7gK+01ofA9BapzgxHlEOP647Sp0MTxqlbiQ86jT0eKJE+8StE7FpmxTPEaKac2ZSCAKOX7CcVLzuQq2BOkqp1UqpzUqpe5wYj7hGeYVW9s7aitleSA/f6ZiHvwoePo72vel7+eHgD9wdfjdBfhf/ioUQ1YkzL0ktbVBZl3L8LkB/wBv4TSn1u9Z6f4kdKfUQ8BBA06ZNnRCq+DMzv9qKt6pF65Q5NLq5GbT/q6NNa01MfAwBngE8EPGAgVEKISqCM3sKSUDIBcvBwMlStlmmtc7RWp8B1gAdL96R1nqy1jpKax1Vv359pwUsLnUyLQfLb8lFJ5ebLUANHQ8XnERed2IdG09t5F8d/0WAR4CBkQohKoIzk0Ic0Eop1Vwp5QHcAfxw0TbfAzcopdyUUj5AN2CPE2MSV2n2++swufnQJfcrfPvdCkFdHG3nb1Rr6t9UZkEVooZw2vCR1tqqlBoDLAfMwDSt9W6l1CPF7Z9prfcopZYBOwA7MEVrvctZMYmrs2n7aTxTTDQ6s5Hw9ruh/8wS7QsTF3Iw8yDv930fd7PcqCZETeDUaS601kuAJRet++yi5XeBd50Zh7h6drudDZ9vxNtuprvvDNz6PQEBTRztuZZcJm6dSKcGnejftL+BkQohKpLc0SxKtWD+btzt/rRIXULjCAU9Hi/RPn33dNLy0+RGNSFqGJkQT1wiN9/CyRWH8cvPonvIPNTAD8DD19GenJPMjF0zGBI6hIj6EQZGKoSoaNJTEJf4+vONmMx+tM9ZgG+HMIi4o0T7pG2T5EY1IWoo6SmIEk6n5lK46xy1zx0lovkvMPgHMP3x3WFf+j4WJi7knrb3EOwfbGCkQghnkJ6CKGHuh2vA5EGUno1n1JASs6ACvLf5Pfw9/Hkw4kGDIhRCONMVk4JS6gMlZxJdwva9ZzCnmGiUGkfL1rth4Ksl2tefWM+Gkxt4pOMj1PKsZVCUQghnKktPIRv4QSnlC6CUGqSUWu/csIQRfvl0AyZtI9rna8w9RkO9lo42m91GTHwMIf4h3NHmjj/ZixCiOrviOQWt9UtKqbuA1UqpAiAHKLU2gqi+flp9CI8CP5qlLCO46zno81yJ9u8Pfk9iRiIT+kyQG9WEqMGumBSUUv2BBylKBo2B+7XW+5wdmKg8Npud3bN34ltgp1v92agbnwHfuo728zeqdazfkYHNBhoYqRDC2coyfPQi8H9a677AbcAcpZTUWqxBZs/ZiTv+tEpfQmDbAIh+uET7zN0zSc1LlRvVhHABZRk+6nfB851KqaHAfKCHMwMTlSM7x0L6qmP452XQNWQhauCn4O7laE/NTWX67ukMajaIyAaRBkYqhKgMV31Jqtb6FEX1D0QN8NXnv2My+9Ih5zt8O3YoUSsBim5Us9gtPNX5KYMiFEJUpmu6eU1rnVfRgYjKd/x0FrY92dTNTKRDi19h0OIStRL2n93PgsQF/D3874QEhPzJnoQQNYXcvObC5k/cgDK501nPwSNqKDQrOSL43ub38HX35eGIhy+zByFETSNJwUVtS0jFPdVE45TfaNlmLwx4pUT7+hPrWX9iPQ9HPCw3qgnhQiQpuKhfPv8ds81CtPfsS25Us9gtvB33Nk39m3Jn2J0GRimEqGySFFzQipWH8CzwpVnKSoLaXnqjWuyeWA5nHubZrs/iYfYwKEohhBFkllQXY7PaSfh2F34FFrrVn4vqW/JGtbS8ND7d/ik9m/SkT3AfAyMVQhhBegouZvbsHbjjR6u0H6nTLgC6PVKi/eOtH5Nvzec/0f+RG9WEcEHSU3AhWTkW0n9NIiD3DFEhi1ADJpW4US0hLYHvDnzH3W3v5rpa1xkYqagoFouFpKQk8vPzjQ5FVBIvLy+Cg4Nxd7+2OcokKbiQoopqPkU3qvVuC+1vc7RprRm/aTx1vOrwSMdH/mQvojpJSkrC39+f0NBQ6fm5AK01aWlpJCUl0bx582vahwwfuYjjp7Kx7s2mbtpO2rdYB4PfLFFRbenhpWxN2coTnZ4gwCPAwEhFRcrPz6du3bqSEFyEUoq6deuWq2coScFFzJ+0AaXMRTeqdR0KoT0dbbmWXCZsnkB4YDi3tLzFwCiFM0hCcC3l/X1LUnAB23an4J5qIih5Ay3a7L/kRrVpu6aRkpvCuOhxmE1mg6IUNZXZbCYyMtLxGD9+fIXte9u2bSxZsqTC9ifknIJL+OXzTfjYFF19ZmPuWfJGtRPZJ5ixewZDmw+lc8POBkYpaipvb2+2bdvmlH1v27aN+Ph4hg0b5pT9uyLpKdRwy34+hGehD6HJP9O4bc4lN6pNiJ+ASZn4d5d/GxShcEWZmZm0adOGffuK6nXdeeedfPHFFwD861//Iioqinbt2vHf//7X8Zq4uDh69OhBx44diY6OJjMzk5dffpk5c+YQGRnJnDlzDHkvNY30FGowq9XO3nm78csvoFv9bzH1e67EjWqbTm3ip6M/MSZyDI18GxkYqagMryzaTcLJcxW6z7ZNAvjvX9r96TZ5eXlERv5Ri+P5559n1KhRTJw4kfvuu48nn3ySs2fP8uCDDwLwxhtvEBgYiM1mo3///uzYsYOwsDBGjRrFnDlz6Nq1K+fOncPHx4dXX32V+Ph4Jk6cWKHvy5VJUqjBYr/ZgTu+tD7zLbUH1IXohxxtVruVtza9RZBfEPe2u9fAKEVNd7nho4EDB/Ltt9/y2GOPsX37dsf6uXPnMnnyZKxWK6dOnSIhIQGlFI0bN6Zr164ABATIFXLOIkmhhso8l0/GupPUzj5Fl6bLUIOmgJuno/3b/d+SmJHI+33fx8vN60/2JGqKK32jr2x2u509e/bg7e1Neno6wcHBHD58mJiYGOLi4qhTpw733Xcf+fn5aK3lKqpKIucUaqhZE3/HZPKiY/YcfKO6QPhfHG0Z+RlM3DqRbo260b+pFNETxnj//fcJDw8nNjaW0aNHY7FYOHfuHL6+vtSqVYvk5GSWLl0KQFhYGCdPniQuLg6ArKwsrFYr/v7+ZGVlGfk2ahzpKdRABxLPwlELjVI2Ed4mDgavLFFRbdK2SWRbsmV+I1EpLj6nMGTIEEaPHs2UKVPYtGkT/v7+9O7dm9dff51XXnmFTp060a5dO6677jp69iy6n8bDw4M5c+bw+OOPk5eXh7e3Nz///DM33ngj48ePJzIy0nGuQpSPJIUaaOmk3/CwaaLdY3HvMQqC/rjUdP/Z/czdP5fbW99O6zqtDYxSuAqbzVbq+j179jiev/fee47nM2bMKHX7rl278vvvv1+y/nzvQVQMGT6qYVavPIw5z4vmp5YT1C4N+r/saNNa8/amt/H38GdMpzEGRimEqKokKdQg1kIbO79NwCf3NNGN52Hq+zQENHG0/3zsZzad3sSYyDFSYlMIUSpJCjXItzO2YMKb8LMLqB1eG7r/0RvIt+YTExdDqzqtuK31bX+yFyGEK3NqUlBKDVFK7VNKJSqlxv3Jdl2VUjallHxaXaO0M7mkx6dT98wOOrX8BTXoVfDwcbTP3D2TkzkneT76edxMcipJCFE6pyUFpZQZmAQMBdoCdyql2l5mu7eB5c6KxRXM+3ADCuis5uDZrjO0/6uj7XTOaabumsrAZgPp2qircUEKIao8Z/YUooFErfUhrXUhMBsYUcp2jwPzgRQnxlKjJexIwZpqIuTUKlq02gvD3ilxCep7m9/Dru08E/WMgVEKIaoDZyaFIOD4BctJxesclFJBwEjgMyfGUaNpu2bV5Dg8CjLoFjgXc7e/Q5NOjvYtyVtYenjV05obAAAb2ElEQVQp97W7jyC/oD/ZkxBCODcplHZXlL5o+QPgOa116Rcyn9+RUg8ppeKVUvGpqakVFmBNsGLBHrB60yp1EfXbWKD/H7NK2uw2xm8aT0OfhoxuP9rAKIUQ1YUzk0ISEHLBcjBw8qJtooDZSqkjwG3AJ0qpS0p/aa0na62jtNZR9evXd1a81U5ediGJy49SK/MgXZstQvV9Dvz++PeZf2A+e9L38EzUM/i4+/zJnoRwrqsttOPn51fhMSxYsAClFHv37nWsS0pKKveU28uWLaNNmza0bNnysu9r9OjRNGjQgPbt25frWJXBmUkhDmillGqulPIA7gB+uHADrXVzrXWo1joUmAc8qrVe6MSYapRvP9kIyp2I/G/xDQstMQvqiewTTIifQLfG3RgSOsS4IIXgj5lSzz/GjbvsxYhXTWuN3W6/4naxsbFERUUxe/Zsx7qVK1eyZcuWaz62zWbjscceY+nSpSQkJBAbG0tCQsIl2913330sW7bsmo9TmZyWFLTWVmAMRVcV7QHmaq13K6UeUUo94qzjuoqko5lkHcyn8enfCG8dB8PeBTcPAOzazv+t/z+UUrzW4zWZ30hUSUeOHCnxzTkmJob//e9/l2w3a9YsoqOjiYyM5OGHH8Zms3HkyBHCw8N59NFH6dy5M8ePH7/kdRfKzs7m119/ZerUqcTGxgKwbt06/v3vfzNv3jwiIyM5fPjwVb+HTZs20bJlS6677jo8PDy44447+P777y/Zrnfv3gQGBl71/o3g1AvWtdZLgCUXrSv1pLLW+j5nxlKTaK1Z9OEG3Kw2on3n4N7lL9DiRkf77L2ziTsdxys9XqGxX2MDIxVVytJxcHpnxe6zUQcYeuWay6UV2unWrdsVX7dnzx7mzJnD+vXrcXd359FHH+Xrr7+md+/e7Nu3j+nTp/PJJ59ccT8LFy5kwIABRERE4Ovry5YtW+jVqxddu3YlJibmkmGdG264odTZV2NiYhgwYIBj+cSJE4SE/DFKHhwczMaNG68YT1UmdzFVQxtWHcGe60mL0/MJ6pYGg95wtB07d4wPtnxAr6BejGw50sAohfhDaYV2jhw5csXXrVy5ks2bNzuK6+Tl5dGgQQN69+5Ns2bNuP7668t0/NjYWB56qGh49fbbbyc2NpbOnTuzb98+2rRpc8n2a9euLdN+tb742hmqfc9ckkI1Yym0snVuAn45Z7k+aD6q71ioXfRNxWa38dL6l3AzufG/7v+r9n+cooKV4Rt9ZXJzcytxLiA/P/+SbbTW3Hvvvbz11lsl1h85cgRfX98yHSctLY1Nmzbx3XffATBq1Cj69OnDuHHjqFWrFu7u7pe8pqw9heDg4BJDV0lJSTRp0uSS11UnkhSqmflTN6Pwpl3mFwR0bQI9Hne0zdozi60pW3mz15s09G1oYJRCXFnDhg1JSUkhLS0NPz8/Fi9ezJAhJS+K6N+/PyNGjODpp5+mQYMGpKenX7aoTv/+/fnyyy8JCip5P868efMYNmwYnp5FlQebN29Oo0aNSEhIuOwHeFl7Cl27duXAgQMcPnyYoKAgZs+ezTfffFOm11ZVMiFeNZKanEPa1kzqpW6lY6s1cFOMo8TmocxDfLTlI/qG9GX4dcMNjlSIks6fUzj/GDduHO7u7rz88st069aN4cOHExYWdsnr2rZty+uvv86gQYOIiIhg4MCBnDp16pLt7HY7iYmJpZ7MjY2NZdGiRYSGhjoee/bsYdq0aZw5c4b27duzYcOGa3pfbm5uTJw4kcGDBxMeHs7tt99Ou3ZFZU+HDRvGyZNFV+HfeeeddO/enX379hEcHMzUqVOv6XiVQZU2JlaVRUVF6fj4eKPDMMSn41ZAmp3BZ1/gulEd4W/TAbDardyz9B6OZR1j4YiF1POuZ3CkoqrYs2cP4eHhRofhdLt27WLatGklivW4stJ+70qpzVrrqCu9VnoK1cTG309gz3Cj6emfadYhBQa/6WibsXsGO8/s5KVuL0lCEC6pffv2khAqiJxTqAZsNjsbZ27FJz+f6+vOxTz4JQgoutT0wNkDfLLtEwY2G8jg0MEGRyqEqO6kp1ANzPlyG2btQ3jqfAK7NYWuDwBgsVt4cd2L+Hv489L1L8nVRkKIcpOeQhWXkppL+m/J1Mk8SqcWP6NGrABz0a9tys4p7Enfw/t93yfQq3rcLSmEqNqkp1DFffPBepRyp0v+l/jc9JBjWuw9aXuYvH0yw5oPY0CzAVfYixBClI0khSrsp5WHcU8z0/TkKlp2Owc3vgCAxWbhxfUvUturNi90e8HgKIUQNYkMH1VRmZn57J27F//cdHrU+RK3v00Hj6I7OD/d/ikHzh5gYr+J1PKsZXCkQoiaRHoKVdQ376zDrN3okj6ZwJsHQauiIaJdZ3Yxbdc0RrQYQZ+QPgZHKYSoaaSnUAWtWZ6IPc3EdScWEd7tBGrYAgAKbAW8uO5F6nrX5T/R/zE4SiFETSQ9hSomMz2fnd8lEnDuMD2CYnH7awz4FF1ZNGnrJA5lHuLVHq8S4BFgcKRClJ2rV14LDQ2lQ4cOREZGEhV1xZuKDSU9hSpEa83c8Wsw2SE6dzK1RgyEdkXVSbelbGPG7hnc1vo2egb1NDhSIa5OaVNnVxStNVprTKY//457YeW188V8Vq5cSUJCAqNGjbqmY5+vvPbTTz8RHBxM165dufnmm2nbtu0l265atYp69ar+jAPSU6hC1izcS+E5N1qeWEjLqGS4aQIAedY8Xlr/Eo19GzM2aqzBUQpRMVyp8lp1Ij2FKiL9dA67lh2nztn99LxuHuYRn4FfAwA+2vIRR88dZcqgKfi6l20OeSEu9vamt9mbvvfKG16FsMAwnot+7orbuXrlNaUUgwYNQinFww8/7Cj4UxVJUqgC7DY7899ei5vVQg8m49NnOHS4DYC403HM2jOLO9rcQbfGV/5PJERV5OqV19avX0+TJk1ISUlh4MCBhIWF0bt37zIdo7JJUqgCVn69ncI8D9qf+pqmffPhpqLZHk/nnOa5Nc8R4h/C012eNjhKUd2V5Rt9ZXKlymvn1zVo0ICRI0eyadOmKpsU5JyCwU4fyWT/+jPUT93M9WE/YrplIvgEkmvJ5fFfHifXmsuHN36Ij7uP0aEKUaEurLxWUFDA4sWLL9mmf//+zJs3j5SUFADS09M5evRoqfvr378/J06cuGT9tVZe27Zt2yWPCxMClKy8VlhYyOzZs7n55ptLbJOTk+NIMDk5OaxYseKS4aqqRHoKBrJabHz/7no8CvO5wWsynn3vhtaDsGs749aOY//Z/UzsN5FWdVoZHaoQ5XLxOYUhQ4Ywfvx4R+W15s2bX7Hymt1ux93dnUmTJtGoUaMS212p8tqOHTsIDQ11rEtLSytReW3y5Mn06NHjqt/XhZXXbDYbo0ePLlF5bcqUKeTn5zNy5EgArFYrd9111yVlR6sSqbxmoB8+3sDx3fl0SfqI6EHHMT2yBjx8eW/ze0zfNZ1x0eP4e/jfjQ5TVGNSec01lafymvQUDHJoRzLHd+XRJHkdXTpswHTbCvDwZcGBBUzfNZ1RbUZxV9hdRocpRLUgldcqjiQFAxTmWVn+STzeeVn0rjsV9+EvQZNI4k7H8epvr9KjSQ/GRY+TojlCiEonJ5oNMC9mDXbtSVTmF9Tt0wm6j+HouaM8vfppmgY05d0+7+JmknwthKh88slTybasOsTZExB6ajltrz8Ot64j05LFmJVjUCgm9p8o8xoJIQwjSaESZWcW8HvsXvxyUrgheBZud87B4lOHf//0CCeyTzBl0BRC/EOuvCMhhHASSQqVRGvNN6/9jMKNHgWfEjDqaXToDbzx2ytsOr2JN3q9QeeGnY0OUwjh4uScQiVZHLsNS7Y3rU4tpMVNDeGGZ/gy4UvmH5jPgx0e5OYWN195J0II4WTSU6gEBw+f5fiqZGpnHaFHxBpMt//K6hNrmRA/gYHNBjKm0xijQxRCCEB6Ck6Xn2/lx7d/xaRt9DJPxuexWewrSOM/a/5D27pteaPXG5iU/BqEEFWDfBo5kbZrpvzfT5gJIOL0VzT9979JrR3MmF/GEOARwMf9PsbbzdvoMIVwOqUU//jHPxzLVquV+vXrM3z4cIDLTjHxv//9j5iYmGs+7pWmrsjIyCjT1NvnlVa9Dcpfwa0s1dugciq4SVJwEq01X41fjcrypE3SPKL/UY+CjrfxxC9PkFmQycT+E6nvU9/oMIWoFL6+vuzatYu8vDwAfvrpJ4KCghztGzZscMpxr7Tfq00KF1Zvu9DKlSvZsmXLNcV4vnrb0qVLSUhIIDY2loSEhMtuv2rVKrZt24azpvuRpOAkS6fFk3VM0/TUSnoNOITprxN4cd2L7E7bzfgbxhMWeOnkX0LUZEOHDuXHH38Eij5c77zzTkfbhTWZ33jjDdq0acOAAQPYt28fUDRVdlhYGPfeey8RERHcdttt5ObmOl7z3nvv0b59e9q3b88HH3xQYr/nq7Q9+OCDtGvXjkGDBjmS07hx4zh48CCRkZE8++yzfxp/adXboPwV3Kpa9TannmhWSg0BPgTMwBSt9fiL2v8OnJ/kPRv4l9Z6uzNjqgwbFyVwOC6LBmfi6dfxR7we+oWJO79gxdEVPNPlGfo17Wd0iMIFnX7zTQr2VGzlNc/wMBq98EKZtr3jjjt49dVXGT58ODt27GD06NGXFLPZvHkzs2fPZuvWrVitVjp37kyXLl0A2LdvH1OnTqVnz56MHj2aTz75hLFjx7J582amT5/Oxo0b0VrTrVs3+vTpQ6dOnRz7PXDgALGxsXzxxRfcfvvtzJ8/n7vvvpvx48eza9euMtWPLq16W+fOnctdwa2s1dugciq4OS0pKKXMwCRgIJAExCmlftBaX9gvOgz00VqfVUoNBSYD1bq82P7fjxG/+AR1MhMZFPw5vk8sZ9Gp9Xy+43NubXUr97a71+gQhTBEREQER44cITY2lmHDhpW6zdq1axk5ciQ+PkX1Qy6sTRASEkLPnj0BuPvuu/noo48YO3Ys69atY+TIkY6iO7feeitr164tkRSaN2/umLq7S5cuZar6drHLVW8DylXBrazV26ByKrg5s6cQDSRqrQ8BKKVmAyMAR1LQWl844Pc7EOzEeJzu1L4z/DwtAb/cFAbViqHWE9NYcHYnr/z2Cl0bdeWlbi/JJHfCMGX9Ru9MN998M2PHjmX16tWkpaWVus3l/o9cvP78clmm/z9fYAfAbDY7ho/K6nLV29555x3S09PLVcGtrNXboHIquDnznEIQcPyC5aTidZdzP7DUifE4VcapbL6fsAnPgnMMcnuTuo++yedZe3l5w8t0a9yNj/t9jLv50j8aIVzJ6NGjefnll+nQoUOp7b1792bBggXk5eWRlZXFokWLHG3Hjh3jt99+A4q+tffq1cvxmoULF5Kbm0tOTg4LFizghhtuKFM8/v7+l3xol1bB7XLV29atW8fhw4fLVcGtLNXboPIquDkzKZSW7ktN6UqpGylKCqUWkVVKPaSUildKxaemplZgiBUjJ7OAb19Zhclqob91PPVHP8jrufuZuG0if7nuL0zsNxFf97LVkxWiJgsODubJJ5+8bHvnzp0ZNWoUkZGR/PWvfy3x4R4eHs7MmTOJiIggPT2df/3rX47X3HfffURHR9OtWzceeOCBEkNHf6Zu3br07NmT9u3b8+yzz162gltsbCyLFi0iNDTU8dizZw/ffPMNYWFhjgpu13IV1YXV28LDw7n99tsd1dugqILbyZMnSU5OplevXnTs2JHo6Ghuuukmp1Rwc1rlNaVUd+B/WuvBxcvPA2it37pouwhgATBUa73/SvutapXXCvOtfP3MEvIL3emb8RZN7+3CCz52fjn+C/e3v58nOz8pQ0bCMDWl8tqRI0cYPnw4u3btcupxakoFt6paeS0OaKWUag6cAO4ASpQSU0o1Bb4D/lGWhFDV2Kx2vn1hKXlWb65P+5D6o0J5xHSG7ce383z089wVLpXThKhOpIKbE5OC1tqqlBoDLKfoktRpWuvdSqlHits/A14G6gKfFH+btpYlk1UF2q5Z8MpyMnJ9iUyeSuAtboz2OEtS2gli+sQwKHSQ0SEKUWOEhoY6vZcgijj1PgWt9RJgyUXrPrvg+QPAA86MwVl+jFlJcqonbZK/I2BIMvf72MnLy+fzgZ/TtVFXo8MTQohrIrOkXoOVn6/j6CETTVNX4dVvBw8FFOKjfJk5dCat6rQyOjwhhLhmMs3FVdrwbTx7txbSMH0z9FrNE7WzaejTiK+HfS0JQQhR7UlSuArxy3az7ad0ap/bT17U97wQmEGHeh2YOXQmjXwbGR2eEEKUmwwfldHW9YnEzT+GT/4ZMtrN5rOGmQxoOoDxvcfjafa88g6EEKIakKRQBr+v2sf2WXtxt1k40+IrZganMarNKJ6Pfh6zyWx0eEIIUWEkKVzB0k9/4fBWK562AlIazeSb5qd4svOT3N/+frkpTQhR40hSuAxroY35Ly7gTFYggVn7+C1yAWsap/N6j9cZ0XKE0eEJIYRTyInmUpw7lcFXj83nTFYgDc4u4dM+U9nSrJCJ/SdKQhDiGpjNZiIjI2nfvj1/+ctfyMjIAEoW11myZAmtWrXi2LFjjnU2m41OnTo5ynaWhZElMyujXKazSVK4yKHVCcT+31oKtB92y2ReG7qM6PABLByxkF5BvYwOT4hqydvbm23btrFr1y4CAwOZNGlSifaVK1fy+OOPs2zZMpo2bepY/+GHH1713E1Gl8x0drlMZ5OkUExrzbqPf2Jp7AncLVlsbhDDgoEneb/fh8T0iaGedz2jQxSiRujevXuJqanXrl3Lgw8+yI8//kiLFi0c65OSkvjxxx954IGyT3rgKiUznUnOKQCFOQUsenEBp/Mb4Ju9ja+jvqFHl4FMuP55AjwCjA5PiAqxdu5+zhzPrtB91gvx44bbW5d5e5vNxsqVK7n//vsBKCgoYMSIEaxevZqwsJJ1y5966ineeeedUovUXM7VlswsSxEcKHvJzMool+lsLp8U0vad4Id31pHrVg97wQ/M6fc7rw35mOuDuhsdmhA1Rl5eHpGRkRw5coQuXbowcOBAANzd3enRowdTp07lww8/dGy/ePFiGjRoQJcuXVi9enWZj3O1JTPLUi4Tyl4yszLKZTqbSyeFhO9+Y82SNBQ+HPP6FJ9bGjF/wC/4uPsYHZoQFe5qvtFXtPPnFDIzMxk+fDiTJk3iiSeewGQyMXfuXAYMGMCbb77JC8UlQ9evX88PP/zAkiVLyM/P59y5c9x9993MmjXrsse4lpKZZe0plLVkZmWUy3Q6rXW1enTp0kWXl81q04tfmKknPvST/uKemfqRV27UcQd/Lvd+hahqEhISjA5Ba621r6+v4/mWLVt0SEiILiwsdKxPS0vTbdu21VOmTLnktatWrdI33XSTY7lfv346KSnpku0+++wzfc8995RY17VrV71mzRodFxenhw4des3xWywW3bx5c33o0CFdUFCgIyIi9K5du0psk52drc+dO+d43r17d7106dJrPmZ5lPZ7B+J1GT5jXa6nkJN8lnnPzybbow3ueXGk9N7Bh/cuwcPdy+jQhHAJnTp1omPHjiWuDgoMDGTZsmX07t2bevXqMWJE6Zd+X65cJhQNHe3YsYPQ0FDHurS0NL755hveffddR8nMyZMn06NHj6uK+cKSmTabjdGjRztKZg4bNowpU6aQn5/PyJEjAbBardx1111OKZfpbE4rx+ks5SnHuWnRYrZ/l0WhRz2s9gVEPzaI7pG3VHCEQlQdNaUc53k1pVyms1XVcpxVyuzXXuXssShMJm/M9ebz4H/fx8PD2+iwhBBXQcplOp/LJIWgdm3IOXCIsDsb0XPoZ1d+gRBCuCCXSQo33DqKG241OgohhKja5I5mIYQQDpIUhKjhqtvFJKJ8yvv7lqQgRA3m5eVFWlqaJAYXobUmLS0NL69rv8TeZc4pCOGKgoODSUpKIjU11ehQRCXx8vIiODj4ml8vSUGIGszd3Z3mzZsbHYaoRmT4SAghhIMkBSGEEA6SFIQQQjhUu7mPlFKpwNFrfHk94EwFhlMdyHt2DfKeXUN53nMzrXX9K21U7ZJCeSil4ssyIVRNIu/ZNch7dg2V8Z5l+EgIIYSDJAUhhBAOrpYUJhsdgAHkPbsGec+uwenv2aXOKQghhPhzrtZTEEII8SdcJikopYYopfYppRKVUuOMjsfZlFIhSqlVSqk9SqndSqknjY6pMiilzEqprUqpxUbHUlmUUrWVUvOUUnuLf9/djY7JmZRSTxf/Te9SSsUqpWpkgXWl1DSlVIpSatcF6wKVUj8ppQ4U/6xT0cd1iaSglDIDk4ChQFvgTqVUW2Ojcjor8IzWOhy4HnjMBd4zwJPAHqODqGQfAsu01mFAR2rw+1dKBQFPAFFa6/aAGbjD2KicZgYw5KJ144CVWutWwMri5QrlEkkBiAYStdaHtNaFwGxghMExOZXW+pTWekvx8yyKPiiCjI3KuZRSwcBNwBSjY6ksSqkAoDcwFUBrXai1zjA2KqdzA7yVUm6AD3DS4HicQmu9Bki/aPUIYGbx85nALRV9XFdJCkHA8QuWk6jhH5AXUkqFAp2AjcZG4nQfAP8B7EYHUomuA1KB6cXDZlOUUr5GB+UsWusTQAxwDDgFZGqtVxgbVaVqqLU+BUVf/IAGFX0AV0kKqpR1LnHZlVLKD5gPPKW1Pmd0PM6ilBoOpGitNxsdSyVzAzoDn2qtOwE5OGFIoaooHkMfATQHmgC+Sqm7jY2qZnGVpJAEhFywHEwN7XJeSCnlTlFC+Fpr/Z3R8ThZT+BmpdQRioYH+ymlZhkbUqVIApK01ud7gfMoShI11QDgsNY6VWttAb4DehgcU2VKVko1Bij+mVLRB3CVpBAHtFJKNVdKeVB0YuoHg2NyKqWUomiceY/W+j2j43E2rfXzWutgrXUoRb/fX7TWNf4bpNb6NHBcKdWmeFV/IMHAkJztGHC9Usqn+G+8PzX4xHopfgDuLX5+L/B9RR/AJSqvaa2tSqkxwHKKrlaYprXebXBYztYT+AewUym1rXjdC1rrJQbGJJzjceDr4i88h4B/GhyP02itNyql5gFbKLrCbis19M5mpVQs0Beop5RKAv4LjAfmKqXupyhB/q3Cjyt3NAshhDjPVYaPhBBClIEkBSGEEA6SFIQQQjhIUhBCCOEgSUEIIYSDJAUhhBAOkhSEEEI4SFIQogIopYKVUqOMjkOI8pKkIETF6E/NnnNIuAi5o1mIclJK9aJoDpoMIAsYqbU+bGxUQlwbSQpCVACl1DJgrNZ61xU3FqIKk+EjISpGG2Cf0UEIUV6SFIQoJ6VUXYoqgFmMjkWI8pKkIET5NccFijYJ1yBJQYjy20vRnPe7lFKuVAVM1EByolkIIYSD9BSEEEI4SFIQQgjhIElBCCGEgyQFIYQQDpIUhBBCOEhSEEII4SBJQQghhIMkBSGEEA7/D8UoWPK+1yOzAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# We'll keep dt at 0.5, use 4th order Runge-Kutta\n", "t3 = np.arange(21)*dt\n", "x3 = np.zeros(21)\n", "x3[0] = x0\n", "for i in range(20):\n", " # Compute the k's\n", " k1 = dxdt(x3[i])\n", " k2 = dxdt(x3[i]+dt*k1/2)\n", " k3 = dxdt(x3[i]+dt*k2/2)\n", " k4 = dxdt(x3[i]+dt*k3)\n", " x3[i+1] = x3[i] + dt/6 * (k1+2*k2+2*k3+k4)\n", " \n", "# Plot\n", "plt.plot(t, xsol(t), label='Exact')\n", "plt.plot(t, x, label=r'Euler, $\\Delta t = 0.1$')\n", "plt.plot(t1, x1, label=r'Euler, $\\Delta t = 0.5$')\n", "plt.plot(t2, x2, label=r'Midpoint, $\\Delta t = 0.5$')\n", "plt.plot(t3, x3, label=r'RK4, $\\Delta t = 0.5$')\n", "plt.xlabel('$t$')\n", "plt.ylabel('$x$')\n", "leg=plt.legend(loc='lower right')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Fourth order RK is a good general-purpose method for many applications. One can use even higher order methods, e.g., there is an 8th order method due to Dormand and Prince. Whether the extra function evaluations are worth it depends mostly on the properties of the function being integrated. The smoother the function, the better higher order methods do, because they can take very big time steps and still maintain small errors due to the large number of terms in the Taylor expansion they retain. For very non-smooth or rapidly-varying functions, lower order integrators are often preferable." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Multistep Methods\n", "\n", "Another level of sophistication comes from using multistep methods, which we distinguish from RK methods as follows. RK methods use a series of midpoints within a step to approximate the solution, but once they have advanced, they discard all the previous information and begin anew. Multistep methods attempt to make use of the information from previous steps to improve their accuracy. There are a number of classes of methods, many of which go by the general heading of Adams methods, after John Couch Adams, who first explored them. (Adams is best known for correctly predicting the existence of Neptune, based on its perturbations to Uranus's orbit.) The simplest Adams method is as follows:\n", "\\begin{equation}\n", "x_{i+2} = x_{i+1} + \\frac{3}{2} \\Delta t \\left(\\frac{dx}{dt}\\right)_{t_{i+1}} - \\frac{1}{2} \\Delta t \\left(\\frac{dx}{dt}\\right)_{t_i}\n", "\\end{equation}\n", "\n", "We can derive this update procedure as follows. As before, we begin by writing out the series expansion of $x(t)$ evaluated at $t = t_{i+2}$, which is what we want to obtain. We will expand about $t_{i+1}$. This gives\n", "\\begin{equation}\n", "x_{i+2} = x_{i+1} + \\Delta t \\left(\\frac{dx}{dt}\\right)_{t_{i+1}} + \\frac{\\Delta t^2}{2} \\left(\\frac{d^2x}{dt^2}\\right)_{t_{i+1}} + O(\\Delta t^3).\n", "\\end{equation}\n", "\n", "Now we want to write an approximation for $x_{i+2}$ in terms of the derivatives at times $t_i$ and $t_{i+1}$, i.e., using the previous two points, that will be accurate as possible. Let us write this out as\n", "\\begin{equation}\n", "x_{i+2} = x_{i+1} + \\Delta t \\left[(1-\\lambda)\\left(\\frac{dx}{dt}\\right)_{t_{i+1}} + \\lambda \\left(\\frac{dx}{dt}\\right)_{t_i}\\right],\n", "\\end{equation}\n", "where the coefficient $\\lambda$ is to be determined. Now let us Taylor expand $(dx/dt)$ at $t=t_i$ about $t_{i+1}$. Doing so gives\n", "\\begin{eqnarray*}\n", "x_{i+2} & = & x_{i+1} + \\Delta t \\left\\{(1-\\lambda)\\left(\\frac{dx}{dt}\\right)_{t_{i+1}} + \\lambda \\left[\\left(\\frac{dx}{dt}\\right)_{t_{i+1}} - \\Delta t \\left(\\frac{d^2x}{dt^2}\\right)_{t_{i+1}}+ O(\\Delta t^2)\\right]\\right\\} \\\\\n", "& = & x_{i+1} + \\Delta t \\left(\\frac{dx}{dt}\\right)_{t_{i+1}} - \\lambda \\Delta t^2 \\left(\\frac{d^2x}{dt^2}\\right)_{t_{i+1}} + O(\\Delta t^3)\n", "\\end{eqnarray*}\n", "Comparing this expression to the true Taylor expansion derived above, it is clear that if we choose $\\lambda = -1/2$, we will properly recover the first two terms in the Taylor expansion, and thus our approximation will be accurate to order $\\Delta t^3$. Plugging in this value of $\\lambda$, we conclude that the update step\n", "\\begin{equation}\n", "x_{i+2} = x_{i+1} + \\frac{3}{2} \\Delta t \\left(\\frac{dx}{dt}\\right)_{t_{i+1}} - \\frac{1}{2} \\Delta t \\left(\\frac{dx}{dt}\\right)_{t_i}\n", "\\end{equation}\n", "is accurate to $O(\\Delta t^3)$, and thus produces a second order accurate update scheme.\n", "\n", "As with the midpoint method, this procedure can be generalised to higher orders by using more than the previous two time steps. For each extra time step kept, one gets to cancel out another order in the Taylor series, and thus gain an order of accuracy. The fourth order Adams method, which is analogous to the 4th order RK method we wrote down previously, is\n", "\\begin{equation}\n", "x_{i+4} = x_{i+3} + \\Delta t\\left[\n", "\\frac{55}{24}\\left(\\frac{dx}{dt}\\right)_{t+3} -\n", "\\frac{59}{24}\\left(\\frac{dx}{dt}\\right)_{t+2} +\n", "\\frac{37}{24}\\left(\\frac{dx}{dt}\\right)_{t+1} +\n", "\\frac{3}{8}\\left(\\frac{dx}{dt}\\right)_{t}\\right]\n", "\\end{equation}\n", "\n", "Compared to RK methods of the same order, the Adams method achieves the same accuracy with fewer function evaluations. In the Adams method we only need to compute $dx/dt$ at whole time steps, not at intermediate times as in the midpoint method. The price for this efficiency is that the bookkeeping and memory requirements of the Adams method are greater, because need to keep track of not just the value of the derivative at the current point, but at some number of previous points. In addition, with the Adams method we need to worry about how to start off the integration, because for the $n$th order accurate Adams method, we need at least $n$ previous points before we can use it. One common method for handling this is to use Runge-Kutta to get the first points needed, then switch to the Adams method.\n", "\n", "Here is an example of the Adams method applied to our sample problem." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEMCAYAAAArnKpYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi40LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcv7US4rQAAIABJREFUeJzt3XlcVdXawPHfOod5UhFxABUqZ1RU0HJOnDPN6lUbbnVtuA2WdbObVrfZskIzrzaYU5Ngk5azaVlq5UyGGoqCirMgyMwZ1vsHeAJFReWwGZ7v53Pi7L3W2fvZQvs5e1qP0lojhBBCAJiMDkAIIUTlIUlBCCGEgyQFIYQQDpIUhBBCOEhSEEII4SBJQQghhIMkBSGEEA6SFIQQQjhIUhBCCOHgYnQAlysgIECHhIQYHYYQQlQpW7duPaW1rnepflUuKYSEhLBlyxajwxBCiCpFKXWgLP3k9JEQQggHSQpCCCEcJCkIIYRwkKQghBDCQZKCEEIIB6clBaXUHKXUCaVU/AXalVJqmlIqUSm1QynV0VmxCCGEKBtnHinMAwZepH0Q0Kzo9RDwgRNjEUIIUQZOe05Ba/2LUirkIl2GAZ/qwnqgvyulaiulGmqtjzorJiFExdNaY7FbCl82y9/v7Rasdis2bcOu7YU/7faS08V+2rUdq93qmKe1Rms7drsNbbei7Vbs2oK227HbrVitVqwWC7Z8C7YCG7YCG1aLFZvFhrbY0FY72moDqw2sGmw2tBWw2sFmB7sdbIBNg92OsoO2adAa7BT+1Kqwn9agKXppVFGVY+3oV9QGhW1nqyDrov9oBWgUxeef/7N2SCB3/3eic35RRYx8eC0IOFRsOqVo3nlJQSn1EIVHEzRp0qRCghOiJrDZbWQWZJJjzSHHkkO2NZscS45jOtea65jOtmQ75udYc8i15JJrzaXAlo/FVoDFlk+BrQCLzYLNYsWcZ8Yl34yrxRV3iyvuBa54Fbjime+CZ4EZd4sZs92Eiw1MdoVZmzDZwaRB2Qt3ngqKdrJFe1INhXvkoh0xGrCji34WzrMXe1Uv6QnO3yYjk4IqZZ4uZR5a65nATICIiIhS+wghCmmtybRkcir3FKm5qaTmpnIq99Tfr7xTjnlpeWnY9Tk7Gg2uFoV3nie+ed745HvineeGb547frku+OWbqGtVmK0aZVeg3UC7AO7owq/alP6/sgYKil7nUoAZMKFU0U9MKK2K3qvCaUDhUjStiqYLf6IUSimUKlyaUiZQFM0repkUJqXApDApEyiFyWRCmQo/pExmTEqhzGaUqXBamUyYzSbHe5NZYTK7FC7DZMJkMqPMJpS56P3ZaZMJk9mE2WxGmc1F/VRRHxPKrFDKjKmor1IKTKai9ZkLt8dkApO5MG6ziVr1A8vnj+QijEwKKUDjYtPBwBGDYhGiSsm35bMvfR8JaQnsOb2Hw1mHS+z8C+zn73hdtZlG+T40OlOb6zK86JDVCI+sYMwFGmx2tN2GXVvRuoDzd+qWoheAG0q5YcINk3bFpBUmrTAX7bZNSmFWpsKX2YyLqwsu7u64ebjj5u2Nh58P3n6+ePv74VPbG28/X9x9vDB5uGPy8EC5u6Pc3DC5uxe+N5ud/K8pijMyKXwPjFFKxQJdgAy5niBESVprjmUfY8/pPSVeyWeSHd/wPcweBHsFEmh3o8lpb/xO1cIz3YRbFqgcsBUorDYLNp3P3zv7nMLlKw/syguTdsNFm3GxK1zs4ILC1WTCzdUNTy8PvH18qBVQi7pBAdRqFIBbXX/M/v6Y69TB7O2NcnMz5h9IlDunJQWlVAzQGwhQSqUALwGuAFrrD4FlwGAgkcK/0H86KxYhqoIcSw570/cW7vjTCnf+e0/vJdOS6egT5BlIM5fadM9qTu1DLphTIS/bTr6tALs++02+ABuQi0IpH0zKC1ftgo9V4W7TeLm44OfrRb2gejS8riFejRth9vfHxb9wR2/y8Sk8lSFqJGfefXTHJdo18Jiz1i9EVZB4OpGVB1ay+sBqEtMTHfO9Xb1p7h3EAI8QGpzIxycF9GnFmTwTudY8wM4ZAFwxm/zx0G64WzQeFhteZjN1/LxoGBxAndBA3Bs3xjU4GLfgIEy1askOX1xUlRs6W4iqLvF0IqsOrGJl8kr2Z+xHoYgIDOeRBv2osy8dl305FJy2kZ6vyLNmkYWdLADljln54WMPwDfPQl1XEyHX1qdeh5Z4NG+Oa+PGuNSrV3hxUogrJElBiAqwL30fq5ILE8G+jH0oFJ38ruWmvHb4xdtJTcsj17qXXMfN7B64qNr42gPwyy2gnqsiJDSQOuEt8Ahri0fLFpi8vIzdKFEtSVIQwkn2Z+xnZfJKViWvIjE9EYUi3KMhjxxrSp397pzMNJNpyyATMJkC8bMFUCsnnwAXO02vCaR2u5Z4hLXBo3VrzD4+Rm+OqCEkKQhRjpIykgoTwYFV7D29F4WinWs9HklqjF+KN6eyIdeeSy4FuJjqE5hXmya6gBY92+Bzw/V4hoVhrlXL6M0QNZgkBSHKwbqUdUzbPo2/0v4CINylAf9KvBbvwx6k51jI1fnkUoCbCiQwx49mnoqQnhH49e+H+7XXGhy9EH+TpCDEVTh45iBvb36bn1N+JlQF8uDe9nimaDLzcsjXFvLJx4MAAjMLaBXgSaO+3fDtG4Vro0ZGhy5EqSQpCHEFciw5zPpzFvN2zqN2tif3x3XAdjoTC+lYlDvetrrUz8ylTdM6BPa/EZ8bb8TF39/osIW4JEkKQlwGrTUrklcQvXESeWkFjNrRFvPpM9hIw9NenyYZ2bRpHUzdAVF49+iJ2cfb6JCFuCySFIQoo4S0BCb+8hxJR47T/8/meKWdBlLxstejjaWA9vffgu+AAZhkyAdRhUlSEOISMvIzmPLzf1m7J47eO5vTPs0OnMDLVpf2WhP20B349usrD42JakGSghAXYLPbiNkyg/m/L6LT7mYMTQsAjuFt9ae9i4mwx+7Fp3dvGTZCVCuSFIQoxcb9q5m2ZCrX7WpM1OnawGG8rbXp4FGbNk/cj3fXrpIMRLUkSUGIYo5nHmHS589RK86HjuluwCG8rbXo5FOXNmMewisy0ugQhXAqSQpCFPnsu+kkL00g+Ewm6FP4WHyJqBNI68cfxjM83OjwhKgQkhREjZebdYaP3vkv9j1peNlP42PxoVO9+oSNHYNH69ZGhydEhZKkIGq0uJ+WsG7BamynD6Aw0cE1gK6vPYdH8+ZGhyaEISQpiBopOzubdTNeIeHPPKwF+/G0ejEwqiehDz8qt5aKGk2SgqhxdmzfyIFPZrP3eB7ankZgnivDXpuAX7sORocmhOEkKYgaw2bXrPjsfdJ+SeJE1glMWtHI25XbZ3+Ki4+v0eEJUSlIUhA1wrHUdH6b9hIp+xUFBYl4Wt3xuSGAkU9/KM8bCFGMJAVR7W3+YycHP57FgdR0tD0Vv3wbro924R/9npGEIMQ5JCmIaktrzTffLCVj2e+kZydj0po8j1N4vfAod7W9x+jwhKiUJCmIainPYuOz6I/J3bkXiyUBL6srv7VOZvg9LzG82XCjwxOi0pKkIKqd46dz+falD8g9+Ufh6SJt5/O+STw36C0GhAwwOjwhKjVJCqJa2R5/nF8nzyEvZxNmrcmvn8dHnU8z5cZp9AzuaXR4QlR6khREtbFu8wG2T/sIS8EOfK1mtnTL4o/6WXwQ9SGRDWQgOyHKQpKCqBZWbNjH3o/mYinYQUPlymfD0jnjWsCsvrNoW6+t0eEJUWVIUhBV3jc/7ubYvFgK8uOor9yYOeQkuJqZ238uzevIGEZCXA5JCqJKi1mzi9OffkVe/lYClQdf3HIGF7M7swfMpqlfU6PDE6LKkaQgqqxPV+8i+/NvyM3bTIDyYPt9DTl2Yh+fDvpUEoIQV0iGgxRV0pwfdpL7xbfk5G6iNu64jhvMD8fX8mSnJ+UaghBXQY4URJXz2do9WOYvIitnE77alcg3n+G+Xx+lV3Av7mktTyoLcTUkKYgq5cvfksn+9Fuyczbhrc3c+m409258HH8Pf17v9rqMZSTEVZKkIKqM77cdJnXWl+Rkb8TTbuKuKe/xWuJ0DmcdZs6AOdT2qG10iEJUeXJNQVQJvySc4MD7seRkb8TdrrnrrWhW5W5mefJyHgt/jI71OxodohDVglOTglJqoFIqQSmVqJQaX0p7LaXUYqXUH0qpnUqpfzozHlE17TiUzubJCyjI+h1Xm407X53IiTp23tz0Jjc0vIH7295vdIhCVBtOSwpKKTMwAxgEtAbuUEq1PqfbY8AurXV7oDcwWSnl5qyYRNWTfCqLZW/Ewpn1uNgLuGPCBDyuC2Xcz+PwcfXhjR5vYFJywCtEeXHm/02dgUSt9X6tdQEQCww7p48GfFXh1UEfIA2wOjEmUYWkZeXz+ctf45r+C2Z7HiMef4x6Hbvw5qY3ScpIYlLPSQR4BhgdphDVijOTQhBwqNh0StG84qYDrYAjwJ/AWK21/dwFKaUeUkptUUptOXnypLPiFZVIgdXO9JcW4ZW6BpMti1vvGUnDHv1ZvG8xixIX8VC7h7i+4fVGhylEtePMpFDavYH6nOkBQBzQCAgHpiul/M77kNYztdYRWuuIevXqlX+kolLRWjP11aX4HF0OtgyGDetDkyF3kpSRxGu/v0an+p14uP3DRocpRLXkzKSQAjQuNh1M4RFBcf8EvtWFEoEkoKUTYxJVwEdT1uCS+B3amsqQ7tdxzV1PkmfNY9zP43A3u/NWj7dwMcnd1EI4gzOTwmagmVIqtOji8Sjg+3P6HASiAJRS9YEWwH4nxiQqucXLdpO77Vu09TgDWnnS/PHJAERviWbP6T1M7D6R+t71DY5SiOrLaV+3tNZWpdQYYCVgBuZorXcqpR4uav8QeA2Yp5T6k8LTTc9qrU85KyZRuSUcTGd/TCx260G61ssn7IWvQClWJq9kQcIC/tnmn1I9TQgnc+oxuNZ6GbDsnHkfFnt/BOjvzBhE1XAmt4DvXp2PuWAbDbFx/euzwdWDQ5mHePnXl2lXrx2Pd3zc6DCFqPbkBm9hOK01k99ciTl7HW52M7eOfwRVpwkWm4Vnfn4GpRRv93wbV5Or0aEKUe3J1TphuJnf76L2vh+w27O4uXcoHh2GAvDutnfZmbqTqb2nEuRz7t3MQghnkKQgDLUp8RS53yzEbt1PuB+EPPIuAD8d/InPdn3GnS3vJKpplMFRClFzyOkjYZjUrHyWvrMQW/5m6thN3PjOTDCZOZp1lBc2vEAr/1Y8HfG00WEKUaNIUhCGsNs1b0z7mVpn1mHWitufvAtT7UZorXlu/XPYtI3oXtG4mWUoLCEqkiQFYYiPV+2h8a5VaHsaA9r749dtJABL9i9hy/EtPBPxDE38mhgcpRA1j1xTEBVux6F0MmMWoSx/0cxV0+rZwruUMwsymbxlMu0C2jG82XCDoxSiZpIjBVGhsvOtfP7OYlTeRrztLgx++21wKTxF9H7c+6TlpfFcl+dkOGwhDCJHCqJCvTl3Mw1OrQVt57b/i8SlURsA9pzeQ8xfMdze/HbaBLQxNkghajBJCqLCLNt2hID1i7HZjtOrAdT7v+eAwofXJv4+EV83X57o8ITBUQpRs8kxuqgQJzLz2Dbja2yWHQRpTcTrH4MqHF19adJStp3YxtiOY6ntUdvgSIWo2SQpCKfTWvPe5FV4Zq/H3e7G8KdGgV9DALIKspi8ZTJhdcO4tdmtBkcqhJDTR8Lp5q/eQ8CeFdh1HsPCzbhff7ej7f0/3ic1N5X/9fmfXFwWohKQpCCc6uCpLI59Fgu2g3R0PUPjJ75ynDbae3ov83fP59ZmtxIWEGZwpEIIkNNHwom01nz+2gLI30pdm4le4x4D3/qOtjc2voGPmw9jO441OFIhxFmSFITTfBa7GY8TP+KiXbi9rxum9iMcbcuTlrPl+Bae6PAEdTzqGBilEKI4OX0knGJ/SgapS+aj7WcY4H8QnztXOE4bZVuyid4STeu6rbmt2W0GRyqEKE6Sgih3drudRS9/hLYm0sKeS8v7n3DcbQTwQdwHnMw9ydQbp2I2mQ2MVAhxLjl9JMrd/Jk/ojN/xcfuzqB+LtDpn462fen7+GL3F9za7Fba1WtnYJRCiNLIkYIoVyfScjm5biGguSVoC+bhP4Cp8LvH2YvLnq6ecnFZiEpKjhREufr8pdnYrQdooXOpf8sjUK+5o21l8ko2HdvE2A5j8ffwNzBKIcSFSFIQ5Wblz3vQJzfgqj0Z0PkUdH/K0ZZtyeadze/Qyr8Vtze/3cAohRAXI6ePRLnIybcSP2su6Exu9DyE663TwMXd0f7RHx9xIvcEk3tPlovLQlRicqQgysXH05ZCwU7q2jwJG9oZrunlaNufvp/Pdn3GLdfdQnhguIFRCiEuRY4UxFXbfeg0tu1LULgwNGQ7asCvjjatNW9sKry4/GTHJw2MUghRFnKkIK6K1ppFE2ejbUdpbc/Ef+QE8Al0tK86sIqNRzfyeIfHqetZ18BIhRBlIUlBXJXYpTtwS9+Iu/ahb4886HSfoy3HksM7m9+hpX9LRjQfceGFCCEqDTl9JK5YenYBh2M/Rek8+ngk43LrXCh2EfmjHR9xPOc40b2i5eKyEFWEHCmIK/bRu4tQlgQCrV60urUnBEc42pIykvh016cMvXaoXFwWogqRIwVxReL2ncJ15zIUntwcugXVb6OjTWvNmxvfxNPsyVOdnrrIUoQQlY0cKYjLZrdrlr01E20/RVt7OrVHjAfvAEf7usPr+O3obzwa/igBngEXWZIQorKRpCAu2/zFW3HP2IKnvTa9u2ZBxGhHm9VuZfKWyTT1a8rIliMNjFIIcSXk9JG4LOk5BRz78lMUNvp6bMdl+EclLi5/u/db9mfsZ+qNU3E1uRoYqRDiSsiRgrgsH0/+CmXdTwOrJ81ujoCQ7o62bEs2M+Jm0DGwI30a9zEwSiHElXJqUlBKDVRKJSilEpVS4y/Qp7dSKk4ptVMp9bMz4xFXJz7pJKadyzDhw81NfkX1f71E+5z4OaTlpTEuYhyqqMqaEKJqcdrpI6WUGZgB9ANSgM1Kqe+11ruK9akNvA8M1FofVEoFlr40YTStNUvefB9XnUEHWx5+wx6F2o0d7ceyj/Hpzk8ZFDqItvXaGhipEOJqOPNIoTOQqLXer7UuAGKBYef0uRP4Vmt9EEBrfcKJ8YirsHDpVlwztuFlr0uPTkeg6xMl2qdvn45N26R4jhBVnDOTQhBwqNh0StG84poDdZRSa5VSW5VS9zgxHnGFcvIt7I+ZBZjo77EZ85BXwc3L0f5X2l98v+977m51N0E+5/6KhRBViTPvPirtpLIuZf2dgCjAE/hNKfW71npPiQUp9RDwEECTJk2cEKq4mDmT56OsKQQV1OKafkEQdpujTWtN9JZo/Nz9eKDdAwZGKYQoD848UkgBGhebDgaOlNJnhdY6W2t9CvgFaH/ugrTWM7XWEVrriHr16jktYHG+A4dPkb9jGWZqc1PQD6hBk6DYReT1h9ez8ehGHmn/CH5ufgZGKoQoD85MCpuBZkqpUKWUGzAK+P6cPt8BPZRSLkopL6ALsNuJMYnL9PWr74HOppP1BL5Rt0JQJ0fb2QfVmvg2kVFQhagmnHb6SGttVUqNAVYCZmCO1nqnUurhovYPtda7lVIrgB2AHZiltY53Vkzi8vz0w2ZIj8PHXp8b2iyHqHkl2hclLmJfxj7e7f0urmZ5UE2I6sCpTzRrrZcBy86Z9+E50+8A7zgzDnH5bFYr2+Z9CMqd/u6/4tLnCfBr5GjPseQwfft0OgR2IKpJlIGRCiHKkzzRLEr1+dQvwHqcxgVehLTX0PXxEu1zd84lNS9VHlQTopqRsY/EeTIysji1ZRlm5c/ghitQ/aaCm7ej/Xj2cebFz2NgyEDa1WtnYKTiUiwWCykpKeTl5RkdiqggHh4eBAcH4+p6Zad0JSmI83z22gzQ2YRZLfi0awntRpVonxE3Qx5UqyJSUlLw9fUlJCREjuhqAK01qamppKSkEBoaekXLkNNHooSkfUfIP/Qb7tSnR8haGPAGmP7+M0lIS2BR4iLubHknwb7BxgUqyiQvL4+6detKQqghlFLUrVv3qo4MJSmIEhZOmgrYuUHvwz1iYIlRUAGmbJ2Cr5svD7Z70JgAxWWThFCzXO3v+5JJQSk1VclfVY2w4eft6DO78bPVJ7x5PPR7tWT74Q38euRXHm7/MLXcaxkUpahqzGYz4eHhjtekSZPKbdlxcXEsW7bs0h1FmZXlmkIW8L1SapTWOlsp1R94SWvdzcmxiQr2+6yPADdudN+IuetoCLjO0Waz24jeEk1j38aMajHqwgsR4hyenp7ExcU5ZdlxcXFs2bKFwYMHO2X5NdEljxS01i8AMcBapdR64Gmg1NoIour69tMlUJBCoKU217ZKh17Plmj/bt93JKYn8mTHJ+VBNXHVMjIyaNGiBQkJCQDccccdfPzxxwA88sgjRERE0KZNG1566SXHZzZv3kzXrl1p3749nTt3JiMjgxdffJEFCxYQHh7OggULDNmW6uaSRwpKqSjgQSAbaAjcr7VOcHZgouJYCiwkLV+ASfkxoM5q1I1Pg3ddR/vZB9Xa12tPv6b9DIxUXI1XFu9k15Ez5brM1o38eOnmNhftk5ubS3h4uGN6woQJjBw5kunTp3PfffcxduxYTp8+zYMPFl6nmjhxIv7+/thsNqKiotixYwctW7Zk5MiRLFiwgMjISM6cOYOXlxevvvoqW7ZsYfr06eW6XTVZWU4fPQ/8V2u9XinVFliglPq31vpHJ8cmKsi86HlgP01IQW3qdfaFzv8q0f7Jzk84mXuSKb2nyEVLcdkudPqoX79+fPXVVzz22GP88ccfjvlffvklM2fOxGq1cvToUXbt2oVSioYNGxIZGQmAn58Mvugsl0wKWus+xd7/qZQaBHwDdHVmYKJipJ3K4MyOVbioevRrtATV7wNw9XC0n8w5ydydc+nftD/hgeEXWZKo7C71jb6i2e12du/ejaenJ2lpaQQHB5OUlER0dDSbN2+mTp063HfffeTl5aG1li8kFeSyb0nVWh+lsP6BqAY+mzgddC7tCtLwCW9bolYCFD6oZrFbeLLjkwZFKKqrd999l1atWhETE8Po0aOxWCycOXMGb29vatWqxfHjx1m+fDkALVu25MiRI2zevBmAzMxMrFYrvr6+ZGZmGrkZ1c4VPdGstc4t70BExftrVxLWI5vw1A3pds030H9JiVoJe07vYWHiQu5qdReN/RpfZElCXNi51xQGDhzI6NGjmTVrFps2bcLX15eePXvy+uuv88orr9ChQwfatGnDNddcQ7duhTc5urm5sWDBAh5//HFyc3Px9PRk9erV3HjjjUyaNInw8HDHtQpxdZTW5xZDq9wiIiL0li1bjA6jWpjywNPozESi7GmE39YERn1Rov3h1Q+z4+QOlt+6XJ5LqKJ2795Nq1atjA5DVLDSfu9Kqa1a64hLfVaeaK6hfvlhIzozgVq2+rRtsRv6vlKifcPhDWw4vIF/tfuXJAQhahBJCjWQ1prNn3wMypMo11/Pe1DNYrfw1ua3aOLbhDta3mFgpEKIiiZJoQb6evYisByjYb4fIW0yzntQLWZ3DEkZSTwT+QxuZjeDohRCGEGSQg1TkJfPwTVfYVK16V9nFap3yQfVUnNT+eCPD+jWqBu9gnsZGKkQwgiSFGqYeW/PBvsZrs3T1A3zgy4Pl2j/3/b/kWfN4z+d/yP3hQtRA0mRnRrk5PE0MneuwVXVp0+j71F9Z5R4UG1X6i6+3fstd7e+m2tqXWNgpEIIo8iRQg0y/43/AQWE55/Ap31rCLvd0aa1ZtKmSdTxqMPD7R++8EKEENWaJIUaYteORKzHtuKlG3H9NRvOq6i2PGk5209s54kOT+DnJuPKCFFTSVKoIZZP/R9gpps9HrfIQRDydzmMHEsOk7dOppV/K2657hbjghTV1uUW2vHx8Sn3GBYuXIhSir/++ssxLyUl5aqH3F6xYgUtWrTguuuuu+B2jR49msDAQMLCwq5qXRVBkkIN8NOy9ZC9D39rIG1aJJz3oNqc+DmcyDnB+M7jMZvMBkUpqrOzI6WefY0fX34lWbTW2O32S/aLiYkhIiKC2NhYx7w1a9awbdu2K163zWbjscceY/ny5ezatYuYmBh27dp1Xr/77ruPFStWXPF6KpIkhWpO2+1s+2I2SnnTx20d5m4lH1Q7nHWYeTvnMSh0EB3rdzQwUlHTJCcnl/jmHB0dzcsvv3xev88//5zOnTsTHh7Ov/71L2w2G8nJybRq1YpHH32Ujh07cujQoYuuKysri59//pnZs2cTExMDwPr16/n3v//N119/TXh4OElJSZe9DZs2beK6667jmmuuwc3NjVGjRvHdd9+d169nz574+/tf9vKNIHcfVXMLZn4F1pM0yq9P44is8x5Um7xlMiZl4t+d/m1QhKLCLB8Px/4s32U2aAuDLl1zubRCO126dLnk53bv3s2CBQvYsGEDrq6uPProo3zxxRf07NmThIQE5s6dy/vvv3/J5SxatIi+ffvSrl07vL292bZtG927dycyMpLo6OjzTuv06NGj1NFXo6Oj6du3r2P68OHDNG7892CRwcHBbNy48ZLxVGaSFKqxvJxcDq9diEnVpX+dlZj6PFviQbVNRzfxw4EfGBM+hgbeDQyMVFR3pRXaSU5OvuTn1qxZw9atWx3FdXJzcwkMDKRnz540bdqU66+/vkzrj4mJ4aGHHgJgxIgRxMTE0LFjRxISEmjRosV5/detW1em5ZY2oGhVf75HkkI1Nm/SR6CzaJarqHN9Xej8kKPNarfy5qY3CfIJ4t429xoYpagwZfhGX5FcXFxKXAvIy8s7r4/WmnvvvZc333yzxPzk5GS8vb3LtJ7U1FQ2bdrEt99+C8DIkSPp1asX48ePp1atWri6nl9zvKxHCsHBwSVOXaWkpNCoUaMyxVVZSVKopo4cOEx2wlrcaciNwd+h+s8CF3dH+1d7viIxPZF3e7+Lh4vHRZYkhHPUr1+fEydOkJqaio+PD0uWLGH6EjokAAAeX0lEQVTgwIEl+kRFRTFs2DCeeuopAgMDSUtLu2BRnaioKD799FOCgoJKzP/6668ZPHgw7u6Ff/+hoaE0aNCAXbt2XXAHXtYjhcjISPbu3UtSUhJBQUHExsYyf/78Mn22spILzdXUgjemAprIvAN4R3SCVjc72tLz0pm+fTpdGnQhqokU0RPOd/aawtnX+PHjcXV15cUXX6RLly4MGTKEli1bnve51q1b8/rrr9O/f3/atWtHv379OHr06Hn97HY7iYmJpV7MjYmJYfHixYSEhDheu3fvZs6cOZw6dYqwsDB+/fXXK9ouFxcXpk+fzoABA2jVqhUjRoygTZvCsqeDBw/myJEjANxxxx3ccMMNJCQkEBwczOzZs69ofRVBiuxUQxvXbGT9zNeoZQvi3tAvcX1yDQT9fWfRxN8n8uWeL/nq5q9oXqe5gZEKZ6spRXbi4+OZM2cOU6ZMMTqUSkGK7AgHbbezYe6HKOVNlOlXXLuOLJEQ9pzew5d7vmRE8xGSEES1ERYWJgmhnEhSqGa++SAWbTlJUK4XTducgqgXHW1aa97a9Ba+br6M6TDGwCiFEJWVJIVqJDv9DAfWLcRFBdAvYCWm3k+B398X0lYfXM2mY5sYEz5GSmwKIUoldx9VI59N/B/oXNrk2qkTWRtu+PtoIM+aR/TmaJrVacbtzW+/yFKEEDWZU48UlFIDlVIJSqlEpdQFBztRSkUqpWxKKdlbXaH9OxPJPrgRL3sjely7FtX/VXDzcrR/svMTjmQfYULnCbiY5LuAEKJ0TksKSikzMAMYBLQG7lBKtb5Av7eAlc6KpSb4fvJUwIXuxOPepiOE3eZoO5Z9jNnxs+nXtB+RDSKNC1IIUek580ihM5Cotd6vtS4AYoFhpfR7HPgGOOHEWKq1td+uxpadTECBP62b7YbBb0OxR+2nbJ2CXdt5OuJpA6MUQlQFzkwKQUDxoQtTiuY5KKWCgOHAh06Mo1qzFhSw7eu5mJQf/X1/xNzlLmjUwdG+7fg2lict57429xHkE3SRJQkhhHOTQmmjQp37pNxU4Fmtte2iC1LqIaXUFqXUlpMnT5ZbgNXBgujZaFsG1+RCg5YWiHrJ0Waz25i0aRL1veozOmy0gVEKIaoKZyaFFKBxselg4Mg5fSKAWKVUMnA78L5S6rzSX1rrmVrrCK11RL169ZwVb5WTevgEx/74ATfq0zd4Far3s+Dz97/PN3u/YXfabp6OeBovV6+LLEkI56rplddCQkJo27Yt4eHhRERc8qFiQznzNpTNQDOlVChwGBgF3Fm8g9Y69Ox7pdQ8YInWepETY6pWYidOBaxEFBzCu2VIiVFQD2cdZvKWyXRp2IWBIQMvuAwhKkJpQ2eXF601WmtMpot/xy1eee1sMZ81a9awa9cuRo4ceUXrPlt57YcffiA4OJjIyEiGDh1K69bn3VPDTz/9REBAwBWtpyI57UhBa20FxlB4V9Fu4Eut9U6l1MNKqYedtd6aYseGOPJSd+BnDSSi+WYY/A64uAFg13b+u+G/KKV4retrVX58d1E91aTKa1WJU29Y11ovA5adM6/Ui8pa6/ucGUt1YrfbWfPhdJTyJMptI66dboZrb3S0x/4Vy+Zjm3ml6ys09GloYKSiMnlr01v8lfbXpTtehpb+LXm287OX7FfTK68ppejfvz9KKf71r385Cv5URvIUUxW0+OOvsRccIyjPn9BOp6D/REfbwTMHmbptKt2DujP8uuEGRinE32p65bUNGzbQqFEjTpw4Qb9+/WjZsiU9e/Ys0zoqmiSFKib7TCaJP32DWdVhUOAqVO9xULvwm4rNbuOFDS/gYnLh5RteltNGooSyfKOvSDWp8trZeYGBgQwfPpxNmzZV2qQgA+JVMV+8NgN0NmF5Z6jVthF0fdzR9vnuz9l+YjsTOk+gvnd9A6MU4tKKV17Lz89nyZIl5/WJiori66+/5sSJwmdb09LSOHDgQKnLi4qK4vDhw+fNv9LKa3Fxcee9iicEKFl5raCggNjYWIYOHVqiT3Z2tiPBZGdns2rVqvNOV1UmcqRQhezfuZ/Mg7/haa9Pz2sXwk1fO0ps7s/Yz7Rt0+jduDdDrhlicKRClHTuNYWBAwcyadIkR+W10NDQS1Zes9vtuLq6MmPGDBo0aFCi36Uqr+3YsYOQkBDHvNTU1BKV12bOnEnXrl0ve7uKV16z2WyMHj26ROW1WbNmkZeXx/DhhadyrVYrd95553llRysTqbxWhUz951hsOQcYaEuhzci28H9zAbDardyz/B4OZh5k0bBFBHhW/tveRMWQyms109VUXpMjhSpi5ZdrsOXsI6AggJbhW2DAYkfbvJ3z+PPUn7zT8x1JCKJGkspr5UeuKVQBlgIL8Ys+QSkfBvr9hHnAC+BXeKvp3tN7eT/uffo17ceAkAEGRyqEqOokKVQB896YBbY0muVYCby+MUQ+AIDFbuH59c/j6+bLC9e/IHcbCSGumpw+quQOJR3nzF+rcaMufZouQw1bBebCX9usP2exO2037/Z+F3+P8y+wCSHE5ZIjhUruqzfeBV3A9fn78R7ykGNY7N2pu5n5x0wGhw6mb9O+l1iKEEKUjSSFSuzbecvQZ+KpYwmgQ+fTcONzAFhsFp7f8Dy1PWrzXJfnDI5SCFGdyOmjSur4kZMkrZiHWflxk/caXP5vDrgVPsH5wR8fsPf0Xqb3mU4t91oGRyqEqE7kSKGSivnvm6DziMw+SuCwftCs8BRR/Kl45sTPYdi1w+jVuJfBUQohqhs5UqiEFn7wJbasPdTLr0uXyF2owd8AkG/L5/n1z1PXsy7/6fwfg6MUQlRHcqRQyRzZf5j9Py/AhTrcXG8lLrdFg1fhnUUzts9gf8Z+Xu36Kn5ufgZHKkTZKaX4xz/+4Zi2Wq3Uq1ePIUMKh2S50BATL7/8MtHR0Ve83ksNXZGenl6mobfPKq16G1x9BbeyVG+DiqngJkmhErHb7Xz5ykTQNroX7KNO337QprA6adyJOObtnMftzW+nW1A3gyMV4vJ4e3sTHx9Pbm4uAD/88ANBQUGO9l9//dUp673Uci83KRSv3lbcmjVr2LZt2xXFeLZ62/Lly9m1axcxMTHs2rXrgv1/+ukn4uLicNZwP5IUKpFvoudiyztIozwfwjsdgZsmA5BrzeWFDS/Q0Lsh4yLGGRylEFdm0KBBLF26FCjcud5xxx2OtuI1mSdOnEiLFi3o27cvCQkJQOFQ2S1btuTee++lXbt23H777eTk5Dg+M2XKFMLCwggLC2Pq1Kkllnu2StuDDz5ImzZt6N+/vyM5jR8/nn379hEeHs4zzzxz0fhLq94GV1/BrbJVb5NrCpVE0o5EDm5djLsOYGjwEszDPgSfQACmbZvGgTMHmNV/Ft6uZRtDXohzHXvjDfJ3l2/lNfdWLWnwXNluix41ahSvvvoqQ4YMYceOHYwePfq8YjZbt24lNjaW7du3Y7Va6dixI506dQIgISGB2bNn061bN0aPHs3777/PuHHj2Lp1K3PnzmXjxo1orenSpQu9evWiQ4cOjuXu3buXmJgYPv74Y0aMGME333zD3XffzaRJk4iPjy9T/ejSqrd17Njxqiu4lbV6G1RMBTdJCpWAtcDCd2+/CZiJ4g+8ew+BtrcDsPnYZj7f/TmjWoyiS8NLly8UorJq164dycnJxMTEMHjw4FL7rFu3juHDh+Pl5QVQojZB48aN6dat8NTp3XffzbRp0xg3bhzr169n+PDhjqI7t956K+vWrSuRFEJDQx1Dd3fq1KlMVd/OdaHqbcBVVXAra/U2qJgKbpIUKoHY16ZjsxznmlxvWnTPhpsKR3s8ln2MZ395lsa+jXmq01MGRymqurJ+o3emoUOHMm7cONauXUtqamqpfS60Qzx3/tnpsgz/f7bADoDZbHacPiqrC1Vve/vtt0lLS7uqCm5lrd4GFVPBTa4pGGzXhjiO7/kJT3s9Bl/3A6ZbpoOXPzmWHB7/8XFyrDm8d+N7eLl6GR2qEFdt9OjRvPjii7Rt27bU9p49e7Jw4UJyc3PJzMxk8eK/h4g/ePAgv/32G1D4rb179+6OzyxatIicnByys7NZuHAhPXr0KFM8vr6+5+20S6vgdqHqbevXrycpKemqKriVpXobVFwFN0kKBsrLzmXljMko5cFg119x7303NO+PXdsZv248e07v4Z2e79CsTjOjQxWiXAQHBzN27NgLtnfs2JGRI0cSHh7ObbfdVmLn3qpVKz755BPatWtHWloajzzyiOMz9913H507d6ZLly488MADJU4dXUzdunXp1q0bYWFhPPPMMxes4BYTE8PixYsJCQlxvHbv3s38+fNp2bKlo4LbldxFVbx6W6tWrRgxYoSjehsUVnA7cuQIx48fp3v37rRv357OnTtz0003OaWCm1ReM9Dsp14l/cgmWueZGBB1GNPDv4CbN1O2TmFu/FzGdx7PXa3uMjpMUYVVl8prycnJDBkyhPj4eKeup7pUcJPKa1XQxsU/k35kE362evRtvRTT7avAzZuFexcyN34uI1uM5M6WdxodphA1ilRwk9NHhshKO8OG+R9gUr7c7PcjrkNegEbhbD62mVd/e5WujboyvvN4KZojRJGQkBCnHyWIQnKkYIBPJ0xE27OJyM+lweBwuGEMB84c4Km1T9HErwnv9HoHF5P8aoQQFU/2PBVs5ZxF5KbvpK6lLl07/wa3rifDksmYNWNQKKZHTZdxjYQQhpGkUIFOHjpB/KovMFObYfV/wOWOWCxedfj3Dw9zOOsws/rPorFv40svSAghnESSQgWx2+3Mf+FV0AX0sB2mzqgn0SE9mPjbK2w6tomJ3SfSsX5Ho8MUQtRwkhQqyPy35mLNS6ZRQW06DNXQ42k+3fUp3+z9hgfbPsjQa89/WEUIISqaJIUKsGPrHo7HLcEVf4a22oppxM+sPbyOyVsm069pP8Z0GGN0iEIIAcgtqU6XnZnL6ilvAdDXvBvvMZ+TkJ/Kf375D63rtmZi94mYlPwahBCVg+yNnMhutTHziQlo63Ga5Zlo9fRYTtYOZsyPY/Bz8+N/ff6Hp4un0WEKIYSDJAUnsdvtfDj2Zew5iTQsqM3gOxuS3/52nvjxCTLyM5geNZ16XvWMDlOICmE2mwkPDycsLIybb76Z9PR0oGRxnWXLltGsWTMOHjzomGez2ejQoYOjbGdZGFkysyLKZTqbJAUn+eLFaeSe2k5tawDDe57CdNtknl//PDtTdzKpxyRa+rc0OkQhKoynpydxcXHEx8fj7+/PjBkzSrSvWbOGxx9/nBUrVtCkSRPH/Pfee++yx24yumSms8tlOptTk4JSaqBSKkEplaiUGl9K+11KqR1Fr1+VUu2dGU9F+f69zzixdzVe9nqMbB2H57/m8/6fH7PqwCr+3enf9GnSx+gQhTDMDTfcUGJo6nXr1vHggw+ydOlSrr32Wsf8lJQUli5dygMPPFDmZdeUkpnO5LS7j5RSZmAG0A9IATYrpb7XWhdPr0lAL631aaXUIGAmUKXLi62PXc7eX7/CjbqMbLQOn7ErWHx0Ax/t+Ihbm93KvW3uNTpEUUOt+3IPpw5llesyAxr70GNE8zL3t9lsrFmzhvvvvx+A/Px8hg0bxtq1a2nZsuTR85NPPsnbb79dapGaC7nckpllKYIDZS+ZWRHlMp3NmbekdgYStdb7AZRSscAwwJEUtNbFBx//HQh2YjxOF//jZjYunIkZP26r9Sv+Y2ez8PSfvPLbK0Q2iOSFLi/IIHeiRsrNzSU8PJzk5GQ6depEv379AHB1daVr167Mnj2b9957z9F/yZIlBAYG0qlTJ9auXVvm9VxuycyylMuEspfMrIhymc7mzKQQBBwqNp3CxY8C7geWOzEepzq4I5GVM9/GpNwZ6r6dho+9zkeZfzE9bjpdG3VlSu8puJrPL9cnREW5nG/05e3sNYWMjAyGDBnCjBkzeOKJJzCZTHz55Zf07duXN954g+eKSoZu2LCB77//nmXLlpGXl8eZM2e4++67+fzzzy+4jispmVnWI4WylsysiHKZTqe1dsoL+D9gVrHpfwD/u0DfG4HdQN0LtD8EbAG2NGnSRFc2Jw4e05NH3aEnj7hN77gjQlt+jtav/vqqDpsXpif8MkEXWAuMDlHUULt27TI6BK211t7e3o7327Zt040bN9YFBQWO+ampqbp169Z61qxZ5332p59+0jfddJNjuk+fPjolJeW8fh9++KG+5557SsyLjIzUv/zyi968ebMeNGjQFcdvsVh0aGio3r9/v87Pz9ft2rXT8fHxJfpkZWXpM2fOON7fcMMNevny5Ve8zqtR2u8d2KLLsO925pFCClB8dLdg4Mi5nZRS7YBZwCCtdamVvLXWMym83kBERESlKhWXdTqTL559Fm3Poas9g2v+0Z2nrQf5MelH7g+7n7Edx8opIyGK6dChA+3bty9xd5C/vz8rVqygZ8+eBAQEMGzYsFI/e6FymVB46mjHjh2EhIQ45qWmpjJ//nzeeecdR8nMmTNn0rVr18uKuXjJTJvNxujRox0lMwcPHsysWbPIy8tj+PDhAFitVu68806nlMt0NqeV41RKuQB7gCjgMLAZuFNrvbNYnybAj8A9uuT1hQuqTOU4C/Ly+eihsRTkH6adVdNhhD9P+Wr+OPkH4zuP585WUjlNGKu6lOM8q7qUy3S2SlmOU2ttVUqNAVYCZmCO1nqnUurhovYPgReBusD7Rd+mrWUJujKwW23MGTOBgvwUrrF40myohdFup0lJPUx0r2j6h/Q3OkQhqh0pl+l8Th0QT2u9DFh2zrwPi71/ACj7TciVyLx/v0p25h4aWGtzXf9j3O9lJzc3j4/6fURkg0ijwxNCiCsio6RegZjnp3D6+FZq2QNo0ms/D/kV4KW8+WTQJzSr08zo8IQQ4orJMBeX6fvJczmS+CNeOoDAG/Yxtk4W9b0a8MXgLyQhCCGqPEkKl+GHOYvYu2khrvjj3TGR5+um0zagLZ8M+oQG3g2MDk8IIa6aJIUy+mXhWnas/ASz8sXU5iDvNMygb5O+zOw/k1rutYwOTwghyoVcUyiDH2JX8eeij1HKDeu1J5ndNJWRLUYyofMEzCaz0eEJIUS5kaRwCfP/O5Wje37EpLzIa5TJ/OZHGdtxLPeH3S8PpQkhqh1JCheQl53HvMcnkJ29F3fqktj2EGsbp/F619cZdl3pT1sKIURVJ9cUSnFk9z4+fOBhsrP34kddvuz9B1uuLWB61HRJCEJcoQtVRDvr5ZdfJjo62ulxXG41N2dVcoPKWc1NksI5Ns1fTOwrz2KzZ+Di4cH/Bm2lc+u+LBq2iO5B3Y0OT4gqKyYmhu7du59XEa2iXW41N2dUcoPKW81NkkIRu93OV+PfZt13M1G4sb/xGb4bdIJ3+7xHdK9oAjwDjA5RiCorKyuLDRs2MHv27BI714kTJ9KiRQv69u1LQkJCic/ccsstdOrUiTZt2jBz5kwAkpOTadmyJQ888ABhYWHcddddrF69mm7dutGsWTM2bdoEQHZ2NjfddBPt27cnLCzM8Y3+cqu5OauSG1Team5yTQHITsvgs6eeJzsvGVcVwLJOO+nSpS+Lrp+An5uf0eEJUS5+mjeTEwf2l+syA5tew433Xbq62KJFixg4cCDNmzfH39+fbdu2obUmNjaW7du3Y7Va6dixI506dXJ8Zs6cOfj7+5Obm0tkZCS33XYbAImJiXz11VfMnDmTyMhI5s+fz/r16/n+++954403WLRoEStWrKBRo0YsXboUgIyMDODyq7ldbiU3qPrV3Gp8Ukj6LY7vpk3GZj+N2cWf5Tf+xcuDpnF90A1GhyZEtRETE8OTTz4JwKhRo4iJiSEoKIjhw4fj5eUFwNChQ0t8Ztq0aSxcuBCAQ4cOsXfvXho0aEBoaCht27YFoE2bNkRFRaGUom3btiQnJwPQtm1bxo0bx7PPPsuQIUPo0aPHFVVzu9xKblD1q7nV6KTw84zP2PLLQkCRXscVl2G+fNP3R7xcvYwOTYhyV5Zv9M6QmprKjz/+SHx8PEopbDYbSimeeuqpC97WvXbtWlavXs1vv/2Gl5cXvXv3Ji8vDwB3d3dHP5PJ5Jg2mUxYrVYAmjdvztatW1m2bBkTJkygf//+5ObmXlY1tyup5AZVv5pbjbymYLNY+eSR8Wz5ZQEm5UVys3SG/WcMLw2aIQlBiHL29ddfc88993DgwAGSk5M5dOgQoaGhdOzYkYULF5Kbm0tmZiaLFy92fCYjI4M6derg5eXFX3/9xe+//35Z6zxy5AheXl7cfffdjBs3jm3btvHmm2+SkpJCcnIysbGx9OnTx5EQoqKiOHz48HlxDx482JF0QkNDadCgAevXrycpKanUHTgUHinExcWd9yqeEAAiIyPZu3cvSUlJFBQUEBsbe97RUnZ2tiPBZGdns2rVqvNOV5W3GnekkJZ8mC+ee5EC23FcTPXI7p3P5NFLcXP1MDo0IaqlmJgYxo8fX2LebbfdRmxsLCNHjiQ8PJymTZvSo0cPR/vAgQP58MMPadeuHS1atOD666+/rHX++eefPPPMM5hMJlxdXfnggw8u2PdC1dycWckNKm81N6dVXnOWq6m89tNnnxK3dDl2nYXJvRZdnrqNrh2Gl3OEQlQe1a3ymjNUx2pulbLyWmUz7z//JvVAEkqZ8QgK4MFJ7+Pm5ml0WEIIg0k1t5JqTFIIatOKjINptL39Rvrcfq/R4QghRKVUY5JCv3sfpN+9DxodhhBCVGo18u4jIYQQpZOkIEQ1V9VuJhFX52p/35IUhKjGPDw8SE1NlcRQQ2itSU1NxcPjym+xrzHXFISoiYKDg0lJSeHkyZNGhyIqiIeHB8HBwVf8eUkKQlRjrq6uhIaGGh2GqELk9JEQQggHSQpCCCEcJCkIIYRwqHJjHymlTgIHrvDjAcCpcgynKpBtrhlkm2uGq9nmplrrepfqVOWSwtVQSm0py4BQ1Ylsc80g21wzVMQ2y+kjIYQQDpIUhBBCONS0pDDT6AAMINtcM8g21wxO3+YadU1BCCHExdW0IwUhhBAXUWOSglJqoFIqQSmVqJQaf+lPVG1KqcZKqZ+UUruVUjuVUmONjqkiKKXMSqntSqklRsdSUZRStZVSXyul/ir6fd9gdEzOpJR6quhvOl4pFaOUqpYF1pVSc5RSJ5RS8cXm+SulflBK7S36Wae811sjkoJSygzMAAYBrYE7lFKtjY3K6azA01rrVsD1wGM1YJsBxgK7jQ6igr0HrNBatwTaU423XykVBDwBRGitwwAzMMrYqJxmHjDwnHnjgTVa62bAmqLpclUjkgLQGUjUWu/XWhcAscAwg2NyKq31Ua31tqL3mRTuKIKMjcq5lFLBwE3ALKNjqShKKT+gJzAbQGtdoLVONzYqp3MBPJVSLoAXcMTgeJxCa/0LkHbO7GHAJ0XvPwFuKe/11pSkEAQcKjadQjXfQRanlAoBOgAbjY3E6aYC/wHsRgdSga4BTgJzi06bzVJKeRsdlLNorQ8D0cBB4CiQobVeZWxUFaq+1vooFH7xAwLLewU1JSmoUubViNuulFI+wDfAk1rrM0bH4yxKqSHACa31VqNjqWAuQEfgA611ByAbJ5xSqCyKzqEPA0KBRoC3UupuY6OqXmpKUkgBGhebDqaaHnIWp5RypTAhfKG1/tboeJysGzBUKZVM4enBPkqpz40NqUKkACla67NHgV9TmCSqq75Aktb6pNbaAnwLdDU4pop0XCnVEKDo54nyXkFNSQqbgWZKqVCllBuFF6a+Nzgmp1JKKQrPM+/WWk8xOh5n01pP0FoHa61DKPz9/qi1rvbfILXWx4BDSqkWRbOigF0GhuRsB4HrlVJeRX/jUVTjC+ul+B64t+j9vcB35b2CGlF5TWttVUqNAVZSeLfCHK31ToPDcrZuwD+AP5VScUXzntNaLzMwJuEcjwNfFH3h2Q/80+B4nEZrvVEp9TWwjcI77LZTTZ9sVkrFAL2BAKVUCvASMAn4Uil1P4UJ8v/Kfb3yRLMQQoizasrpIyGEEGUgSUEIIYSDJAUhhBAOkhSEEEI4SFIQQgjhIElBCCGEgyQFIYQQDpIUhCgHSqlgpdRIo+MQ4mpJUhCifERRvcccEjWEPNEsxFVSSnWncAyadCATGK61TjI2KiGujCQFIcqBUmoFME5rHX/JzkJUYnL6SIjy0QJIMDoIIa6WJAUhrpJSqi6FFcAsRscixNWSpCDE1QulBhRtEjWDJAUhrt5fFI55H6+UqklVwEQ1JBeahRBCOMiRghBCCAdJCkIIIRwkKQghhHCQpCCEEMJBkoIQQggHSQpCCCEcJCkIIYRwkKQghBDC4f8BzCQ5htY9vkoAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# We'll keep dt at 0.5, use Adams 4th order method\n", "dt = 0.5\n", "t4 = np.arange(21)*dt\n", "x4 = np.zeros(21)\n", "dxdt4 = np.zeros(4)\n", "\n", "# Note that we need to copy the first 4 points and derivatives from the RK method\n", "for i in range(4):\n", " x4[i] = x3[i]\n", "for i in range(3):\n", " dxdt4[i+1] = dxdt(x4[i])\n", " \n", "# We can now proceed with the Adams method for the remaining steps\n", "for i in range(3, 20):\n", " # Shuffle the stored derivatives\n", " for j in range(3):\n", " dxdt4[j] = dxdt4[j+1]\n", " # Compute the derivative at the current point\n", " dxdt4[3] = dxdt(x4[i])\n", " # Compute the next point\n", " x4[i+1] = x4[i] + dt * \\\n", " (55./24.*dxdt4[3] - 59./24*dxdt4[2] + 37./24.*dxdt4[1] - 3./8.*dxdt4[0])\n", " \n", "# Plot\n", "plt.plot(t, xsol(t), label='Exact')\n", "plt.plot(t, x, label=r'Euler, $\\Delta t = 0.1$')\n", "plt.plot(t1, x1, label=r'Euler, $\\Delta t = 0.5$')\n", "plt.plot(t2, x2, label=r'Midpoint, $\\Delta t = 0.5$')\n", "plt.plot(t3, x3, label=r'RK4, $\\Delta t = 0.5$')\n", "plt.plot(t4, x4, label=r'Adams4, $\\Delta t = 0.5$')\n", "plt.xlabel('$t$')\n", "plt.ylabel('$x$')\n", "leg=plt.legend(loc='lower right')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is somewhat instructive to compare the errors more directly:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Make a plot comparing the accuracy of the methods\n", "plt.plot(t, (x-xsol(t))/xsol(t), label=r'Euler, $\\Delta t = 0.1$')\n", "plt.plot(t1, (x1-xsol(t1))/xsol(t1), label=r'Euler, $\\Delta t = 0.5$')\n", "plt.plot(t2, (x2-xsol(t2))/xsol(t2), label=r'Midpoint, $\\Delta t = 0.5$')\n", "plt.plot(t3, (x3-xsol(t3))/xsol(t3), label=r'RK4, $\\Delta t = 0.5$')\n", "plt.plot(t4, (x4-xsol(t4))/xsol(t4), label=r'Adams4, $\\Delta t = 0.5$')\n", "plt.ylim([-0.06, 0.02])\n", "plt.xlabel('$t$')\n", "plt.ylabel('Fractional Error')\n", "leg=plt.legend(loc='lower right')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Clearly RK4 is the most accurate on this graph, but it requires 4 times as many function evaluations at Adams4. Thus a fairer comparison would be between RK4 using a time step of $\\Delta t = 2$ and Adams with $\\Delta t = 0.5$, so both perform the same number of function evaluations. Here's how that looks:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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McaElCUaY4wxIWWJxhhjTEjZDJvGmDxLTk4mPj6eU6dO+R2KCaEyZcpQp04dSpUqlaf+lmiMMXkWHx9PhQoVqF+/PiKBqkaZ4k5VSUhIID4+ntjY2Dy9hh06M8bk2alTp6hataolmTAmIlStWjVfe62WaIwx+WJJJvzl93dsicYYY0xIWaIxxhgTUpZojDHGhJQlGmNMWPj4448RETZu3Bjw+SeffJLnn38+5HGkpqbStm1brrzyyqDaZxV3fHw87733Xr5imT17No0bN6ZBgwaMGTMmYJv69evTsmVL2rRpQ4cOOdbHzBNLNMaYsDB58mS6dOnClClTfI3jpZdeomnTpkG3nzx5Mh06dDgr7vnz57Nq1ao8x5Gamsro0aOZNWsW69evZ/Lkyaxfvz5g24ULF7JmzRpCVcXerqMxxhSI//tkHev3nDVrer40q1WRJ65qnmO7Y8eOsWTJEhYuXMiAAQN48sknAXjmmWeYMGECdevWpVq1arRv3z6jz9VXX82uXbs4deoUf/zjHxk1ahTbt28nLi6OLl26sHTpUlq3bs3NN9/ME088wf79+5k0aRKdOnXi+PHjDBkyhPj4eFJTU3n88ccZOnQo8fHxfPbZZzz66KP861//CiruxYsXM3fuXK677rqMuL/66ivuv/9+KleuzJw5c/j4449zfQ3LsmXLaNCgARdccAEAw4YNY/r06TRr1ixXr1MQLNEYY4q9adOmERcXR6NGjYiJiWHVqlWoKlOmTGH16tWkpKTQrl270xLNuHHjiImJ4eTJk3Ts2JHBgwcDsGXLFt5//33Gjh1Lx44deffdd/nqq6+YMWMGzz77LNOmTWP27NnUqlWLzz77DIDDhw8DcO+99/Lcc89x9OjRoOPu1asXrVq1oly5cqxatYp27drRpUsXOnbsyPPPP0+LFi1O69O1a9eAr//888/Tq1evjOXdu3dTt27djOU6derw7bffntVPROjTpw8iwu23386oUaOCij03LNEYYwpEMHseoTJ58mTuvfdewH1znzx5MrVr12bQoEGULVsWgAEDBpzW59///jcff/wxALt27WLz5s3UqFGD2NhYWrZsCUDz5s3p2bMnIkLLli3Zvn07AC1btuSBBx7goYce4sorr6Rr1658+umnVK9enfbt27No0aKg407/YB8yZAiTJ0+mXbt2AGzatInGjRuf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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# RK method with a bigger time step, so the number of function evaluations matches Adams4\n", "dt = 2.0\n", "t5 = np.arange(6)*dt\n", "x5 = np.zeros(6)\n", "x5[0] = x0\n", "for i in range(5):\n", " # Compute the k's\n", " k1 = dxdt(x5[i])\n", " k2 = dxdt(x5[i]+dt*k1/2)\n", " k3 = dxdt(x5[i]+dt*k2/2)\n", " k4 = dxdt(x5[i]+dt*k3)\n", " x5[i+1] = x5[i] + dt/6 * (k1+2*k2+2*k3+k4)\n", " \n", "# Plot comparison\n", "plt.plot(t4, (x4-xsol(t4))/xsol(t4), label=r'Adams4, $\\Delta t = 0.5$')\n", "plt.plot(t5, (x5-xsol(t5))/xsol(t5), label=r'RK4, $\\Delta t = 2.0$')\n", "plt.ylim([-0.035, 0.005])\n", "plt.xlabel('$t$')\n", "plt.ylabel('Fractional Error')\n", "leg=plt.legend(loc='lower right')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Stiff Systems\n", "-------------\n", "\n", "Thus far the ODE we have been playing with is a relatively friendly one. Not all ODEs play so nicely. Here is a toy example:\n", "\\begin{equation}\n", "\\frac{dx}{dt} = 99 e^{-t} - 100 x\n", "\\end{equation}\n", "with initial condition $x=2$ at $t=0$. One can immediately verify by calculation that this has the exact solution\n", "\\begin{equation}\n", "x = e^{-t} + e^{-100 t}.\n", "\\end{equation}\n", "\n", "While this is a somewhat contrived example meant to demonstrate the topic, real problems like this occur all the time. The defining characteristic of this system is that there are effectively two solutions that are changing on wildly different time scales. At times $t\\sim 1$, only the $e^{-t}$ term is significant. However, let us see what happens if we try to integrate it with our simple Euler method, even out to $t=1$." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Define the ODE\n", "def dxdt(t, x):\n", " return 99.0*np.exp(-t) - 100.0*x\n", "\n", "# Here's the exact solution\n", "def xsol(t):\n", " return np.exp(-t) + np.exp(-100.0*t)\n", "\n", "# Integrate using a simple Euler method with dt = 0.1\n", "dt = 0.1\n", "x0 = 2.0\n", "t = np.arange(11)*dt\n", "x = np.zeros(11)\n", "x[0] = x0\n", "for i in range(10):\n", " x[i+1] = x[i] + dt*dxdt(i*dt, x[i])\n", " \n", "# Plot the numerical and exact solutions on top of each other\n", "plt.plot(t, xsol(t), label='Exact')\n", "plt.plot(t, x, label='Euler')\n", "plt.xlabel('$t$')\n", "plt.ylabel('$x$')\n", "leg=plt.legend(loc='upper left')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Disaster! Do we do any better with something more sophisticated like RK4?" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAETCAYAAAA1Rb1FAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi40LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcv7US4rQAAGDZJREFUeJzt3X+QXeV93/H3V7srVgL91mIwslgBCWCoJfCCbSAEQ6gxhTDpOEMckgyBMVNsY+o2beymNQMxMyqltWtDJhHU48btgETiaUUGKNgJcZoY0FIEFsjsCgRmgVi6V7/Rz919+sfdu14J/bha3XPO/fF+zWj27r1n7/k+SPPh2ec893sipYQkqfVNKboASVI+DHxJahMGviS1CQNfktqEgS9JbcLAl6Q20XCBHxHfiYgNEbGmhmP/VUS8EhEvRcQPI+LUA16fGRFvR8R92VUsSc2h4QIf+C5wVY3HvgD0pZQ+AvwFcM8Br/8x8Lf1K02SmlfDBX5K6UfAponPRcTpEfFERDwfEX8XEWeNHfs3KaWdY4c9AyyY8DMfBT4APJlT6ZLU0Bou8A9hGXBbSumjwB8Af3KQY24GHgeIiCnAfwb+TW4VSlKD6yy6gCOJiBOAi4BHIqL69HEHHPM7QB/wq2NPfR54LKX01oSfkaS21vCBT+W3kC0ppSUHezEifg34I+BXU0p7xp7+BPArEfF54ARgakTsSCl9JZeKJakBNfySTkppG7A+In4TICoWjz0+D/gz4NdTShsm/MwNKaWFKaVeKktAf27YS2p3DRf4EfEQ8GPgzIgYioibgRuAmyPiReBl4Lqxw/8TlRn8IxGxOiJWFlK0JDWBsD2yJLWHhpvhS5Ky0VAXbefPn596e3uLLkOSmsbzzz9fSin11HJsQwV+b28v/f39RZchSU0jIt6s9ViXdCSpTRj4ktQmDHxJahMNtYZ/MPv27WNoaIjdu3cXXUquuru7WbBgAV1dXUWXIqlFNHzgDw0NMWPGDHp7e2mXvjgpJcrlMkNDQyxatKjociS1iIZf0tm9ezfz5s1rm7AHiAjmzZvXdr/VSMpWwwc+0FZhX9WOY5aUraYIfElqWT99DP7+v0IObW4M/Bp0dHSwZMmS8T9Lly6t23uvXr2axx57rG7vJ6nJvPx9eO5ByOG3+oa/aNsIpk2bxurVqzN579WrV9Pf38/VV1+dyftLanClQZj/S7mcyhn+JG3dupUzzzyTV199FYDPfvazPPDAAwDceuut9PX1cc4553DHHXeM/8yqVau46KKLWLx4MRdeeCFbt27la1/7GsuXL2fJkiUsX768kLFIKkhKUF6XW+A31Qz/zkdf5pV3ttX1PT/8wZncce05hz1m165dLFnyixtuffWrX+X666/nvvvu48Ybb+T2229n8+bNfO5znwPg7rvvZu7cuYyMjHDFFVfw0ksvcdZZZ3H99dezfPlyLrjgArZt28b06dO566676O/v57777qvruCQ1ge3vwt4dBn4jOdSSzpVXXskjjzzCF77wBV588cXx51esWMGyZcsYHh7m3Xff5ZVXXiEiOPnkk7ngggsAmDlzZm71S2pQpYHK13kG/vscaSaet9HRUdauXcu0adPYtGkTCxYsYP369dx7772sWrWKOXPmcOONN7J7925SSm61lLS/0mDl6/xfzuV0ruEfg2984xucffbZPPTQQ9x0003s27ePbdu2cfzxxzNr1ix+/vOf8/jjjwNw1lln8c4777Bq1SoAtm/fzvDwMDNmzGD79u1FDkNSUUqDMHUGzDgpl9M11Qy/KAeu4V911VXcdNNNPPjggzz33HPMmDGDSy+9lK9//evceeednHfeeZxzzjmcdtppXHzxxQBMnTqV5cuXc9ttt7Fr1y6mTZvGD37wAz75yU+ydOlSlixZMn5tQFKbKA3A/DNy2ZIJDXZP276+vnTgDVDWrl3L2WefXVBFxWrnsUtt4RvnwqkXwT9fNum3iIjnU0p9tRzrko4kFWHve7D1rdwu2IKBL0nFKL9W+ZrTlkww8CWpGNUtmQa+JLW48jogYO7puZ0y88CPiI6IeCEi/irrc0lS0ygNwOyF0NWd2ynzmOHfDqzN4TyS1DxKA7l94Koq08CPiAXAPwMezPI8Wau2Rz733HO59tpr2bJlCwBvvPEG55577vhxDzzwAOeffz6bN28ef+7ee+8lIiiVSrnXLalBjY5WLtrmuH4P2c/wvwn8W2D0UAdExC0R0R8R/Rs3bsy4nMmp9tJZs2YNc+fO5f7773/fMd/73vf49re/zZNPPsmcOXMAeOutt3jqqadYuHBh3iVLamTb3oZ9O1sn8CPiGmBDSun5wx2XUlqWUupLKfX19PRkVU7dfOITn+Dt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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Same problem, using 4th order Runge-Kutta\n", "xrk = np.zeros(11)\n", "xrk[0] = x0\n", "for i in range(10):\n", " k1 = dxdt(i*dt, xrk[i])\n", " k2 = dxdt((i+0.5)*dt, xrk[i]+dt*k1/2)\n", " k3 = dxdt((i+0.5)*dt, xrk[i]+dt*k2/2)\n", " k4 = dxdt(i+dt, xrk[i]+dt*k3)\n", " xrk[i+1] = xrk[i] + dt/6 * (k1+2*k2+2*k3+k4)\n", "\n", "# Plot\n", "plt.plot(t, xsol(t), label='Exact')\n", "plt.plot(t, xrk, label='RK4')\n", "plt.xlabel('$t$')\n", "plt.ylabel('$x$')\n", "leg=plt.legend(loc='upper left')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Even worse!\n", "\n", "The problem is that this system is what is called stiff. The natural timescale for the $e^{-100t}$ part of the solution is $0.01$, and attempting to take a time step much bigger than these results in numerical junk. The problem is that the part of the solution that we actually care about near $t=1$ is changing on a vastly different time scale than the part that is causing our numerical problems. This is the chief characteristic of stiff systems: they mix together a very wide range of scales. Using a method like Euler or RK4, the time step is dictated by the shortest time scale, which may make it impossible to explore the behaviour on longer time scales.\n", "\n", "To come up with a strategy for dealing with this, let us first understand why our simple Euler method and its more sophisticated cousin failed. For simplicitly, let us consider one of the easiest ODEs to solve:\n", "\\begin{equation}\n", "\\frac{dx}{dt} = -c x\n", "\\end{equation}\n", "for some constant $c$. With a simple Euler method, the update step is\n", "\\begin{equation}\n", "x_{i+1} = x_i + \\Delta t \\left(\\frac{dx}{dt}\\right)_{t_i} = (1 - c\\Delta t) x_i.\n", "\\end{equation}\n", "Thus every iteration just multiplies by $(1 - c\\Delta t)$. If we take $N = t / \\Delta t$ steps to advance up to time $t$, starting with $x_0 = 1$, then the solution is\n", "\\begin{equation}\n", "x_N = (1 - c\\Delta t)^N = (1 - c\\Delta t)^{t/\\Delta t}.\n", "\\end{equation}\n", "In the limit $\\Delta t \\rightarrow 0$, this limits to\n", "\\begin{equation}\n", "x(t) = e^{-c t},\n", "\\end{equation}\n", "which is the correct answer. However, for finite $\\Delta t$, we can see that the behaviour is going to depend critically on whether $\\Delta t > 1/c$ or $\\Delta t < 1/c$. If $\\Delta t > 1/c$, then the quantity in parentheses is negative, and the solution will oscillate between positive and negative every time step. If $\\Delta t > 2/c$, then the quantity in parentheses is negative and has an amplitude $>1$, so the amplitude gets larger every time step. This is the basic reason that our solution blew up, and it is a classic example of numerical instability." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Implicit Methods for Stiff Problems\n", "\n", "Now that we understand why the Euler method fails, can we do better? The answer is that we can, by using an implicit rather than an explicit method. The methods we have used thus far are explicit, in that they are defined in terms of an explicit formula for $x_{i+1}$ in terms of $x_i$ and $(dx/dt)_{t_i}$, things that are known at the previous time step. However, that's not the only possible choice. Here is an alternative differencing scheme for our trivial problem:\n", "\\begin{equation}\n", "x_{i+1} = x_i + \\Delta t \\left(\\frac{dx}{dt}\\right)_{t_{i+1}}.\n", "\\end{equation}\n", "This is called the backwards Euler difference formula. It differs from the standard forwards Euler we have been using only in that we have chosen to evaluate the derivative at time $t_{i+1}$ instead of $t_i$. Of course we don't know this derivative in advance, which is why this method is called implicit: it gives $x_{i+1}$ only implicitly rather than explicitly.\n", "\n", "In this very simple case, we can in fact manipulate the expression above analytically to get an explicit formula for $x_{i+1}$:\n", "\\begin{eqnarray*}\n", "x_{i+1} & = & x_i - c \\Delta t \\, x_{i+1} \\\\\n", "x_{i+1} & = & \\frac{x_i}{1 + c \\Delta t}\n", "\\end{eqnarray*}\n", "If we use this scheme $N$ times to advance to time $t$, the solution we obtain will be\n", "\\begin{equation}\n", "x_N = \\left(\\frac{1}{1+c\\Delta t}\\right)^{t/\\Delta t}.\n", "\\end{equation}\n", "\n", "In the limit $\\Delta t \\rightarrow 0$, this is completely identical to our forwards Euler formula, but for finite $\\Delta t$ is has a crucial difference. Here the quantity in parenthesis is strictly bounded between 0 and 1, and thus no matter what power we raise it to, we are guaranteed that the solution will not blow up. That is not to say that we are guaranteed it will be accurate. There may still be error compared to the exact solution, and if we choose $\\Delta t$ too large it can be fairly bad, but at least we are guaranteed that the solution remains bounded and does not run away to infinity.\n", "\n", "The backwards Euler method is the simplest example of a class of methods called backward difference methods. It is first order accurate, and by using the same trick of Taylor expansion, one can use the Adams-type approach to derive backward difference methods of higher order. Our first-order method is\n", "\\begin{equation}\n", "x_{i+1} - x_i = \\Delta t \\left(\\frac{dx}{dt}\\right)_{t_{i+1}},\n", "\\end{equation}\n", "and here is the fourth order backward difference method:\n", "\\begin{equation}\n", "x_{i+4} - \\frac{48}{25} x_{i+3} + \\frac{36}{25} x_{i+2} - \\frac{16}{25} x_{i+1} +\n", "\\frac{3}{25} x_i = \\frac{12}{25}\\Delta t\\left(\\frac{dx}{dt}\\right)_{t_{i+4}}\n", "\\end{equation}\n", "As with Adams4, this requires 4 starting points to begin. One way of getting them, since we cannot use RK for stiff problems, is to use 1st order (backwards Euler) to generate the first point, then the 2nd order formula for the next point, and so on, until we have enough points to use the order we want.\n", "\n", "There is one more important point to make about implicit methods like this: unlike in our trivial example, one cannot usually substitute in for $dx/dt$ at the new time and invert the problem analytically to get an explicit formula for $x$ at the new time. This is certainly the case for our original motivating example, where substituting in the right hand side produces a transcendental equation. Instead, one usually has to solve the algebraic equation in the backwards difference formula numerically, using a method like Brent's method. Here is an example of applying the 1st order backward difference method to our stiff system." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Set up is the same as for forward Euler\n", "t = np.arange(11)*dt\n", "x = np.zeros(11)\n", "x[0] = x0\n", "\n", "# We'll need Brent's method here, so import it, \n", "# and define the function whose roots we need to find\n", "from scipy.optimize import brentq\n", "def backdiff(xnew, xlast, t):\n", " return xnew - xlast - dt*dxdt(t, xnew)\n", "\n", "# Now we integrate\n", "for i in range(10):\n", " # Use brent's method to get the new value of x\n", " x[i+1] = brentq(backdiff, 0, x[i], args=(x[i], (i+1)*dt))\n", " \n", "# Plot the numerical and exact solutions on top of each other\n", "plt.plot(t, xsol(t), label='Exact')\n", "plt.plot(t, x, label='Backwards Euler')\n", "plt.xlabel('$t$')\n", "plt.ylabel('$x$')\n", "leg=plt.legend(loc='upper right')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The backwards Euler method successfully deals with this problem. The price is that there are many more function evaluations involved than for an explicit method, since we need to perform lots of function calls in order to solve the implicit step." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Error Control and Adaptivity\n", "\n", "Thus far all the methods we have used have employed fixed time steps. However, this presents an obvious problem: how we pick the time step? The answer is that we shouldn't. We should let the computer pick it for us.\n", "\n", "Here is a very simple way of doing this, called step doubling: using a method like Runge-Kutta, take a step of size $\\Delta t$, and then take two steps of size $\\Delta t/2$, and compare the results. If they differ by less than some tolerance that is considered acceptable, accept the result of the two steps of size $\\Delta t/2$ and go on. If not, go back to the beginning and try two time steps of size $\\Delta t/4$, and compare them to the results of one time step of size $\\Delta t/2$. If the error is acceptable, advance the solution by $\\Delta t/2$, and repeat. If not, try again with an even smaller time step, and so on until an acceptable step is found. To prevent this from being a one-way ratchet that only ever decreases the time step, if the first attempt at size $\\Delta t$ is successful, increase the time step by some small amount, say 10%. For a method like Adams, you can do much the same thing, but the bookkeeping is quite a bit more of a nuisance due to the need for some number of time steps of the same size for the magical error cancellations to work out.\n", "\n", "One can also be quite a bit more sophisticated about this. For RK, an interesting thing to note is that for some higher order RK formulae, if you evaluate the derivative at exactly the same points, but use different weighting coefficients, you get a lower order RK formula. Why would you want to do that? The reason is that the difference between the higher and lower order RK formula is an excellent estimate of the error, one that can be computed without needing to evaluate the derivatives at any additional points. RK formulae of this type are called embedded RK formulae.\n", "\n", "We will not implement our own error control here, because it is a bunch of tedious bookkeeping. Fortunately, many methods of this sort have been implemented in python in the standard scipy library. Essentially all the available methods have adaptive time stepping, and many have automatic detection of unstable behaviour; if such behaviour is detected, the algorithm automatically switches to an implicit method suitable for stiff problems." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solving ODEs in Python\n", "\n", "ODEs in python can be solved via the ODE class. Usage proceeds in a few steps. One first provides the function to be integrated, and sets the integration method. Then one sets the initial value. Finally, one can integrate. Here is an example using our logistic equation." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Define the function dxdt for the logistic equation; note that\n", "# the function has to take two arguments, t and x\n", "r = 1.0\n", "def dxdt(t, x):\n", " return r*x*(1-x)\n", "\n", "# Here is the exact solution\n", "def xsol(t):\n", " return 1.0 / (1.0+(1.0/x0-1)*np.exp(-r*t))\n", "\n", "# Set up the integrator, using the method 'lsoda' -- an Adams-type method\n", "from scipy.integrate import ode\n", "integrator = ode(dxdt).set_integrator('lsoda')\n", "\n", "# Set the initial conditions\n", "x0 = 0.1\n", "t0 = 0\n", "integrator.set_initial_value(x0, t0)\n", "\n", "# Now integrate\n", "dt = 0.5\n", "t = np.arange(21)*dt\n", "xlsoda = np.zeros(21)\n", "xlsoda[0] = x0\n", "for i in range(20):\n", " xlsoda[i+1] = integrator.integrate(integrator.t+dt)\n", " \n", "# Plot solution versus exact solution\n", "plt.plot(t, xsol(t), label='Exact')\n", "plt.plot(t, xlsoda, label='LSODA')\n", "plt.xlabel(r'$t$')\n", "plt.ylabel(r'$x$')\n", "leg = plt.legend(loc='lower right')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The accuracy of the method is very good:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbQAAAEKCAYAAAB69KBDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi40LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcv7US4rQAAIABJREFUeJzt3Xt8lNWd+PHPN/frBBICZALILYoJ1hsivWitVkW3FbvVFtut6NK69ae9bC9b3F/3Z2/u2u1ubd2fumu92/6K1nYrrVrXohXbagAVxYBALgghgYQEyI3cv78/5iQO6WQykJl5JpPv+/Wa1zxznuec50zEfPM85/ucI6qKMcYYM9GleN0BY4wxJhosoBljjEkKFtCMMcYkBQtoxhhjkoIFNGOMMUnBApoxxpikYAHNGGNMUrCAZowxJilYQDPGGJMU0rzuwGQybdo0nTt3rtfdMMaYCeXVV189qKrFYx1nAS2O5s6dy+bNm73uhjHGTCgi8k4kx9ktR2OMMUnBApoxxpikYAHNGGNMUrCAZowxJilYQDPGGJMULKAZY4xJChbQjDHGJAV7Ds2YCaq7b4C9rV3sbuninZZOykt8vG/hNK+7ZYxnLKAZk8C6evvZ09rF7oOdw4Fr98HAe2NbN6rvHpudnspvv/gBFhTneddhYzxkAc2YBLFpdysb61oDQcsFrwNtPcccU5SbwUlFOSybX8RJRbnMnZbDSUW55Gak8on/epkvr93CL298HxlpNppgJh8LaMYkgK7efj59XyW9/YMU52cytyiH88qKmVuUw9xpucwtymVOUQ6+rPRR2/iXv34Pn//pq/zo9zv5h+WL4th7YxKDBTRjEsBr7xymt3+Q+1ct4aJTZ5xQG8sXz2TlObO558Uazj+5mGXzi6LcS2MSm92XMCYBVNa1kCKwdF7huNr5p4+Uc1JhDl95bAtHjvZFqXfGTAwW0IxJAJW1rSwuLSA/zC3FSORmpvHjlWfS1N7DN3/9FhqcNWJMkvM0oInIchHZISLVIrImxH4RkTvd/jdF5Kyx6opIoYg8JyK73PvUoH23uON3iMilQeVni8hWt+9OERFXnikij7nyShGZG1RnQES2uNe66P90zGTR3TfAlr2HOXecV2dDTp89hS9/uIzfvNHAr7fsi0qbxkwEngU0EUkF7gIuA8qBa0SkfMRhlwFl7nUDcE8EddcA61W1DFjvPuP2rwQqgOXA3a4dXLs3BJ1ruStfDRxS1YXAHcD3g/p2VFXPcK8rxvnjMJPY63sO0zswyLnzojfmdeMFCzln7lT+6ddV7G3tilq7xiQyL6/QlgLVqlqrqr3AWmDFiGNWAI9owCvAFBEpGaPuCuBht/0wcGVQ+VpV7VHVOqAaWOra86nqyxq4P/PIiDpDbT0BXDR09WZMtFTWtSAC50TpCg0gNUW445NnIMDfP7aF/oHBqLVtTKLyMqCVAnuDPte7skiOCVd3hqo2Arj36RG0VT9KW8N1VLUfOAIM/RmdJSKbReQVEbkSY05QZW0rp870UZA9vvGzkWZNzeF7H1vM5ncOcfcfaqLatjGJyMuAFupKZ+QI9mjHRFI30vOFayvcvjmqugT4FPAjEVkQ8qQiN7jAt7m5uXmMLprJpqd/gNf2HOLc+dG7Ogu24oxSVpzh58frd/H6nkMxOYcxicLLgFYPzA76PAtoiPCYcHUPuNuIuPemCNqaNUpbw3VEJA0oAFoBVLXBvdcCfwDODPUlVfVeVV2iqkuKi4tDHWImsTfrj9DTPxjTZ8a+s2IxM31ZfPmxLXT09MfsPMZ4zcuAtgkoE5F5IpJBIGFjZLbgOuBal+24DDjibiOGq7sOWOW2VwFPBpWvdJmL8wgkf2x07bWLyDI3PnbtiDpDbV0FPK+qKiJTRSQTQESmAe8HtkXlp2ImlcraFgCWzo3NFRpAQXY6d3zyDPa2dvGd31TF7DzGeM2zmUJUtV9EbgaeBVKBB1S1SkQ+7/b/J/A0cDmBBI4u4PpwdV3TtwOPi8hqYA9wtatTJSKPEwg8/cBNqjrg6twIPARkA8+4F8D9wKMiUk3gymylKz8V+C8RGSTwR8HtqmoBzRy3yrpWFs3MZ2puRkzPs3ReITdesIC7XqjhQ6dM57LTSmJ6PmO8IPbgZfwsWbJEN2/e7HU3TILoGxjk9G//D1efPYtvr1gcl/N9/J4/805LF7/78nmUFGTH/JzGRIOIvOpyFsKymUKM8cjWfUfo6h3g3DjNuZiemsKPPnkGvf2DfO0XbzA4aH/MmuRiAc0Yj1TWtgLjn7/xeMwvzuPWj5bzp+oW7v9jXdzOa0w8WEAzxiOVdS0snJ7HtLzMuJ73k+fM5pLyGfzrs29T1XAkruc2JpYsoBnjgf6BQTbVtUZt/sbjISLc/vH3MDUngy+t3cLR3oGxKxkzAVhAM8YDVQ1tdMZx/GykwtwM/v0Tp1Pd1MG/PLPdkz4YE20W0IzxQGVd4PmzZR5coQ05r6yY1R+YxyMvv8MLbzeNXcGYBGcBzRgPVNa2Mm9aLtN9WZ724+uXnsKimfl89RdvUN3U7mlfjBkvC2jGxNnAoLJxtzfjZyNlpady96fPIkWEa35SSW1zh9ddMuaEWUAzJs62N7bR3t0f0/kbj8f84jx+/rlzGRxUPvWTSt5p6fS6S8acEAtoxsRZZV3g+bNYzbB/Ispm5PPTz55Ld/8An/pJJfWHbFFQM/FYQDMmziprW5hTmJNwU0+dWuLjp6vPpb27j2t+8gqNR4563SVjjosFNGPiaDCBxs9CWVxawKOrz+VwZx+f+kklB9q6ve6SMRGzgGZMHO1saudwV59nz59F4vTZU3job8+hqa2bT/3kFZrbe7zukjERsYBmTBwNzd+YqFdoQ84+qZAHrjuHhsPd/M19lbR29nrdJWPGZAHNmDiqrGuhdEo2swtzvO7KmM6dX8T9q5awu6WTv7mvksNdFtRMYrOAZkycqCobPZq/8US9b+E0fnLtEqqbOvjM/Rs5crTP6y4ZMyoLaMbESU1zBwc7ehMqXT8S559czH9+5ize3t/GdQ9upL3bgppJTBbQjImTl4fHzxI3IWQ0Fy6awV2fOout9Uf424c20dnT73WXjPkLFtCMiZPK2hZm+DI5qSjxx89CuaRiJndecyav7TnM6oc32bIzJuFYQDMmDlSVyrpWzp1XhIh43Z0TdvlpJfzwE6ezsa6Vzz2yme4+C2omcXga0ERkuYjsEJFqEVkTYr+IyJ1u/5sictZYdUWkUESeE5Fd7n1q0L5b3PE7ROTSoPKzRWSr23enuN84IpIpIo+58koRmRtUZ5U7xy4RWRX9n45JJnUHO2lu70mY+RvHY8UZpfzrVafzp5qDfP6nr9LTb0HNJAbPApqIpAJ3AZcB5cA1IlI+4rDLgDL3ugG4J4K6a4D1qloGrHefcftXAhXAcuBu1w6u3RuCzrXcla8GDqnqQuAO4PuurULgVuBcYClwa3DgNGakRJy/cTyuOnsW//yx0/jDjmY+/+irvLizmaa2blTV666ZSSzNw3MvBapVtRZARNYCK4BtQcesAB7RwP8lr4jIFBEpAeaGqbsCuMDVfxj4A/ANV75WVXuAOhGpBpaKyG7Ap6ovu7YeAa4EnnF1vuXaegL4v+7q7VLgOVVtdXWeIxAEfx6ln41JMpW1LUzLy2T+tFyvuxI11yydQ/+g8q11VbywoxkIrIS9aGY+i2b6WFSSz6kzfZTNyCMrPXWM1kyiONo7wL7DRwOvQ0fZd7iLfYeO0tLZiyoMqrpX4Fb64HDZ0GdlcDBQFnz8g9ctZU6Mx4+9DGilwN6gz/UErnjGOqZ0jLozVLURQFUbRWR6UFuvhGirz22PLD/m/KraLyJHgKIw/YqJHzz7Nm1H+/nulYtjdQoTQ8PjZ/MLJ/T4WSifWXYSH31PCW/vb+ftxjbe3t/O9v3t/HzjHo668bUUgXnTcgNBbmY+i0oC77OmZkf159E3MEh7dz/t3X20d/fT5t6Dy9qDyhAozMlgam4GhTnpFOZlus/pFOZmMDUnI+kCsarSdrSfehek3g1a7263jJgVJi1FmFmQRVFeJmkpQoqASOA9JSWFFBFEIGWoTOTd/SKkpASOz0iL/Q1BLwNaqH/JI+9XjHZMJHUjPV+4tsZ9fhG5gcDtTObMmTNGF0NrPNzNH6sPWkCboPa2HqXxSDfLJtAD1cdjSk4Gy+YXHTM+ODCo7Gnt4u3GNra7YLd13xGe2to4fEx+ZhplM/LIyUhDCfxVrwT+qlcCv3yHtgc1VLnS1TswHKi6+wbH7GtmWgr5Wen4sgK/+g519XL4aB+j3SnNzUhlam4GRblDgS+DwtwMpvsyWTTTR4XfR1Fe5jh+erFxtHeA2oMd1DR3UtPUQe3BwPue1i46RjxykZWeQumUbEqn5lDhL2DW1Gz3OfA+w5dFasrE+EPMy4BWD8wO+jwLaIjwmIwwdQ+ISIm7OisBmsZoq95th2prqE69iKQBBUCrK79gRJ0/hPqSqnovcC/AkiVLTmiAodzv41ev76O5vYfi/MT7n8eE90pdC0BCT0gcbakpwrxpucyblstlp5UMl3f09LNjfzs79rfz9v42dh5op6u3f/ivfGHor30QSRn+y3/oQu7d4wJ/9Wenp5KfleZe6SPe0/C57bzMQHmoq4T+gUGOHO3jUFcvrZ19tHb20NoZ+NzS0evKA9u7DnRwqKuXrqBHFmb6sij3B4Jb4FUQ9avPUFSVpvYeapo6qHEBq6a5g9rmTvYdfnfpHxGYPTWHBcW5LJ1XeEywmjU1m8LcjKS5c+BlQNsElInIPGAfgYSNT404Zh1wsxsjOxc44gJVc5i664BVwO3u/cmg8v8nIj8E/ASSPzaq6oCItIvIMqASuBb4jxFtvQxcBTyvqioizwL/HJQIcglwS1R+KiFU+AsAqGo4wgWnTB/jaJNoKmtbKczNoGx6ntdd8VxeZhpnnzSVs09KnByqtNQUivIyj+tK63BXL9sa2qhqaGNbYxtVDUf4w44mBt2frPlZaZSXBIJbhd9HRamPBcV5pKeGv+3WPzBIR08/bUcDt0yHbpu2HQ28Hznax57WLmqbA1dfwVdbORmpLCjO45y5U1lZPJsF0/OYX5zL3KLcpLt1OhrPApobk7oZeBZIBR5Q1SoR+bzb/5/A08DlQDXQBVwfrq5r+nbgcRFZDewBrnZ1qkTkcQKJI/3ATao69GfWjcBDQDaBZJBnXPn9wKMugaSVQOBEVVtF5LsEgjLAd4YSRGKh3O8DoKqhzQLaBFRZ18LSuck3fjaZTcnJ4H0Lp/G+hdOGy7r7Bnh7fztVDUeGg93/2/jO8K3QjLQUTpmRz8kz8ukfHBwOUsFBqzOCh9X9BVnML87j42eVsmB6HguKA68ZvsxJ/29MLM02fpYsWaKbN28+obrn/evzvKd0Cnd9+qyxDzYJY9/ho7z/9ue59aPlXP/+eV53x8RZ/8AgdQc7j7mSq27qIMvdKh26JerLSseXnX5sWdDngux3b52mjXGVl4xE5FVVXTLWcV7ecjTHoaKkgKqGI153wxynylo3fjYB528045eWmkLZjHzKZuRz5ZkxS4Q2zuQL9RNUhd/H7pYum+l8gqmsbaUgO51FM/O97ooxSc8C2gSxuDSQGLK9sd3jnpjj8UpdC+fMLSRlgqQ9GzORWUCbICqGE0Mmx23H6x7cyGU/folnq/ZP2OmU9h/p5p2WLpYlyXRXxiQ6C2gTxHRfFtPyMnlrX5vXXYm55vYe/rCjmbqDHfzdo69yxf/9Ey/saJpwga3SPX+WDBMSGzMRWECbQCr8vklxhfbSrsC8gGtveC8/uOo9HOrq5foHN/Hxe/7Mn6sPety7yL1S20p+Vhqnlvi87ooxk4IFtAmkwu+juqkj6Zfr2LCzmaLcDN5TWsDVS2bz/Fcv4LaPLabxSDefuq+Slfe+zKbdMXvsL2oq3fjZRJk2yJiJzgLaBFLhL6B/UNm5v8PrrsTM4KDy0q6DnH9y8XAiRUZaCp8+9yRe+NoF3PrRcqqbOrn6P1/m2gc28sbewx73OLSm9m5qmzs5N0nnbzQmEVlAm0AmQ2JIVUMbLZ29nH/ytL/Yl5WeyvXvn8dL//AhbrlsEVvrD7Pirj/x2Yc3s60hscYWNw6vf2bjZ8bEiwW0CWROYQ55mWlUJdgv72ja4MbPzisrHvWY7IxU/u6DC3jpGxfy1YtPprKuhcvvfImbfvYa1U2J8VhDZW0ruRmpLPbb+Jkx8WIBbQJJSRHKS5I7MeTFHc0sLvUxLYKJYvMy0/jCRWX88R8u5AsXLuQPO5q45I4N/P1jW9jT0hWH3o6usq6Fs+cWTsppiozxiv3fNsGU+31sb2xnYHBipbBHoq27j9f2HOL8MFdnoRTkpPPVS07hpW9cyOfOm88zbzXysbv/xJEub2ZVae3sZeeBDhs/MybOLKBNMItLCzjaN0DdwU6vuxJ1f65uoX9Q+eDJxxfQhhTmZnDL5afyxOffx6GuXn743I4o9zAyG4efP7OAZkw8WUCbYJI5MWTDrmbyMtM4a5xrZS0uLeDT557Eo6+8w9v74z/e+EptK1npKZxWOiXu5zZmMrOANsEsnJ5HRlpK0iWGqCov7mjmfQuKxlwEMRJfufhkfNnp3PpkVdxnGKmsa+Xsk6aGXB3ZGBM79n/cBJOeGlgkMNmu0GoPBpaNP/8EbzeONDU3g69dcgqVda08tbUxKm1G4nBXL2/vb7PlYozxgAW0CSgwBVbbhJvbMJwNOwPp+ic6fhbKNUvnUF7i47anttPV2z92hSjYWNeKqs3faIwXwgY0EUkRkffFqzMmMhV+H4e7+mg40u11V6LmxZ3NzJ+Wy+zCnKi1mZoifHtFBY1Hurn7hZqotRtOZV0rmWkpnD67IC7nM8a8K2xAU9VB4N/j1BcToXJ/4Jdl1b7kuO3Y3TfAK7UtUbvdGOycuYVceYafezfU8k5L7DNDK+taOHPOFDLTUmN+LmPMsSK55fg/IvJxEbEZVhPEqSX5iJA0iSGbdrfS3TcY1duNwW65/FTSUoXv/nZ7TNofcrirl20NNn5mjFciCWhfAX4B9IpIm4i0i0hy/CadoHIy0pg/LTdpAtqGnc1kpKZwboye25rhy+ILF5bx++0H+MOOppico29gkC/8/HVEhIvLZ8TkHMaY8MYMaKqar6opqpquqj73eVwT1IlIoYg8JyK73HvIB49EZLmI7BCRahFZE0l9EbnFHb9DRC4NKj9bRLa6fXcOXXGKSKaIPObKK0VkblCdVe4cu0RkVVD5QyJSJyJb3OuM8fw8TkSFv4BtSZLp+OLOZpbOKyQnIy1m5/jbD8xl3rRcvvObbfT2D0a1bVVlzS+38tKug/zLX5/G4lIbPzPGCxFlOYrIFSLyb+71kSicdw2wXlXLgPXu88hzpgJ3AZcB5cA1IlIerr7bvxKoAJYDd7t2AO4BbgDK3Gu5K18NHFLVhcAdwPddW4XArcC5wFLg1hGB9+uqeoZ7bRnnz+O4LS710XCkm0OdvfE+dVQ1HjnKzgMdIWfXj6bMtFT+z0fKqT3YyYN/qotq23c8t5NfvlbPlz9cxieWzI5q28aYyI0Z0ETkduBLwDb3+pIrG48VwMNu+2HgyhDHLAWqVbVWVXuBta5euPorgLWq2qOqdUA1sFRESgCfqr6sgVz3R0bUGWrrCeAid/V2KfCcqraq6iHgOd4Ngp6rGEoMmeC3HV/aGViB+oMnT4/5uT60aDoXLZrOnet30dQWnQzRn2/cw53PV/OJJbP40kVlUWnTGHNiIrlCuxy4WFUfUNUHCPxSv3yc552hqo0A7j3Ub7NSYG/Q53pXFq7+aHVK3XaotobrqGo/cAQoGuP8ALeJyJsicoeIjDo1vIjcICKbRWRzc3PzaIcdt6EpsN6a4LcdX9zZzExfFifPyIvL+f7pI+X0DSi3P/P2uNt64e0mvvnrt/jgycXc9rHTsLwpY7wV6YPVwZPSRTRAICK/F5G3QrxWjF070ESIsrGeJB6tTri2TqTOLcAi4BygEPjGaB1S1XtVdYmqLikujl4W35ScDEqnZE/oK7T+gUH+WH2Q88qmxS0YzJ2Wy2fPm8evXt/Hq++0nnA7b9Yf5n/97DVOLcnn7k+fFZXpuowx4xPJ/4X/ArzuEiEeBl4F/nmsSqr6YVVdHOL1JHDA3QbEvYdKPasHggckZgENbnu0+qPVqXfbodoariMiaQQCdmu486tqowb0AA8SuD0ad+X+ib022hv1RzhytI8PnhKbdP3R3PShhcz0ZXHruqoTWoZnT0sXf/vQJoryMnjgunPIzYxdMosxJnJjzRQiwB+BZcCv3Ou9qrp2nOddBwxlDa4CngxxzCagTETmiUgGgWSPdWPUXwesdJmL8wgkf2x0tyXbRWSZ+07Xjqgz1NZVwPNunO1Z4BIRmeqSQS5xZQQFUyEwFvfWif8oTlyF30fdwU46e+IzrVO0bdjZTIrABxbGNiFkpNzMNP7xr07lrX1tPL5579gVghzq7OW6BzfSN6A8dP1SpudnxaiXxpjjNdZMIQr82l2RrFPVJ1V1fxTOeztwsYjsAi52nxERv4g87c7dD9xMIIhsBx5X1apw9d3+xwkkr/wOuElVB1ydG4H7CCSK1ADPuPL7gSIRqSbwzN0a11Yr8F0CgXUT8B1XBvAzEdkKbAWmAd+Lws/kuFX4C1DFkyVSouHFnc2cPnsKU3Iy4n7uj76nhKXzCvnBszsiXgi0u2+Azz6ymfrDR7lv1RIWTo/PuJ8xJjKR3Ct5RUTOUdVN0TqpqrYAF4UobyAo4URVnwaejrS+23cbcFuI8s3A4hDl3cDVo7T1APBAiPILQx0fb++ujdbG2SdNrMUkD3X28mb9Yb5woTeZgSLCtz5awUf+4yV++NwOvr3iL/5pHGNgUPny2i28tucQd33qLM6ZO7F+3sZMBpGMoX0IeFlEalxW31YReTPWHTNjKynIYmpOOlX7Jt4V2h+rDzKoxGT+xkiV+30RLQSqqnz3t9v4XdV+vvlX5Vx+Wkkce2mMiVQkAe0yYAFwIfBR4CPu3XhMRKjwF1DVOPESQzbsbKYgO53TZ3k7q8ZXLzmZgjEWAr3/j3U89OfdrP7APFZ/YF6ce2iMidSYy8cAT6nqOyNfceqfGUNFqY+d+zvoG4judE6xpKps2NXMBxZOI83jdPcpORl87dLRFwL9zRsNfO+p7fzVaSX878tP9aCHxphIRbJ8zBsiMidO/THHqcJfQO/AILsOdHjdlYjtONDOgbaemM2uf7xWnjOHCv9fLgRaWdvCVx9/g3PmTuXfP3E6KSn24LQxiSySP49LgCoRWS8i64Zese6YicxEnDFkaHXq82I8f2OkUlOEb19x7EKguw6087lHNjO7MJufXLuErHRb38yYRBdJluO3Y94Lc8LmFeWSk5HKtgk0Y8iLO5s5ZUY+JQXZXndl2JK5hXzszFLu3VDLB08p5strt5CZnspD1y/15LECY8zxi2T5mBeB3UC6294EvBbjfpkIpaQIp5ZMnBlDunr72VR3KOaz65+INZctIj1V+OR/vcyhrl4evO4cZhfmeN0tY0yEIplt/3MEZqH/L1dUCvw6lp0yx6fC72NbQxuDJzCNU7y9UttC78Cgp+n6o5nhy+Irl5xCWkoKd3/6LFvXzJgJJpIxtJuA9wNtAKq6i9Cz4xuPVPh9dPYO8E5rl9ddGdOGnQfJSk9J2AeTV39gHq//n4u54BT7J27MRBNJQOtx65EBwxP4Jv6lwCTy7tpoiX/b8cWdzSybX5TQSRY22bAxE1MkAe1FEflHIFtELgZ+Afwmtt0yx6NsRh5pKZLwS8nsbe2i7mBnwqTrG2OSSyQBbQ3QTGAi3r8jMLfiN2PZKXN8MtNSKZuRn/AB7UWXrp+I42fGmIlvzHsr7uHqn7iXSVCL/T5e2NGEqibsyskv7mxm1tRs5k/L9borxpgkZMvsJokKv4+DHb00tfd43ZWQevsHebmmhfNPLk7YgGuMmdgsoCWJCpdi/ta+xEwMeW3PITp6+jm/zG43GmNiwwJakji1xIcICTuOtmFnM2kpwvsWFnndFWNMkhp1DE1EfkOY9HxVvSImPTInJC8zjblFuQmbuv/izmbOmjMVX1a6110xxiSpcEkh/xa3XpioKPf7eGPvYa+78Rea23uoamjj65ee4nVXjDFJbNSA5uZtNBNIhd/HU282cqSrj4KcxLkS+mO1S9e38TNjTAxFMpdjmYg8ISLbRKR26BWPzpnjMzxjSIKtYP3ijmaKcjOGl7oxxphYiCQp5EHgHqAf+BDwCPDoeE4qIoUi8pyI7HLvU0c5brmI7BCRahFZE0l9EbnFHb9DRC4NKj9bRLa6fXeKyx0XkUwRecyVV4rI3KA6vxORwyLy2xH9mueO3eXqJsT6IkMBI5GWkhkcVF7adZDzyqbZApnGmJiKJKBlq+p6QFT1HVX9FnDhOM+7BlivqmXAevf5GCKSCtwFXAaUA9eISHm4+m7/SqACWA7c7dqBQFC+AShzr+WufDVwSFUXAncA3w/qxg+Az4To//eBO9z5D7k2PDctL5OZvqyEynSsamijpbPXZgcxxsRcJAGtW0RSgF0icrOIfIzxz7a/AnjYbT8MXBnimKVAtarWusmR17p64eqvANaqao+q1gHVwFIRKQF8qvqyqiqBq8wrQ7T1BHDR0NWbC+TtwZ1y+y50x4brvycq/Im1NtqGXW51ahs/M8bEWCQB7ctADvBF4GwCVyyrxnneGaraCODeQwXIUmBv0Od6Vxau/mh1St12qLaG66hqP3AECPewVBFw2B07si3PVfh9VDd1cLR3wOuuAIHxswq/j+L8TK+7YoxJcpHM5bjJbXYA10fasIj8HpgZYtf/jrSJUN05wTrh2jre8xzX8SJyA4FbncyZMydMs9FR7i9gUOHt/W2cOSfk0GTctHX38dqeQ9xw/nxP+2GMmRzGDGgicjLwdeCk4ONVNew4mqp+OEybB0SkRFUb3e3AphCH1QOzgz7PAhrc9mj1R6tT77ZDtTVUp96t9VYAtIb5ageBKSKS5q7Sgtv6C6qfuRN5AAAYPElEQVR6L3AvwJIlS2K+jtxQYkhVg/cB7c/VLfQPqo2fGWPiIpJbjr8AXiOwZMzXg17jsY53b1uuAp4MccwmoMxlFGYQSPZYN0b9dcBKl7k4j0Dyx0Z3W7JdRJa5MbBrR9QZausq4Hk3zhaS2/eCOzZc/z0xa2o2BdnpCZEYsmFXM3mZaZzlcWA1xkwOkSzN26+q90T5vLcDj4vIamAPcDWAiPiB+1T1clXtF5GbgWeBVOABVa0KV19Vq0TkcWAbgccMblLVocGkG4GHgGzgGfcCuB94VESqCVyZrRzqpIi8BCwC8kSkHlitqs8C3wDWisj3gNddGwlBRCgv8bHN48QQVWXDzmbeu6CIjDSbMtQYE3uRBLTfiMj/Av4bGF6bRFXD3ZYLS1VbgItClDcAlwd9fprAgqIR1Xf7bgNuC1G+GVgcorwbFxBD7DtvlPJaAlmYCanC7+PRV96hf2CQtFRvgklTew/1h46y+gPzPDm/MWbyiSSgDd2OC77NqICN9CeoilIfPf2D1DR3csrMfE/6UN3UAcDJM7w5vzFm8okky9H+xJ5ghqfAajjieUBbOD3Pk/MbYyafSOZyTBeRL7r5HJ9wD1cnzsy35i/Mn5ZLVnqKp4kh1U0d5GemMd2ePzPGxEkktxzvAdKBu93nz7iyz8aqU2Z80lJTWDTT2xlDqps6WDA9DzfpijHGxFwkAe0cVT096PPzIvJGrDpkoqPC72PdGw2oqidBpaa5w6a7MsbEVSQpcAMismDog4jMBxJjXiUzqgp/Ae3d/extPRr3c7d199HU3mPjZ8aYuIrkCu3rwAtuDTQhMGNIxFNgGW+8O2PIEeYU5cT13JYQYozxQiRZjutFpAw4hUBAe1tVe8aoZjx2ysx8UlOEqoY2LjutJK7nrrGAZozxwKgBTUQuVNXnReSvR+xaICKo6q9i3DczDlnpqSwszvMkMaS6uYOM1BRmT82O+7mNMZNXuCu0DwLPAx8NsU8BC2gJrsLv44/VB+N+3pqmDuZOy/FslhJjzOQ0akBT1Vvd5nfcYpnD3MS/JsGV+3386vV9NLf3xHU9suqmDsrdGJ4xxsRLJH9C/zJE2RMhykyCCZ4xJF56+gfY09rFgmIbPzPGxFe4MbRFQAVQMGIczQdkxbpjZvzKg9ZGu+CUUIuCR9/ug10MqiWEGGPiL9wY2inAR4ApHDuO1g58LpadMtFRkJ3OnMIctsVxCqyhlH27QjPGxFu4MbQngSdF5L2q+nIc+2SiqMIf3ymwLKAZY7wSyRja50VkytAHEZkqIg/EsE8miir8Pna3dNHW3ReX89U0d1A6JZvsjNS4nM8YY4ZEEtDeo6qHhz6o6iHgzNh1yUTTUGLI9jjddqxu6rDxM2OMJyIJaCkiMnXog4gUEtmUWSYBVAQlhsTa4KBSe9ACmjHGG5EEpn8H/iwiQ6n6VwO3xa5LJpqm+7KYlpfJtsbYB7R9h4/S3TdoAc0Y44lI5nJ8REReBT5EYC7Hv1bVbTHvmYmaQGJI7ANadbMlhBhjvBPRrUNVrRKRZtzzZyIyR1X3xLRnJmoq/D7+tKGWnv4BMtNil6xhkxIbY7w05hiaiFwhIruAOuBFYDfwzHhOKiKFIvKciOxy71NHOW65iOwQkWoRWRNJfRG5xR2/Q0QuDSo/W0S2un13ilv1UkQyReQxV14pInOD6vxORA6LyG9H9OshEakTkS3udcZ4fh6xVuEvoH9Q2XWgI6bnqW7qoDA3g8LcjJiexxhjQokkKeS7wDJgp6rOAy4C/jTO864B1qtqGbDefT6GiKQCdwGXAeXANSJSHq6+27+SwAwny4G7XTsA9wA3AGXutdyVrwYOqepC4A7g+0Hd+AHwmVG+w9dV9Qz32nKc3z+ugtdGi6Wa5g4W2u1GY4xHIglofaraQiDbMUVVXwDGe0WyAnjYbT8MXBnimKVAtarWqmovsNbVC1d/BbBWVXvchMrVwFIRKQF8qvqyqirwyIg6Q209AVw0dPWmqusJzIwyoc0pzCEvMy3m42jVTR0smJ4b03MYY8xoIgloh0UkD9gA/ExEfgz0j/O8M1S1EcC9h5posBTYG/S53pWFqz9anVK3Haqt4Tqq2g8cAYoi+A63icibInKHiIw6lb2I3CAim0Vkc3NzcwTNRl9KilBeEtvEkJaOHg519VlCiDHGM5EEtBVAF/D3wO+AGkKvkXYMEfm9iLwV4rVirLpDTYQo0xOsE66tEznPLcAi4BygEPjGaAeq6r2qukRVlxQXF4/RbOyU+31sb2xjYHCsr3Ziqi0hxBjjsbBZjm786UlV/TAwyLu35sbk6ozW7gERKVHVRnc7sCnEYfXA7KDPs4AGtz1a/dHq1LvtUG0N1akXkTSgAGgd47s1us0eEXkQ+Fq44xNBhd9HV+8Au1s6Y3IVVdPcCVjKvjHGO2Gv0FR1AOgSkYIon3cdsMptrwKeDHHMJqBMROaJSAaBZI91Y9RfB6x0mYvzCCR/bHQBqF1ElrnxsWtH1Blq6yrgeTfONioXRHFtXQm8FdnX9k55jGcMqW7qIDs9ldIp2TFp3xhjxhLJc2jdwFYReQ7oHCpU1S+O47y3A4+LyGpgD4HZRxARP3Cfql6uqv0icjPwLJAKPKCqVeHqu+flHge2ERjnu8kFZYAbgYeAbAKPHQw9enA/8KiIVBO4Mls51EkReYnArcU8EakHVqvqswTGEosJ3K7cAnx+HD+LuCibnk96qlDVcIQrTvdHvf3q5g7mF+eSkhLqDq4xxsReJAHtKfeKGpc1eVGI8gbg8qDPTwNPR1rf7buNEFNzqepmYHGI8m5cQAyx77xRyi8MVZ7IMtJSOHlGfszWRqtp6mDJ3JCPExpjTFyEW7F6jqruUdWIx81MYqvw+/j99iZUFfdkQlR09faz7/BRPlk8e+yDjTEmRsKNof16aENEfhmHvpgYq/AX0NrZy/627qi2W+sSQizD0RjjpXABLfhP+Pmx7oiJveEZQ/ZF97ajpewbYxJBuICmo2ybCerUEh8i0c90rGnuIDVFOKkoJ6rtGmPM8QiXFHK6iLQRuFLLdtu4z6qqvpj3zkRVbmYa84pyoz6nY3VTB3MKc2I6k78xxoxl1ICmqvbbKQmV+328vudwVNusbuqwB6qNMZ6LZOork0Qq/AXsO3yUw129UWmvf2CQ3S2dNn5mjPGcBbRJZigxJFrPo+1p7aJvQC2gGWM8ZwFtkqmI8hRYQxmOC4pt2RhjjLcsoE0yRXmZzPRlRS0xpLrZBTS7QjPGeMwC2iRU4Y/e2mjVTR3M8GXiy0qPSnvGGHOiLKBNQhV+HzXNHRztHRj74DHUNMdmORpjjDleFtAmoXJ/AYMKb+8f31WaqlLT1GEJIcaYhGABbRKKVmLIgbYeOnr6LaAZYxKCBbRJaNbUbAqy08cd0GpcQshCu+VojEkAFtAmIRGhvMTHtnFmOg6n7NsVmjEmAVhAm6Qq/D7e3t9O/8DgCbdR3dRBfmYa0/Mzo9gzY4w5MRbQJqmKUh89/YPUuLXMTkR1UwcLpudFdbFQY4w5URbQJqkKfwHAuB6wrmm2DEdjTOKwgDZJzZ+WS2ZaygknhrR199HU3mPPoBljEoYnAU1ECkXkORHZ5d6njnLcchHZISLVIrImkvoicos7foeIXBpUfraIbHX77hR3n0xEMkXkMVdeKSJzXfkZIvKyiFSJyJsi8smgtua5Y3e5uhnR/ynFVlpqCotKfCd8hWarVBtjEo1XV2hrgPWqWgasd5+PISKpwF3AZUA5cI2IlIer7/avBCqA5cDdrh2Ae4AbgDL3Wu7KVwOHVHUhcAfwfVfeBVyrqkNt/UhEprh93wfucOc/5NqYcCr8PrY1tKF6/AuSW0AzxiQarwLaCuBht/0wcGWIY5YC1apaq6q9wFpXL1z9FcBaVe1R1TqgGlgqIiWAT1Vf1sBv70dG1Blq6wngIhERVd2pqrsAVLUBaAKK3ZXdhe7YcP1PeBV+H23d/dQfOnrcdWuaO8hITWH21OwY9MwYY46fVwFthqo2Arj36SGOKQX2Bn2ud2Xh6o9Wp9Rth2pruI6q9gNHgKLgjojIUiADqHH7DrtjR7Y1oYwnMaSmqYO503JIS7VhWGNMYojZbyMR+b2IvBXitWLs2oEmQpSNdW9stDrh2gp7Hnd19yhwvaoOHm+/ROQGEdksIpubm5tH7bgXFs3MJzVFTigxpNrmcDTGJJi0WDWsqh8ebZ+IHBCRElVtdAGjKcRh9cDsoM+zgAa3PVr90erUu+1QbQ3VqReRNKAAaHX99AFPAd9U1Vfc8QeBKSKS5q7SgtsK9XO4F7gXYMmSJcc/WBVDWempLCjOPe7Vq3v6B9jT2sUVp/tj1DNjjDl+Xt0vWgescturgCdDHLMJKHMZhRkEkj3WjVF/HbDSZS7OI5D8sdHdlmwXkWVuDOzaEXWG2roKeF5V1Z3zv4FHVPUXQ51yY3AvuGPD9X9CqPAXHPcV2u6DXQyqTXlljEksXgW024GLRWQXcLH7jIj4ReRpGB7Puhl4FtgOPK6qVeHqu/2PA9uA3wE3qerQol83AvcRSBSpAZ5x5fcDRSJSDXyFdzMuPwGcD1wnIlvc6wy37xvAV1ydItfGhFTh97G/rZuWjp6I6wzP4WjPoBljEkjMbjmGo6otwEUhyhuAy4M+Pw08HWl9t+824LYQ5ZuBxSHKu4GrQ5T/FPjpKOeoJZCFOeGVBy0lc/7JxRHVqW7qQMQCmjEmsViK2iRXUTKU6Rj5bcea5g5Kp2STnZE69sHGGBMnFtAmuYKcdGZNzT6u1P3qpg67OjPGJBwLaGZ4xpBIDA4qtQctZd8Yk3gsoBkq/AXUtXTS2dM/5rH7Dh+lu2/QApoxJuFYQDNU+H2owvbGsa/SqpttDkdjTGKygGaOyXQcS42l7BtjEpQFNMNMXxaFuRkRJYZUN3VQmJtBYe6EWzHHGJPkLKAZRIQKvy+iK7Tqpg4W2tWZMSYBWUAzQOC2484D7fT2D4Y9rqa5w6a8MsYkJAtoBghkOvYNKLua2kc9pqWjh0NdfSwozo1jz4wxJjIW0AwQyHSE8Ikhtkq1MSaRWUAzAMwryiUnIzXsA9Y1zZ2ABTRjTGKygGYASEkRTi3xhc10rG7qIDs9FX9Bdhx7ZowxkbGAZoYNTYE1OBh6HdLq5g7mF+eSkhJq0W5jjPGWBTQzrMLvo7N3gHdau0Lur2myORyNMYnLApoZVuEfWkrmL287dvX2s+/wUXsGzRiTsCygmWFlM/JIS5GQmY61LiHEnkEzxiQqC2hmWGZaKmUz8kMGNEvZN8YkOgto5hiBxJAjqB6bGFLd1EFqijC3yB6qNsYkJgto5hgVfh8HO3ppau85prymuYOTCnPISLN/MsaYxGS/ncwxRksMqW7qYL4lhBhjEpgnAU1ECkXkORHZ5d6njnLcchHZISLVIrImkvoicos7foeIXBpUfraIbHX77hQRceWZIvKYK68Ukbmu/AwReVlEqkTkTRH5ZFBbD4lInYhsca8zov9T8sapJfkAVO17dxytf2CQ3S2dNn5mjEloXl2hrQHWq2oZsN59PoaIpAJ3AZcB5cA1IlIerr7bvxKoAJYDd7t2AO4BbgDK3Gu5K18NHFLVhcAdwPddeRdwraoOtfUjEZkS1MWvq+oZ7rVlXD+NBJKflc7copxjEkP2tHbRN6AW0IwxCc2rgLYCeNhtPwxcGeKYpUC1qtaqai+w1tULV38FsFZVe1S1DqgGlopICeBT1Zc1kO3wyIg6Q209AVwkIqKqO1V1F4CqNgBNQPF4v/hEUOEvoKrx3VuOluFojJkIvApoM1S1EcC9Tw9xTCmwN+hzvSsLV3+0OqVuO1Rbw3VUtR84AhQFd0RElgIZQE1Q8W3uVuQdIpI52hcVkRtEZLOIbG5ubh7tsIRS7vext/UoR472AYEprwDm27IxxpgEFrOAJiK/F5G3QrxWjF070ESIstCTDI5dJ1xbYc/jru4eBa5X1aHVL28BFgHnAIXAN0brkKreq6pLVHVJcfHEuMAbWkpmaOb96qYOZvgy8WWle9ktY4wJKy1WDavqh0fbJyIHRKREVRtdwGgKcVg9MDvo8yygwW2PVn+0OvVuO1RbQ3XqRSQNKABaXT99wFPAN1X1laDv1ug2e0TkQeBro33XiSg40/G9C4qoabaEEGNM4vPqluM6YJXbXgU8GeKYTUCZiMwTkQwCyR7rxqi/DljpMhfnEUj+2OgCULuILHPZjdeOqDPU1lXA86qq7pz/DTyiqr8I7pgLori2rgTeOpEfQqIqzs9ken4m2xraUFVqmjpYYCn7xpgEF7MrtDHcDjwuIquBPcDVACLiB+5T1ctVtV9EbgaeBVKBB1S1Klx9Va0SkceBbUA/cJOqDrg6NwIPAdnAM+4FcD/wqIhUE7gyW+nKPwGcDxSJyHWu7DqX0fgzESkmcLtyC/D5qP1kEkSF30dVQxsH2nro6Om3KzRjTMLzJKCpagtwUYjyBuDyoM9PA09HWt/tuw24LUT5ZmBxiPJuXEAcUf5T4KejnOPCUOXJpMJfwIZdB4cfsLZZ9o0xic5mCjEhVfh9DAwqT20NDBfaFZoxJtFZQDMhDSWG/E/VAfIz0yjOH/XJBGOMSQgW0ExIswuzyc9Ko6OnnwXT83AzhRljTMKygGZCEhHKSwLPo9ntRmPMRGABzYxq6LajBTRjzERgAc2MamjGEHsGzRgzEXj1HJqZAC6umMFnG+fx/oVFYx9sjDEes4BmRuXLSuebHykf+0BjjEkAdsvRGGNMUrCAZowxJilYQDPGGJMULKAZY4xJChbQjDHGJAULaMYYY5KCBTRjjDFJwQKaMcaYpCCq6nUfJg0RaQbeOcHq04CDUezORGDfeXKw75z8xvt9T1LV4rEOsoA2QYjIZlVd4nU/4sm+8+Rg3zn5xev72i1HY4wxScECmjHGmKRgAW3iuNfrDnjAvvPkYN85+cXl+9oYmjHGmKRgV2jGGGOSggW0BCciy0Vkh4hUi8gar/sTayIyW0ReEJHtIlIlIl/yuk/xIiKpIvK6iPzW677Eg4hMEZEnRORt99/7vV73KdZE5O/dv+u3ROTnIpLldZ+iTUQeEJEmEXkrqKxQRJ4TkV3ufWoszm0BLYGJSCpwF3AZUA5cIyLJvuJmP/BVVT0VWAbcNAm+85AvAdu97kQc/Rj4naouAk4nyb+7iJQCXwSWqOpiIBVY6W2vYuIhYPmIsjXAelUtA9a7z1FnAS2xLQWqVbVWVXuBtcAKj/sUU6raqKqvue12Ar/kSr3tVeyJyCzgr4D7vO5LPIiIDzgfuB9AVXtV9bC3vYqLNCBbRNKAHKDB4/5EnapuAFpHFK8AHnbbDwNXxuLcFtASWymwN+hzPZPgl/sQEZkLnAlUetuTuPgR8A/AoNcdiZP5QDPwoLvNep+I5HrdqVhS1X3AvwF7gEbgiKr+j7e9ipsZqtoIgT9agemxOIkFtMQmIcomRVqqiOQBvwS+rKptXvcnlkTkI0CTqr7qdV/iKA04C7hHVc8EOonRbahE4caNVgDzAD+QKyJ/422vkosFtMRWD8wO+jyLJLxFMZKIpBMIZj9T1V953Z84eD9whYjsJnBb+UIR+am3XYq5eqBeVYeuvp8gEOCS2YeBOlVtVtU+4FfA+zzuU7wcEJESAPfeFIuTWEBLbJuAMhGZJyIZBAaQ13ncp5gSESEwrrJdVX/odX/iQVVvUdVZqjqXwH/j51U1qf9yV9X9wF4ROcUVXQRs87BL8bAHWCYiOe7f+UUkeSJMkHXAKre9CngyFidJi0WjJjpUtV9EbgaeJZAR9YCqVnncrVh7P/AZYKuIbHFl/6iqT3vYJxMbXwB+5v5YqwWu97g/MaWqlSLyBPAagWze10nCGUNE5OfABcA0EakHbgVuBx4XkdUEAvvVMTm3zRRijDEmGdgtR2OMMUnBApoxxpikYAHNGGNMUrCAZowxJilYQDPGGJMULKAZY4xJChbQjDHGJAULaMZMYm7tuYvd9vdE5E6v+2TMibKZQoyZ3G4FviMi0wmsbHCFx/0x5oTZTCHGTHIi8iKQB1zg1qAzZkKyW47GTGIichpQAvRYMDMTnQU0YyYpt4zHzwis0dUpIpd63CVjxsUCmjGTkIjkEFiP66uquh34LvAtTztlzDjZGJoxxpikYFdoxhhjkoIFNGOMMUnBApoxxpikYAHNGGNMUrCAZowxJilYQDPGGJMULKAZY4xJChbQjDHGJIX/D0GErejy8gBNAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Plot error\n", "plt.plot(t, (xlsoda-xsol(t))/xsol(t))\n", "plt.xlabel(r'$x$')\n", "lab=plt.ylabel('Fractional error')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Beyond the Library\n", "\n", "A method like LSODA should usually be your first go-to, but it's not the end of the story. There are plenty of problems where more specialised integrators are desirable. We won't go over all of them, but one application that is particularly important in astrophysics is orbits, or more generally conservative systems. To see why, let's consider another simple ODE, one that describes the orbit of a point mass in a point gravitational potential.\n", "\n", "To be precise, suppose we have an object of mass $M_0$ at the origin, and a second test mass located at a position $\\mathbf{x}_0$ traveling with velocity $\\mathbf{v}_0$ at time 0. The test mass accelerates in the gravitational potential of the first mass, so its equation of motion is\n", "\\begin{equation}\n", "\\frac{d^2}{dt^2} \\mathbf{x} = -\\frac{G M_0}{|\\mathbf{x}|^3} \\mathbf{x}.\n", "\\end{equation}\n", "To make life easy, we will choose units such that $G M_0 = 1$, so the equation we want to solve is\n", "\\begin{equation}\n", "\\frac{d^2}{dt^2} \\mathbf{x} = -\\frac{\\mathbf{x}}{|\\mathbf{x}|^3},\n", "\\end{equation}\n", "subject to the initial conditions $\\mathbf{x} = \\mathbf{x_0}$, $(d/dt)\\mathbf{x} = \\mathbf{v}_0$ at $t = 0$. Without loss of generality we can choose our coordinate system so that the orbit is entirely in the $x-y$ plane.\n", "\n", "Let us first solve this equation with the standard library. To do this, we must first rewrite it as a system of first-order ODEs:\n", "\\begin{equation}\n", "\\frac{d}{dt} \\left(\n", "\\begin{array}{c}\n", "x \\\\\n", "y \\\\\n", "v_x \\\\\n", "v_y \n", "\\end{array}\n", "\\right) =\n", "\\left(\n", "\\begin{array}{c}\n", "v_x \\\\\n", "v_y \\\\\n", "-\\frac{x}{(x^2+y^2)^{3/2}} \\\\\n", "-\\frac{y}{(x^2+y^2)^{3/2}}\n", "\\end{array}\n", "\\right).\n", "\\end{equation}\n", "We can now define a function that returns the derivatives." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "# Define a fucntion that returns the derivatives; it takes t and an array of 4 quantities\n", "# as inputs, and returns an array of 4 derivatives as outputs.\n", "def f(t, q):\n", " # q[0] = x, q[1] = y, q[2] = v_x, q[3] = v_y\n", " dqdt = np.zeros(4)\n", " dqdt[0] = q[2]\n", " dqdt[1] = q[3]\n", " dqdt[2] = -q[0] / (q[0]**2 + q[1]**2)**(3./2.)\n", " dqdt[3] = -q[1] / (q[0]**2 + q[1]**2)**(3./2.)\n", " return dqdt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we are in a position to integrate." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Pick some initial conditions: x = 1, y = 0, vx = 0, vy = 1, \n", "# which produces a nice circular orbit with a period of 1\n", "q0 = np.array([1.0, 0.0, 0.0, 1.0])\n", "t0 = 0.0\n", "\n", "# Set up the integrator\n", "integrator = ode(f).set_integrator('lsoda')\n", "\n", "# Set the initial conditions\n", "integrator.set_initial_value(q0, t0)\n", "\n", "# Integrate\n", "dt = 0.05\n", "nstep = 200\n", "t = np.arange(1+nstep)*dt\n", "qsol = np.zeros((1+nstep,4))\n", "qsol[0,:] = q0\n", "for i in range(nstep):\n", " qsol[i+1,:] = integrator.integrate(integrator.t+dt)\n", " \n", "# Plot\n", "plt.plot(qsol[:,0], qsol[:,1])\n", "plt.axis('equal')\n", "plt.xlabel(r'$x$')\n", "lab=plt.ylabel(r'$y$')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So far, so good. But what if we pick an orbit that is much more elliptical, and we run for a significantly longer time?" ] }, { "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" } ], "source": [ "# These produce an elliptical orbit: x = 1, y = 0, vx = 0, vy = 0.5\n", "q0 = np.array([1.0, 0.0, 0.0, 0.5])\n", "\n", "# Set initial conditions\n", "integrator.set_initial_value(q0, t0)\n", "\n", "# Integrate; note 100x as long an integration; we also use a somewhat smaller\n", "# output time, to see the orbit better\n", "dt = 0.01\n", "nstep = 100000\n", "t = np.arange(1+nstep)*dt\n", "qsol = np.zeros((1+nstep,4))\n", "qsol[0,:] = q0\n", "for i in range(nstep):\n", " qsol[i+1,:] = integrator.integrate(integrator.t+dt)\n", " \n", "# Plot late time behaviour\n", "plt.plot(qsol[-1000:,0], qsol[-1000:,1])\n", "plt.axis('equal')\n", "plt.xlabel(r'$x$')\n", "lab=plt.ylabel(r'$y$')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This still looks pretty good, but it is interesting to plot the time evolution of the total energy per unit mass of the test particle,\n", "\\begin{equation}\n", "E = \\frac{1}{2}\\left(v_x^2 + v_y^2\\right) - \\frac{1}{\\sqrt{x^2 + y^2}},\n", "\\end{equation}\n", "which should be conserved." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Compute energy\n", "E = 0.5*(qsol[:,2]**2+qsol[:,3]**2) - 1.0/np.sqrt(qsol[:,0]**2+qsol[:,1]**2)\n", "\n", "# Plot\n", "plt.plot(t, E)\n", "plt.xlabel(r'$t$')\n", "lab=plt.ylabel(r'$E$')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Clearly LSODA, as nice as it is, is not conserving total energy. Instead, the energy is, over many orbits, increasing. There is a secular expansion of the orbit. In retrospect, this is not surprising. Nothing we have done in setting up our methods knows anything at all about energy, or about conservation laws in general. However, it is also potentially disastrous for long-term integration. We integrated for $\\sim 1000$ orbits, and gained a few tenths of a percent of our total energy. This means that if we want to integrate for a million orbits, a method like LSODA will encounter severe difficulties.\n", "\n", "To handle problems like this, it is possible to write ODE integrators that do respect conservation laws. Integrators of this type are called symplectic integrators. The simplest syplectic integrator is called the staggered leapfrog, or sometimes kick-drift. The idea behind it is simple. Let us suppose that we know the position $\\mathbf{x}_i$ at time $t_i$, and the velocity $\\mathbf{v}_{i+1/2}$ at time $t_{i+1/2}$, half a time step later. Here is a very, very simple integration algorithm:\n", "\\begin{eqnarray}\n", "\\mathbf{x}_{i+1} & = & \\mathbf{x}_i + \\mathbf{v}_{i+1/2} \\Delta t \\\\\n", "\\mathbf{v}_{i+3/2} & = & \\mathbf{v}_{i+1/2} - \\frac{x_{i+1}}{|\\mathbf{x}_{i+1}|^3} \\Delta t\n", "\\end{eqnarray}\n", "The reason it is called leapfrog is clear: the position and velocity leapfrog over each other in the advance. Let us code that up and see how it does." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "# Trivial symplectic integration; note that we need to use a smaller time step,\n", "# since we're doing something dumb and non-adaptive, but we'll integrate for the\n", "# same total time\n", "q0 = np.array([1.0, 0.0, 0.0, 0.5])\n", "dt = 0.001\n", "nstep = 1000000\n", "tsymp = np.arange(nstep+1)*dt\n", "qsymp = np.zeros((1+nstep,4))\n", "\n", "# Note that we will understand q[i,0] and q[i,1] as containing x, y, at time t_i, \n", "# and q[i,2] and q[i,3] as containing vx, vy at time t_i+1/2\n", "qsymp[0,:] = q0\n", "for i in range(nstep):\n", " qsymp[i+1,0:2] = qsymp[i,0:2] + qsymp[i,2:4]*dt\n", " qsymp[i+1,2:4] = qsymp[i,2:4] - qsymp[i+1,0:2]*dt / \\\n", " (qsymp[i+1,0]**2 + qsymp[i+1,1]**2)**(3./2.)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Plot the last orbit produced by the symplectic integrator\n", "plt.plot(qsymp[-10000:,0], qsymp[-10000:,1])\n", "plt.axis('equal')\n", "plt.xlabel(r'$x$')\n", "lab=plt.ylabel(r'$y$')" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Compute energy; note that we use the average positions between two time steps in order\n", "# to ensure that we're evaluating at the same time as the velocity\n", "x = 0.5*(qsymp[:-1,0]+qsymp[1:,0])\n", "y = 0.5*(qsymp[:-1,1]+qsymp[1:,1])\n", "Esymp = 0.5*(qsymp[:-1,2]**2+qsymp[:-1,3]**2) - 1.0/np.sqrt(x**2+y**2)\n", "\n", "# Plot LSODA vs. leapfrog\n", "plt.plot(tsymp[1::1000], Esymp[::1000], label='Leapfrog')\n", "plt.plot(t, E, label='LSODA')\n", "plt.xlabel(r'$t$')\n", "plt.legend(loc='upper left')\n", "lab=plt.ylabel(r'$E$')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is a fascinating result. The leapfrog integrator is incredibly dumb and unsophisticated compared to LSODA, and if you look carefully at the plot of the last orbit, you will see that the orbit has precessed a noticeable abmount. However, for all its faults, leapfrog conserves energy nearly perfectly, much better than LSODA. The orbit may precess, but it does not decay. This is a fundamental property of symplectic integrators: they are constructed so as to respect conserved quantities. For this reason, long orbit integrations tend to use specialised symplectic integrators, which are higher-order members of the same family as the leapfrog.\n", "\n", "Why does leapfrog have this property? It's a bit complex to prove it, but a basic reason has to do with the fact that it is manifestly time reversible. That is, given the current state of the integrator, you can run it backwards or forwards, and always recover (to machine precision, at least) your previous state. That is not true of other integrators we've used, and it's important, something we know because of this person:\n", "\n", "![Emmy Noether](https://upload.wikimedia.org/wikipedia/commons/e/e5/Noether.jpg)\n", "\n", "Emmy Noether showed that conservation laws are equivalent to symmetries; conservation of energy is equivalent to the symmetry of the laws of physics under reparameterisation in time, including time reversibility. To conserve energy, and integrator must be time reversible, though that by itself is not sufficient. Leapfrog is time reversible, while LSODA is not." ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.16" } }, "nbformat": 4, "nbformat_minor": 1 }