{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Numerical Solution of Ordinary Differential Equations\n", "=====================================================\n", "\n", "This notebook illustrates 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." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Import some useful stuff\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Forward Differencing\n", "--------------------\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": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAEQCAYAAAC0v9O7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xd4VVX69vHvEwid0JsQ+tAVFEVQdEKTIoiCChFEVEQR\nRERpOkCwAg6Kio6DgNIU2+tYBgVHJgg2EHRoCUV/lISqIRRDCcl6/0jEBENNdvY5yf25Li7PPmdl\n506E85y11l5rm3MOERGR34X4HUBERAKLCoOIiGSiwiAiIpmoMIiISCYqDCIikokKg4iIZOJpYTCz\nmWa2x8zWnKHNi2a22cx+NLNmXuYREZGz87rH8DrQ8XQvmllnoI5z7i/AvcCrHucREZGz8LQwOOeW\nA/vP0KQ7MCe97XdAKTOr5GUmERE5M7/nGKoCOzIcx6c/JyIiPvG7MFgWz2mPDhERHxX0+fvHAeEZ\njqsBO7NqaGYqGCIiF8A5l9WH8NPKjcJgZN0zAPgIGAy8bWYtgUTn3J7TnUgb/qWJiooiKirK7xgB\nQb+LP+TE78I5x/6j+9n72172/raX+MR9bN37C3EJv7D7wK/88lsCCUcSOJi8n99S9pPk9nPcEkmx\nYxQ4EQbHwnBHw0g9EkaBlJIUciUpRAkKWwmKFihO0YLFKRZanOKhxSleqBglChejeOGihBUpRsmi\nRdP/FCGsaFHCihWhZLHClCpehBJFC1KkiFGkCBQpAoULQ6FCEHKaMQ/9vfiD2XnVBMDjwmBmbwIR\nQDkz2w6MBwoBzjk33Tm30My6mNkW4DfgTi/ziORnh48fZvuB7ew4sIOffokjJi6On3+JZ+fBXew7\nuovEE7tIsn2EpBQn5EhFUg9VIPVwBYqmVqBESHnCQqtSpsjFhBcrS4WSZahUqgxVSpfhorKlqVKu\nOGXKGKVKQalSULLk6d+0JfB5Whicc7edQ5shXmYQyS+cc+w4sIPNCZtZv3szP279mdi9P7P94M/8\ncmIrx0ki9LfqpOwPxyWGExZSlQqFLqVKyeu5uEwValWoQr2LKhJ+UWEqVYJKldLe5C/gA6cEOb/n\nGOQCRERE+B0hYOTH30VKago/7/+Z/+1Zw8qtG1i5dQObEmLYtS2WiZNewxLqkbynLmWpQ7XiN9Oq\nQi0aV61Jk1oVqFXLqF4dypXL22/4+fHvRU6yYBm3NzMXLFlFcsrxlOOs3bOWlXGr+SJmFat2/kDc\nsfUUOFqBlF0XUyChMdWLNqJJpYa0qFOfpg1KUq8e1KgBBQr4nV4CgZmd9+SzCoNIANl1aBfLti9n\n0fpvWPZ/3/J/R/5H6OHaHN/anHLHm3NJhUu5pv7FXNm0FE2bpg335OVP/pJ9KgwiQWbP4T18/tMX\nvL96CV/FfUni8V+wHa0pvPcqLq3QkuuaXM41V5bg0kvTJnRFzpcKg0iAO55ynOXbl/PW9wv5dNNi\n9h7bAVsjKL2/LdeGR9D9qsb89doQqlf3O6nkFSoMIgHo4LGDfBjzCTO++oDv9n2OJdSjwE/Xc02V\nTtzSujnXtS9ItWp+p5S8SoVBJEAcOnaId9f+i38se5v/JX4J267logM3cUuzrtzapRLNm+s6f8kd\nKgwiPjqReoKFGxfx3Bdz+Xrfp7D1Wmof6c2dV3cl8qZSGh4SX6gwiPjg5/0/8+x/ZjFv/Rsc21uV\nKnv7M6DVLdzVuzxVtVew+OxCCoMWuIlcgFSXysLYz/nbJy+yPnEFhWL7cmvdzxj5QBMaNvQ7nUj2\nqDCInIejJ44yNXo2zy57noMJRai3fyjzerxHj6iihIb6nU4kZ6gwiJyDA0cPMP7jV/nnmqmkbL+c\nG8pP58nB19CggVaXSd6jwiByBoeOHeLhd1/gjdgXKLi1I/c1Xsy4qRdTpozfyUS8o8IgkoUjyUd4\n+J2XmLlhCqE7OjC25deMHPsXChf2O5mI91QYRDJIdalMXvgWj3/1KLa7OY9esYQx4xtTqJDfyURy\njwqDSLoPV33D3e8/yIFEGFRnHs+Ov0Y9BMmXPC8MZtYJmAqEADOdc5NOeb06MAuoAPwK9HXOZXnf\nZxEvxO//le4vjWL1oU/pVmQybzwdSZnSWpYs+Zenf/vNLASYBnQEGgORZtbglGZ/B95wzjUFHgcm\neplJ5HfOOR58YxY1JjUicW9xfhiwgQ+f6KOiIPme1z2GFsBm59w2ADNbAHQHYjO0aQQMA3DORZvZ\nhx5nEmHl5u10nT6AA8d+5aU2nzHopkv9jiQSMLz+aFQV2JHhOC79uYx+BHoCmFkPoISZ6WJA8URq\nqqPfC9O5cmZzGhaJYN8z36ooiJzC6x5DVqt/Tt3waAQwzcz6A18C8cCJrE4WFRV18nFERITu6yrn\nZc2WfbR76U6SQnbzbs//0rN1E78jieS46OhooqOjs3UOTzfRM7OWQJRzrlP68WjAnToBnaF9cSDG\nOfenfSi1iZ5kx2OzPmdiTH9alejLolFPULyIrj+V/CEQN9FbCdQ1sxrALqA3EJmxgZmVAxLS3/XH\nkHaFkkiOOHAwhdbjxhJbeA4vtp3N4M7t/Y4kEvA8LQzOuRQzGwIs5o/LVWPMbAKw0jn3CRABPGNm\nqaQNJQ32MpPkH9Er93H9rNsoVTqVzcNXU7NCRb8jiQQF3Y9B8qTHXlnBxJ9uoUv12/jggScoGKK1\nnJI/BeJQkkiuOn4cOo98k6VFH2Rq5+k80P4mvyOJBB0VBskzdu1yXDkqil/CZ7P87iW0rH2x35FE\ngpIKg+QJ335/lHYv3kmZOv/HTw99R5WwSn5HEglaWvsvQe+dDw9wzfRONL00hc2P/ldFQSSbVBgk\nqE2ctos+//krN7a6mOXDFlA0tKjfkUSCnoaSJCg5B4Me28Ks4x0Z0rY/z934N8x0m02RnKDCIEEn\nJQVuGxrLByXb83TXv/FIxH1+RxLJU1QYJKgcPw7dB6xnSbXrePGGp7ivZX+/I4nkOSoMEjSOHoUO\nfdewskFHXr3p79zZvI/fkUTyJBUGCQpHj0L729azqlFHZt4ylT5Ne/kdSSTP0lVJEvCOHoXrem9h\ndaPr+OfNf1dREPGYCoMEtKNHoVOv7axq3J7nukfRr5mGj0S8psIgAevECbix7x5WNW7P49cP474r\n7vE7kki+oMIgASk1FW6/+xDf1O7CsHa38fBVw/yOJJJvaNttCTjOweChySywbtzYpjozb/ynFq+J\nXKAL2XZbPQYJOOOjHG8fGUCLy0OZ3v0VFQWRXOZ5YTCzTmYWa2abzGxUFq+Hm9kSM1ttZj+aWWev\nM0ngmjEDpq0bT83mG3m/9wLdYEfEB54OJZlZCLAJaAfsJO0e0L2dc7EZ2vwTWO2c+6eZNQQWOudq\nZXEuDSXlcZ9+Cr2fnk/J7n9j9aDvqFhct+IUya5AHEpqAWx2zm1zziUDC4Dup7RJBcLSH5cG4j3O\nJAFo9WqIHPkNIZ0f4rN+H6soiPjI6356VWBHhuM40opFRhOAxWY2FCgGtPc4kwSYuDjocts2Qm7v\nydybX6dJxSZ+RxLJ17wuDFl1X04dD4oEXnfOPW9mLYF5QOOsThYVFXXycUREBBERETmTUnyTlATd\nev6G3XYDf2v7CNfXu97vSCJBLTo6mujo6Gydw+s5hpZAlHOuU/rxaMA55yZlaLMO6Oici08//gm4\n0jn3yynn0hxDHuMc9I50rKjWl2uuLsDsG2frCiSRHBaIcwwrgbpmVsPMCgG9gY9OabON9OGj9Mnn\nwqcWBcmbnnoKvnMvUqrOBv7ZVWsVRAKFp0NJzrkUMxsCLCatCM10zsWY2QRgpXPuE+AR4DUze4i0\nieg7vMwkgeHDD+HFj5bibn6a//b+VrfkFAkgWvksuW7TJmh13U5C7ruc+be8wXV1rvM7kkiedSFD\nSVo9JLnqt9/gpp4nKDcwkttbDVJREAlA6jFIrnEO+vSB9ZXGUvHSb/ms72cUCCngdyyRPE09Bglo\n06bBil/+Q1LzWSzusVpFQSRAaRM9yRXffw9Rf9/Fofb9mNdjLpVKVPI7koichnoM4rkDB6BX71Sq\nPtCPm5rfQ9tabf2OJCJnoDkG8ZRzEBkJ26s+hzV+n6X9l2rHVJFcpDkGCTgzZsCq+P+ReNkzrLhp\nhYqCSBDQHIN4JiYGxow9gutxG1M6TqFWmT/tpi4iAUhDSeKJ48ehZUsoHTmUirX28lbPt7TlhYgP\nNJQkAWP8eCjc8As2F/yA969fo6IgEkQ0lCQ57ssv4fU3DxJ32V3M6DaDMkXL+B1JRM6DhpIkRx04\nAE2bQv0RA6hRPYTp3ab7HUkkX7uQoSQVBslRd94Je8IWsqHW/awdtJaShUv6HUkkXwvE+zFIPvLJ\nJ/Dfb/fzv+oDmdV9loqCSJBSj0FyREICXHIJXDL2LmpVK8rL17/sdyQRQUNJ4qPbb4fDFf/D6vC7\nWTdonXoLIgEiIIeSzKyTmcWa2SYzG5XF68+Z2Q9mttrMNppZgteZJGf961/w9crf+DF8IP+4/h8q\nCiJBztMeg5mFAJuAdsBO0u4B3ds5F3ua9kOAZs65AVm8ph5DANq/H5o0gdZPDCe09F7m9ZjndyQR\nySAQF7i1ADY757YBmNkCoDuQZWEAIoFxHmeSHDRiBLS6eQVLE95kXe91fscRkRzg9VBSVWBHhuO4\n9Of+xMyqAzWBJR5nkhyyZAks+jyZjfXu4bmOz1G+WHm/I4lIDvC6x5BV9+V040G9gffONF4UFRV1\n8nFERAQRERHZySbZkJQEAwdCh3FTiS9cmcgmkX5HEhEgOjqa6OjobJ3D6zmGlkCUc65T+vFowDnn\nJmXRdjVwv3Pu29OcS3MMAWTECNi0ZxtfNWnOdwO+o07ZOn5HEpEsBOJVSSuBumZWw8wKkdYr+OjU\nRmZWHyh9uqIggeWHH2D2HMfRtkN4qOVDKgoieYynhcE5lwIMARYD64EFzrkYM5tgZl0zNO0NLPAy\ni+SMlBS49164ZewH7PjtJ0ZcPcLvSCKSw7TATc7Lyy/D/PcOseOGRszvMZ9ra1zrdyQROQOtfBZP\n7dyZtnNqt5dGklpkL2/c+IbfkUTkLFQYxFO9ekGpuhv4oPRfWTdoHZVKVPI7koicRSBOPksesWgR\nrFjp2FT3AcZdO05FQSQPU49BzurYsbRtL3qMe5tFvz3D9wO/p2CI7gorEgwCcUsMyQOmTIF6TQ4x\nf9/DvH3z2yoKInmcegxyRtu2wWWXwc3/HMXRgruZfeNsvyOJyHnQ5LPkuJ49odolm5lftBVrB62l\nSskqfkcSkfOgoSTJUYsWwY8/wtGbhjOy1kgVBZF8Qj0GydLx43DxxRA57lPmJwxl3aB1FC5Y2O9Y\nInKedLmq5JiXXoJadY/z1v5hPN/xeRUFkXxEhUH+ZM8emDgRmg58idplanP9X673O5KI5CINJcmf\n3H03FC67j3crNmLZnctoUL6B35FE5AJpKEmy7fvvYeFCONZqHH0u7qOiIJIPqccgJzkHV18Nnfqt\nY9qhtsQOiaVs0bJ+xxKRbNDlqpItb70Fx447lhUfzthLx6ooiORTng8lmVknM4s1s01mNuo0bW41\ns/VmttbM5nmdSf4sKQlGj4Zejy0k7uAO7rv8Pr8jiYhPPO0xmFkIMA1oB+wEVprZh8652Axt6gKj\ngFbOuYNmVt7LTJK1KVOgRctkZsU/zHMdnyO0QKjfkUTEJ173GFoAm51z25xzyaTdvrP7KW3uAV52\nzh0EcM794nEmOcXOnTB1Klx85z+pXqo6net29juSiPjI6zmGqsCODMdxpBWLjOoBmNly0grVBOfc\nIo9zSQaPPgr9Bibyyvon+Pz2zzE7r3kqEcljvO4xZPUOc+qlRQWBusC1wG3ADDML8ziXpFu1Km1P\nJNf6Gbr+pSuXVLrE70gi4jOvewxxQPUMx9VIm2s4tc03zrlUYKuZbQT+Aqw69WRRUVEnH0dERBAR\nEZHDcfMX52D4cBg6bit/Xz+DtYPW+h1JRLIpOjqa6OjobJ3D03UMZlYA2Eja5PMuYAUQ6ZyLydCm\nY/pz/dMnnlcBzZxz+085l9Yx5LB//QvGjoXG4yJpUKE+URFRfkcSkRwWcCufnXMpwBBgMbAeWOCc\nizGzCWbWNb3NIuBXM1sPfAE8cmpRkJyXnAwjR8Ld479j2Y4vGXHVCL8jiUiA0MrnfOqll+DjTxxH\ne/+Vfk37MeCyAX5HEhEPBFyPQQJTYiI8+SR0Hf4xCUcSuLPZnX5HEpEAoh5DPjRyJPy6/wRfN7uY\nKddNoctfuvgdSUQ8oh6DnNXWrTBzJtTvPZMqJapoMZuI/Il6DPlM375Qrc4hZofV45PIT2h+UXO/\nI4mIh9RjkDNavRq++ALsqim0rdVWRUFEsqQeQz7hHLRvD9f12M3k3xrz/T3fU6tMLb9jiYjHPLsf\ng5nVAnY5545eUDLx3WefQXw8/Bw+gTsK36GiICKndU49BjN7GXjXORdtZtcAzjm33PN0mTOox3CB\nUlKgWTMY9LdNjNt2FRuHbKRcsXJ+xxKRXODlHMMKoKaZ1XLOLQN0z4QgMmcOlC4NS+xRHrnqERUF\nETmjcy0M4cBxYLiZLQEu9y6S5KQjR2DcOOj36Ld8F/8dD175oN+RRCTAnevuqj8D7znn3jSzckAP\nDzNJDnrxRbiihWPu7pE8HvE4RUOL+h1JRALcufYY3gaapD+uDVT2Jo7kpF9/hb//HToM/oSEIwn0\na9rP70giEgR0uWoe9vDDcDgpheUXX8Kk9pPoWq+r35FEJJdpgZuctG0bvPEGNOw1h/LFynP9X673\nO5KIBAn1GPKofv2gas0jzCtTj3dveZeW1Vr6HUlEfKAegwDwv//B4sVQLOIlWlRtoaIgIufF8x6D\nmXUCppJWhGY65yad8vodwLOk3fsZYJpzblYW51GP4Rx17gwRnRP4+7H6LL9zOfXL1/c7koj4xLMt\nMS6UmYUA00i75/NOYKWZfeiciz2l6QLn3FAvs+QXS5bA5s3Q8MFn6JHcQ0VBRM6bp4UBaAFsds5t\nAzCzBUB34NTCcF7VTLKWmgqjRsFDUdsZt2YW6wat8zuSiAQhr+cYqgI7MhzHpT93qh5m9qOZvWNm\n1TzOlGe9917aLqorS4xn0OWDqFKyit+RRCQIeV0YsuoJnDpR8BFQ0znXDPgCmO1xpjwpORkeewzu\nHbeWT7csZOTVI/2OJCJByuuhpDigeobjaqTNNZzknNuf4fA1INPkdEZRUVEnH0dERBAREZETGfOE\n6dOhTh348PAYHm39KGGFw/yOJCI+iI6OJjo6Olvn8PSqJDMrAGwkbfJ5F2m7tEY652IytKnsnNud\n/vgmYIRz7qoszqWrkk7j0CGoVw+emLuUp9b3J3ZwLIULFvY7logEgIC7Ksk5l2JmQ4DF/HG5aoyZ\nTQBWOuc+AYaa2Q1AMpAA9PcyU1703HPQtp1jxtZRPNnmSRUFEckWrXwOcnv2QKNG8MT77zFj49N8\nP/B7QkzrFkUkzYX0GFQYgtyQIRASmsxntRvzcpeX6VCng9+RRCSAaEuMfGbLFliwAKrd8Bo1S9dU\nURCRHKEeQxC79VZo2PQQ04vUY+FtC7m0yqV+RxKRAKMeQz6yYgV8/TWcaDGFdrXaqSiISI5RjyEI\nOQdt2kC3yN08faAxqwauombpmn7HEpEAFHCXq4o3Fi6EvXth00UT6F+zv4qCiOQo9RiCTEoKNGsG\ng8bGMn7bNWwcspGyRcv6HUtEApTmGPKBOXOgTBlYnDqaUVePUlEQkRynHkMQSUqC+vXhsenLmLjx\ndmKHxFKkYBG/Y4lIAFOPIY+bOhVatnK8ET+Cp9o+paIgIp5QYQgS+/al7Yl07b3vkZyaTOTFkX5H\nEpE8SkNJQWLoUEjhGJ/VbcRr3V6jba22fkcSkSCgoaQ8avNmePNNqNTtZRpVaKSiICKeUo8hCNx8\nMzS87FdeDW3Al/2/pGGFhn5HEpEgoR5DHvTVV2nbX+y/5EluaXSLioKIeE49hgDmHLRqBTcP3MLE\nX1qyYfAGKhav6HcsEQkiAdljMLNOZhZrZpvMbNQZ2t1sZqlmdpnXmYLFO+9AcjJ8U3w0D7d6WEVB\nRHKF1/d8DgE2kXbP553ASqC3cy72lHYlgH8DocAQ59zqLM6Vr3oMx45BgwYw7PkveW7r7cQOjqVo\naFG/Y4lIkAnEHkMLYLNzbptzLhlYAHTPot0TwCTgmMd5gsZLL8HFl6Qyd+9wJrabqKIgIrnG68JQ\nFdiR4Tgu/bmTzKwZUM05t9DjLEHj119h0iS46r65hBYIpXeT3n5HEpF8xOttt7PqvpwcDzIzA54H\n7jjL1wAQFRV18nFERAQRERHZDhiIoqLgpl6HmRbzGO/d+h5pvyYRkbOLjo4mOjo6W+fweo6hJRDl\nnOuUfjwacM65SenHYcAW4DBpBaEy8Ctww6nzDPlljmHDBvjrX+GON8ax8+gW3uz5pt+RRCSIXcgc\ng9eFoQCwkbTJ513ACiDSORdzmvb/BYY7537I4rV8URi6dIHL2+3g5ZRm/HDvD1QvVd3vSCISxAJu\n8tk5lwIMARYD64EFzrkYM5tgZl2z+hLOMJSU1y1aBFu2wMbwkQy+YrCKgoj4QgvcAsSJE9C0KfR5\ndBmv7u1DzOAYihcq7ncsEQlyAddjkHP32mtQsVIK7x4eyuQOk1UURMQ3KgwBICEh7Uqk1g/OpESh\nEvRq3MvvSCKSj2koKQA88AAkpe7n37Ua8mmfT7m0yqV+RxKRPEJDSUFo3Tp4+20I7TCBG+rfoKIg\nIr5Tj8FHzkH79tCi2xpmJrdnw+ANlC9W3u9YIpKHXEiPweuVz3IGH3wAu/c4loUNZsLFE1QURCQg\naCjJJ0eOwMMPww2PzefIiSQGNh/odyQREUA9Bt9MnAhNWxxk9s6RvH/r+xQIKeB3JBERQHMMvvjp\nJ7jySrjp1eGkhCYyq/ssvyOJSB4VcHsl5aS8VBi6dYPardbwVmh71t2/TndmExHP6HLVIPDxx7Bx\nUyorKt7Hk22fVFEQkYCjwpCLjhyBBx+ELn+bCeYYcNkAvyOJiPyJJp9z0TPPQKMr9vLm7sf4T7//\nEGKqyyISePTOlEtiY+GVV6DIDY9wR9M7uKTSJX5HEhHJkiafc4Fz0LYtNLp+CR8X6M+GwRsoUaiE\n37FEJB/QyucANW8eJP6WxKJCA3ml0ysqCiIS0DwfSjKzTmYWa2abzGxUFq/fa2ZrzOwHM/vSzBp4\nnSk3JSTAyJFw8QMTuKLqFXStl9WN60REAofX93wOATaRds/nncBKoLdzLjZDmxLOucPpj7sB9zvn\nOmdxrqAcShowAA6VWE10tc6sHbRWl6eKSK4KxHUMLYDNzrltzrlkYAHQPWOD34tCuhJAqseZcs2S\nJbDo8xPE1h/ApPaTVBREJCh4PcdQFdiR4TiOtGKRiZndDwwHQoG2HmfKFUlJMHAgtB/7HDsKleWO\npnf4HUlE5Jx4XRiy6r78aTzIOfcK8IqZ9QbGAv2zOllUVNTJxxEREURERORERk9ERUG9q2P4OGEy\nK+5Zgdl59eRERC5IdHQ00dHR2TqH13MMLYEo51yn9OPRgHPOTTpNewP2O+dKZ/Fa0MwxrF4Nnbqk\nED7+au6+vB/3X3G/35FEJJ8KxMtVVwJ1zawGsAvoDURmbGBmdZ1zW9IPu5I2WR20kpPh7ruhzaNT\n2FesGPddfp/fkUSyrWbNmmzbts3vGHIGNWrUYOvWrTlyLk8Lg3MuxcyGAItJm+ie6ZyLMbMJwErn\n3CfAEDNrDxwH9gNBPRj/zDNQslYMXxydzMrbV2rbC8kTtm3bRrD02POrnByu1srnHPTjj9Ch4wmq\njb+agVf0Z9AVg/yOJJIj0ocj/I4hZ3C6/0e6H4OPjh+HFi2g9p2Pc7jscj7r+5l6C5JnqDAEvpws\nDNoSI4c89RSUqL+Cr5JfZnX31SoKIhK09O6VA1atglde+42dLfsyrfM0qoZV9TuSiMgF01BSNiUl\nQfPmUO3e+6lc4xBzb5rrdySRHKehpMCXk0NJ6jFk08iRUOmaT9jMQqZ1nuZ3HJF8qWbNmhQrVoyw\nsDBKlixJWFgYQ4cO9eR7LV26lPDwcE/OHSg0x5ANCxfCB1/Ec+KuAbzf4z1KFSnldySRfMnM+Pe/\n/02bNm08/17OuTy/k4F6DBdo3z64+54UKtzbhweuHELr6q39jiSSr2U1jHL//fdzyy23nDweNWoU\nHTp0ACAxMZFu3bpRsWJFypUrR7du3di5c+fJtvv37+euu+6iatWqlCtXjh49epCUlESXLl3YuXPn\nyZ7J7t27vf/hcpkKwwVwLm11c53+T1O2TAhjWo/xO5KIZGHKlCmsXbuWOXPmsGzZMl5//XXmzJkD\nQGpqKnfddRc7duxg+/btFCtWjMGDB5/82r59+3LkyBFiYmLYu3cvDz30EMWKFePTTz/loosu4tCh\nQxw8eJDKlSv79eN5xzkXFH/SogaGqVOda3Ddl67Ss5Vc/MF4v+OIeO5c/v2lfWTK/p8LUbNmTVey\nZElXpkwZV7p0aVemTBk3Y8YM55xzK1ascGXLlnU1a9Z0b7/99mnP8cMPP7iyZcs655zbuXOnK1Cg\ngDtw4MCf2kVHR7vw8PALC+qh0/0/Sn/+vN5vNcdwnlatgiee20vokNuY1X0WF5W8yO9IIgHB74uW\nPvzwwyznGK644gpq167Nvn37Mg0rHTlyhGHDhrFo0SISExNxznH48GGcc8TFxVG2bFnCwsJy80cI\nGBpKOg8HD8KtvVOoMiSSu5vfQZe/dPE7koikc6epTC+//DLHjx/noosuYtKkPzZ2njJlCps3b2bl\nypUkJiby5ZdfnjxPeHg4CQkJHDx48E/ny+sTz6DCcM6cg/vug7Du46hUyZgQMcHvSCJyFps2bWLs\n2LHMnz+fOXPmMHnyZNasWQPAoUOHKFq0KGFhYSQkJGS630vlypXp3Lkz999/P4mJiZw4cYJly5YB\nUKlSJX799dcsi0ZeocJwjv7xD/j614/55aK5vNXzLQqEFPA7kohk0K1bt0zrGHr27Em/fv0YM2YM\nTZo0oW6P2y2OAAAMmklEQVTdujz99NPcfvvtJCcnM2zYMJKSkihfvjxXXXUVXbpkHgGYO3cuBQsW\npEGDBlSqVIkXXngBgPr16xMZGUnt2rUpW7ZsnrwqSSufz8G330KX2zcTMqA1H9/2L1qFt/Ilh4hf\ntPI58Gnlcy7auxdu7nOQ4gO683T7J1QURCTPU4/hDE6cgA7XpRB3zY10aBHOK9e/kqvfXyRQqMcQ\n+IKqx2Bmncws1sw2mdmoLF5/yMzWm9mPZva5mQXMJiSjRsHW2mOpUvMgL3R6we84IiK5wtPCYGYh\nwDSgI9AYiDSzBqc0Ww00d841A94HnvUy07l64w2Yv+ZNUhq9yfu3vkdogVC/I4mI5AqvewwtgM3O\nuW3OuWRgAdA9YwPn3FLn3NH0w28B329m8PXXMOz5ZSS3G8bCvp9QoXgFvyOJiOQarwtDVWBHhuM4\nzvzGfzfwqaeJzmL7drjx7k2E9LqFBbfMp0nFJn7GERHJdV5viZHVhEeWM1hm1hdoDvz1dCfLuAAl\nIiKCiIiI7KU7xcGD0LnnPlIju/Bsp6foUKdDjp5fRMRr0dHRREdHZ+scnl6VZGYtgSjnXKf049Gk\nbeg06ZR27YEXgGudc7+e5lyeXpWUnAyduv3G+ubtubNNG55p/7Rn30sk2OiqpMAXTFclrQTqmlkN\nMysE9AY+ytjAzC4FXgVuOF1R8JpzMODe46xt1JOOlzfg6XZP+RFDRPKg5cuX07Bhw2yfp1atWixZ\nsiQHEp2dp4XBOZcCDAEWA+uBBc65GDObYGZd05tNBooD75rZD2b2Ly8zZWXC46l8XKA/LS4rzMzu\nr+WLTbJE8pKaNWtSuXJljhw5cvK5mTNn5sod3c6mdevWxMTE+B3jvHi+7bZz7jOg/inPjc/w2NeB\n/H/8w/F87IM0ahPPu70+o2CIdiIXCTZmRkpKClOnTmXMmDGZnvdTSkoKBQoE375q+XpLjDffdIxc\nPIZqrb7is34fUTS0qN+RROQCjRgxgilTpvxp19Nt27YREhJCamrqyefatGnDrFmzAJg9ezatW7dm\n+PDhlClThrp16/LNN98we/ZsqlevTuXKlU/e9Q3g+PHjPPLII9SoUYMqVapw//33c+zYMQCWLl1K\neHg4kydPpkqVKtx1110nn/tdXFwcPXv2pGLFilSoUIGhQ4cC8PPPP9OuXTvKly9PxYoV6du3r287\nuObbwvDvf8M9b46nyrUL+XLA55QqUsrvSCKSDZdffjkRERE8++yf18iereewYsUKmjVrRkJCApGR\nkfTu3Zvvv/+en376iblz5zJkyBCSkpIAGDlyJFu2bGHNmjVs2bKF+Ph4Hn/88ZPn2r17N4mJiWzf\nvp3p06dn+v6pqal07dqVWrVqsX37duLj4+nduzeQdh+IRx99lN27dxMTE0NcXFymKzFzU74cN1m6\nFG59+QkqtXuf5QP/S7li5fyOJBL0bELODNu48Rd+9dOECRNo3bo1w4YNO6+vq1WrFv369QOgV69e\nPP3004wfP57Q0FA6dOhAoUKF2LJlC5dccgkzZsxg7dq1lCqV9mFy9OjR9OnTh6eeSrtopUCBAkyY\nMIHQ0D/vlvDdd9+xa9cuJk+eTEhI2ufyq666CoA6depQp04dAMqVK8dDDz2UqeDkpnxXGKKjHddP\neoqybebx9b1LqVi8ot+RRPKE7Lyh55TGjRvTtWtXnnnmmfO6EqhSpUonHxctmjakXL58+UzPHT58\nmH379pGUlETz5s1PvpaamprpMtEKFSpkWRQgbRipRo0aJ4tCRvv27WPo0KEsW7aMw4cPk5KSQtmy\nZc/5Z8hJ+WooaelSR5fnHqVi2wWsGBRN5RKV/Y4kIjksKiqK1157jfj4eACKFy+Oc+7kUBBwwTfX\nKV++PMWKFWP9+vUkJCSQkJBAYmIiBw4cONnmTMNW4eHhbN++PdN8x+/GjBlDSEgI69atIzExkXnz\n5vm2diTfFIalX6bS+YVhVLt2MSsHR1OlZBW/I4mIB+rUqUOvXr148cUXgbQ386pVqzJv3jxSU1OZ\nNWsWP/300xnPcbo3ZDPjnnvuYdiwYezbtw+A+Ph4Fi9efE7ZWrRoQZUqVRg9ejRJSUkcO3aMr7/+\nGki71WiJEiUICwsjPj4+y7mS3JIvCsO/Pz1Bx5fvoVbrlawY8gXli5U/+xeJSNA49VP6uHHjSEpK\nOvn8a6+9xuTJkylfvjwxMTFcffXV53W+jMcTJ06kbt26tGzZktKlS3PdddexadOmc8oZEhLCxx9/\nzObNm6levTrh4eG88847AIwfP55Vq1ZRunRpunXrRs+ePc+YyUt5/kY9c9/+jQGf9eKy5il8PvBd\nShQq4UE6kbxNW2IEvmDaEsNXU6f/wt1L29HxmvJ8OegjFQURkXOQJwuDczDs8c2MiL2au9u248M7\nX9eNdkREzlGeu1w1ORm6PbiEL0pH8ky3J3mkzT1+RxIRCSp5qjAcOAAtH3iV/6sexUd93qZzwwi/\nI4mIBJ08UxjWxRzjmqcfxGou5ccHltOgYl2/I4mIBKU8Mccw+8NtXPpSa2o12cfWv32noiAikg1B\n3WNITYUBExcx+8AdDGo9gpcih/u+za5IXlSjRg392wpwNWrUyLFzeb6Owcw6AVNJ653MzOK2ntek\nv34J0Ms59/9Oc55M6xji9xzjmvGPEV/6beb3nM/NV1zr2c8gIhKsAm4dg5mFANOAjkBjINLMGpzS\nbBtwBzD/XM/71uKN1HqyFQUqbGHrmB/yXVHI7o2+8xL9Lv6g38Uf9LvIHq/nGFoAm51z25xzycAC\noHvGBs657c65dcBZuy7HjqfSZcI0+iy5mgGXDmTT4x9QpVT+295Cf+n/oN/FH/S7+IN+F9nj9RxD\nVWBHhuM40orFBanwSFtCQo8TfddXXNu4/tm/QEREzpvXhSGrca0LntRoH96Nd4YPo2AQ3kNVRCRY\neDr5bGYtgSjnXKf049GAO3UCOv2114GPzzT57FlQEZE87Hwnn73uMawE6ppZDWAX0BuIPEP704Y/\n3x9MREQujKeTz865FGAIsBhYDyxwzsWY2QQz6wpgZpeb2Q7gZuBVM1vrZSYRETmzoLkfg4iI5I6g\n2BLDzDqZWayZbTKzUX7n8YuZVTOzJWa2wczWmtlQvzP5ycxCzGy1mX3kdxa/mVkpM3vXzGLMbL2Z\nXel3Jj+Y2UNmts7M1pjZfDMr5Hem3GRmM81sj5mtyfBcGTNbbGYbzWyRmZU623kCvjCc4yK5/OIE\nMNw51whoBQzOx78LgAeBDX6HCBAvAAudcw2BpkCMz3lynZldBDwAXOacu4S0OdTe/qbKda+T9l6Z\n0WjgP865+sASYMzZThLwhYFzWCSXXzjndjvnfkx/fJi0f/xV/U3lDzOrBnQBZvidxW9mVhK4xjn3\nOoBz7oRz7qDPsfxSAChuZgWBYsBOn/PkKufccmD/KU93B2anP54N3Hi28wRDYchqkVy+fDPMyMxq\nAs2A7/xN4pvngRFkY11MHlIb+MXMXk8fWptuZkX9DpXbnHM7gSnAdiAeSHTO/cffVAGhonNuD6R9\nuAQqnO0LgqEw5OgiubzAzEoA7wEPpvcc8hUzux7Yk957Ms5wmXM+URC4DHjZOXcZkETa8EG+Ymal\nSft0XAO4CChhZrf5myo4BUNhiAOqZziuRj7rHmaU3kV+D5jrnPvQ7zw+uRq4wcx+Bt4C2pjZHJ8z\n+SkO2OGc+z79+D3SCkV+0x742TmXkH6p/P8DrvI5UyDYY2aVAMysMrD3bF8QDIXh5CK59CsMegP5\n+SqUWcAG59wLfgfxi3PuUedcdedcbdL+PixxzvXzO5df0ocJdphZvfSn2pE/J+W3Ay3NrIil3Tyi\nHflwEp4/96I/AvqnP74DOOsHyoC/UY9zLsXMfl8k9/s9HfLj/2zM7GqgD7DWzH4gbUjtUefcZ/4m\nkwAwFJhvZqHAz8CdPufJdc65FWb2HvADkJz+3+n+pspdZvYmEAGUM7PtwHhgIvCumd1FWvG85azn\n0QI3ERHJKBiGkkREJBepMIiISCYqDCIikokKg4iIZKLCICIimagwiIhIJioMIiKSiQqDiIhkosIg\nkk1m1sDMzrrHvUiwUGEQyb42pG2/IJInqDCIZIOZdQIGAOG/72ApEuy0V5JINpnZR865G/zOIZJT\n1GMQyQYzqwjs9juHSE5SYRDJniuBFWZ2eX68nabkTSoMItmzk7R7kJd0zh3xO4xITtAcg4iIZKIe\ng4iIZKLCICIimagwiIhIJioMIiKSiQqDiIhkosIgIiKZqDCIiEgmKgwiIpLJ/wd1tK6LjI+BpQAA\nAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "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": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nJDEIIYSw8P9VgaboQ3jHCQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "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": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nS5cu3H///ezYsaO6fK9evVIeo7y8nD59+lSHSbL58+czatQounTpQpcuXVizZg27du1q9HcB2LFj\nBz169ACCLr/bbrut1nm54IILaNOmDTfffHOtMGmsTp061Zp8ePDgQXJycurZIugWi+vSpUtoCz82\nhFooItJgxcXFjB49utZVTR07duTAgQPVr7dv305+fn5a+8/Pz6d///588MEHdZap62KA/Px8Nm/e\nzLFjx44Llc2bN3PDDTfw+uuv86UvfQmAUaNGpbVCwcKFC4/rRvrmN7/JT37yE1566SW+8Y1vALBi\nxQpGjx593PaJXV6JUnV5DRgwoFa3XUVFRcp9xi1YsICXX36ZBQsWALB///6MjqUoUESkwQYMGMBV\nV13FI488Ut1lNXLkSH7zm99w77338sorr/DGG2/wxS9+Ma39jx07luzsbObMmcONN95Iu3btWLdu\nHYcOHWLMmDEn3LZHjx7MmDGD4uJi2rRpw7Jlyxg/fjx///vfycrKolu3bhw7downnnii3suNv/3t\nb2NmPPbYY8d9tnr1asaPH09FRUX1e+7OtGnTuO+++/jGN77B+++/z5AhQzAzSkpKmDJlSnXZxnR5\nnXfeedx+++3Vr999910eeOABIAimfv361Qqmvn378t3vfheAv//97+zatYuvfvWrDTpWGNTlJSL1\nSv6X9F133cWBAweq33/44Yd54YUX6NKlC7/97W+59NJL692+vsuNs7KyWLhwIStWrKBfv37k5uby\nne98p/oqsFTbxt+Lb1tWVkbv3r3Jz8/nmWeeAWDIkCHccsstjBs3ju7du7NmzRrOOeecOutUXl5e\n6/O4119/nZkzZ5Kbm1vrkZeXx6xZs1i8eDFvv/02OTk5nH766ZSUlJzUfZg6duzIbbfdxr333ss9\n99zDrbfeSm5uLgBXXHEFK1asqFX+y1/+MuXl5cydO5eZM2dSUlJCx44d0z5+Y2lxSJGIaXHI5iV+\nJdrKlSsjnefS1JpicUgFikjEFCgSBa02LCIizZYCRUREQqFAERGRUChQREQkFAoUEREJhSY2ikSs\nT58+kS8FL6eePn36hL7PyC4bNrMiYC5BK2meu89O+rw9MB8YA+wCrnL3zbHP7gCuA44CP3L3V1Ls\nX5cNi4g0Uou7bNjMsoCfAxcCBcBUMxucVGwasNvdBxEEz5zYtkOBK4EhwNeBX5r+eVevTC4O19zp\nXNTQuaihcxGOqMZQxgJl7r7J3Y8AJcCkpDKTgCdiz58F4gvSXAKUuPtRd98IlMX2J3XQ/yw1dC5q\n6FzU0LmPXM6vAAAEgUlEQVQIR1SB0hMoT3i9JfZeyjLuXgXsNbOcFNt+nGJbERHJsKgCJVUXVfKA\nR11lGrKtiIhkWCSD8mY2Dih296LY6xmAJw7Mm9miWJnFZtYG2ObuucllzewPwN3uvjjpGAoZEZE0\npDsoH9Vlw0uBgWbWB9gGTAGmJpVZCFwLLAYmA6/F3n8BWGBm/0rQ1TUQWJJ8gHRPiIiIpCeSQHH3\nKjP7AfAKNZcNrzWzWcBSd38RmAc8aWZlQAVB6ODu75vZM8D7wBFguq4PFhGJXqtdvl5ERDKrxS+9\nYmZFZrbOzNab2e0pPm9vZiVmVmZmfzaz3lHUMxMacC7ONbNlZnbEzC6Loo6Z0oBz8WMzW2NmK8zs\nT2aW3k3QW4AGnIvvmtlKM1tuZm+mmBPWapzoXCSUu8LMjplZ3Tdwb+Ea8HtxrZntMLN3Y4/rTrhT\nd2+xD4JA/CvQB2gHrAAGJ5X5P8AvY8+vIpjDEnndIzoXvYFhwH8Cl0Vd54jPxXnAZ2PPv3eK/16c\nlvB8IrAo6npHdS7i5wN4A/gfYHTU9Y7w9+Ja4JHG7Lelt1DSmSA5IYP1y6QTngt33+zuq2n9l1k3\n5Fy84e6HYi//Quudy9SQc7E/4eVpwLEM1i+TGvL3AuAeYDZwOJOVy7CGnotGXdzU0gMlnQmSlbEJ\nkq1NQ87FqaKx52IasKhJaxSdBp0LM5tuZn8FHgBuzFDdMu2E58LMRgK93P3lTFYsAg39f+SyWLfw\nM2bW60Q7bemBks4ESUtRpjXQhM8aDT4XZnY1wQKkDzZpjaLToHPh7r9094HA7cCdTV6raNR7LmJr\nAv4rcMsJtmkNGvJ78QLQ191HAq9S09NTp5YeKFsIxgXiegFbk8qUA/kAsQmS2e6+JzPVy6iGnItT\nRYPOhZmdD9wBTIw1+1ujxv5ePA38U5PWKDonOhedCBarLTWzj4BxwPOtdGD+hL8X7r4n4f+LXxP8\nw6teLT1QqidIxpa7n0KQqoniEySh9gTJ1qYh5yJRa/2XFzTgXJjZKOA/gEvcvSKCOmZKQ87FwISX\nFwPrM1i/TKr3XLj7PnfPdff+7t6PYGxtoru/G1F9m1JDfi+6J7ycRDD3r35RX20QwtUKRcAHBKsO\nz4i9Nwu4OPb8M8Azsc//QtCEi7zeEZ2LswlabJ8AO4FVUdc5wnPxJ4JVGt4FlgO/j7rOEZ6LucDq\n2Ll4FRgSdZ2jOhdJZV+jlV7l1cDfi/tivxfLY78Xnz/RPjWxUUREQtHSu7xERKSZUKCIiEgoFCgi\nIhIKBYqIiIRCgSIiIqFQoIiISCgUKCIiEgoFioiIhEKBIpJhZjbYzO6Iuh4iYVOgiGTeVwiWsxBp\nVRQoIhlkZkXA9UC+meVFXR+RMGktL5EMM7MX3P2SqOshEja1UEQyyMxyge1R10OkKShQRDLrH4Al\nZna2mXWIujIiYVKgiGTWVoJ7d3dy94NRV0YkTBpDERGRUKiFIiIioVCgiIhIKBQoIiISCgWKiIiE\nQoEiIiKhUKCIiEgoFCgiIhIKBYqIiITi/wPhU2cHEr/3mgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "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", "\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 vis therefore clearly proportional to $\\Delta t^2$. Since we will require twice as many time steps to advance the same total amount of time, the error in our solution after a fixded 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": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "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 what 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", "\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": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n8flFCkMehS6+QsLRGNb7/8J7T/yH56ulL0c4bx7s3g1//SWttEWRV61aNTw9PdmwYQPffvttjnEV\nK1YkKirK6LVz585Rs2ZNo9ciI++1TouIiKBSpUpUqlQp4yqnzH+3du3aecr5YSfH165dm2WIpl+/\nfkyZMoV169bRoUMHAEJCQmjYsKFRXOahpMxyGkqqUaMG+/fvz9iOjo7Ocsy7li1bxvr161m2bBkA\nsbGxBTfX8LCLRJvrQSFaQP3O1ST9s+MO/fzkX7TPdy10SmqKYcfmzVq7u2sdHm7eBEWhVph+l3Pi\n4eGht2zZorXW+syZM/rAgQNaa61TUlK0UkpHREQYxSUlJenq1avrzz//XKekpOiffvpJW1tb6w8/\n/NDomE8++aSOiorS0dHR+oUXXtATJ07USUlJumbNmjogIEAnJyfrbdu2aUdHR33q1Kls88n8XGut\n/fz8dN++fTO2mzRpor/55puM7QEDBuiBAwfm+LNOnz5dX7t2zehx9epV7e/vr5s2baq11vr48eO6\na9euWmutly9fnrd/VK11XFycrl+/fsa2t7e3vnz5stZa6/DwcJ2Wlpaxb9euXXr79u1aa61jY2O1\nh4eHjouLy/HYOf1epb/+UJ+38pU2D1Z0OMFWn1ROlR3Dsq5LsbSwNCy68/rrsHw5eHmZO0UhHknm\nb8Cenp5G32oz77v73Nramp9//plFixbh4uLCypUr6datW5bjvv7667Rp04aaNWtSs2ZNfH19sba2\nZs2aNaxfv55y5coxfPhwlixZwmOPPfbA98zJ+PHjmTp1Ki4uLnzyySdERkbSrFmzbGO3bduGr68v\nbm5uRg93d3f8/f3Zu3cvu3fvxsXFBScnJwIDAx+peae9vT1jx45l2rRpTJ06lTFjxuDmZmjH3717\nd6O5kmbNmhEZGcmcOXPw9fUlMDAQe3v7PL/3w5A1nx/SjlmXOffpSUb7fsGitm/QvlZ7uHULGjc2\nzC3IEp3iX5TUJnqenp4sXLiQl14quM76ycnJNGjQgCNHjhT4JZ8FrSg10StWos8kcW3qKeYO/5sh\nT9QxFIXUVMOZQvPmUhSEKGSsra05fvx4sS8K+U0mn3MpLU2z4uXjHG+bhG21X/H3WW3Y4esLcXHw\n+efmTVCIQq643jFdHElhyKWlXc5gnXKDX1+aS0jXRYZ5hWXL4McfDe0upI22EA905swZc6cgckkK\nQy5snXwBm92RTPBby6qO4ylfuryhGLz3HmzbBuXKmTtFIYTINzLH8C9O/xTNzU/D8J9wgEmN69Ck\nahO4cAG6doUFC6BePXOnKIQQ+UoKwwPcOBTLyQHHCBgdRfM6Z3jz6aGQkGBYcGfYMEMvJCGEKGZM\nXhiUUu2UUqFKqdNKqXHZ7H9fKXVcKRWilNqklKqa3XEK2p3zd9jW6hD/eyMWy+qLmNtujqHdxZAh\nUKMGTJhg7hSFEMIkTDrHoJSyAL4AWgIXgGCl1GqtdWimsINAI611olLqLeBjDGtDm03K7RR+e/4A\nv7ZL4qjXOEJ6bMPa0hoCAiA0FHbskAV3hBDFlqnPGJ4FwrTWEVrrZCAQMBp/0Vpv11rfbdy+B6iM\nGaUlp/FbqxD+fCyJtY1G8kfvQMNk8+zZhj5Iv/4KBXT3oRBCmIOpr0qqDERm2o7CUCxyMgjYYNKM\nHkBrzcbXjxGaFsvCtv9lZadPqVe+LowfD6tXw65dkKk7pBBCFEemLgzZjbdk2wtAKdUHaAQ0z+lg\nfn5+Gc99fHweqWdJdv6c8DfnDl3nk7fmMttnEK2rtzDMKRw5Ajt3ymWpQohCLygoiKBHXM/DpL2S\nlFKNAT+tdbv07fEYOv0F3BfXCvgMeFFrHZ3DsUzaK+nY/CiOT/ybcSPX0Ps5W2Y8P8nQ6uL2bfj5\nZ3BwMNl7i5KlpPZKEqZVlHolBQM1lVLVlVI2GCaV12QOUEo9BXwFvJpTUTC1yD+uET7mb/ze3Efz\nJ2KY/sw4aN8erKzgt9+kKAghAMOazYmJidy5c4edO3eaOx2TMWlh0FqnAsOBjcBxIFBrfVIp5a+U\neiU9bBZQGliplDqklPrVlDndL+bIbQ71PM5Hg//Bq/ZuFjb5CPXSS1C7tqGFdqlSBZmOEIWCh4cH\n9vb2ODo6UqlSJQYOHEh8fHzGfk9PT7Zu3ZqxHRgYiIuLS5YPy7CwMOzs7B64+tuDzJw5k9mzZ+ft\nh8il1atXM336dAICAliyZMkDY/v374+9vT3Vq1cnJibGpHmZ1cMu4GCuByZY3CQ+MkH/XH67bj30\nJ/3c1811wumTWteqpfWkSVpnWjBDiPxkit/l/Obh4aG3bt2qtdb68uXL2tvbW0+cONFo/93Fcr77\n7jtdrlw5vWfPnizHadOmjX7xxReNFtLJrfj4eN25c2ddsWJFfefOnTz+JA928+ZN3bBhw4ztxo0b\n62vXruUY/8033+jIyEidkpJiknweRU6/V8hCPbmXcjuFtS8e4KcWcUTWC2BToxnYvtTasKaCv7/c\npyBKPJ0+Xu3m5kbbtm2NFpG5a/78+YwZM4aNGzfy3HPPGe0LDAzE2dmZli1b5un9ly9fzoIFC3Bz\nc2PRokXZxrRs2ZKUlJQ8HR8MQ0N169bN2Pb29mbbtm05xltbW1OlSpVi38a7RDbRS0tO48cWBzlQ\nM56/mvpzsK4fDu07w6efGiachRAZoqKi2LBhA61atTJ6fd68eezevZutW7dS776eYbdu3WLy5Mls\n3bqVBQsWPPR7pqSkEBsbi6urK+PHj8fX15ehQ4cate4+f/48AFZW9z7GMq/BfLew3X2e3RrMUVFR\nlC1bNmO7bNmyhIWF5ZjXvn370FoTHR1NrVq1sqwVXVyUuMKgtWZF5yOcU7dZ1X4ah6uNxOm1frB4\nMbz8srnTEwKAIBWUL8fx0T55/rudO3cGDIvQt2zZ0uhycYDNmzfTokWLLEUBYNKkSQwZMoTKlfN2\nv+qqVavo0aMHAD179mTy5MkEBgbSu3dvADZt2sSCBQuoUKECS5cupU+fPgB4eXkxY8aMXL9PTEwM\ntra2Gds2NjbExsbmGD948GCeeuopABo0aEDz5s1xcnJ66J+vsCtxhSFw8Clun7rOvLc/5ohDT8q+\n9R6sWQNNmpg7NSEyPMoHen5ZvXo1LVq0YOfOnbz++utcu3YNR0fHjP1fffUVU6dOZdCgQSxcuDDj\n9ZCQEDZv3pzt0FNuXblyhYoVKwJgYWHB2LFjmTFjRkZhaN26NYsWLWLUqFE0atQoz+/j4ODA9evX\nM7YTEhKoUKFCjvHe3t4Zz52dnQkKCqJTMWymWaIKw8oJZ1G/XeSTUd9yNLUZTn4zYetWyDTGKIQw\nuDsU88ILL9C/f39Gjx7NL7/8krHfzc2NLVu28OKLLzJs2DDmzZsHwPbt24mIiKBatWporYmNjSU1\nNZUTJ06wf//+f33ftWvXZhmi6devH1OmTGHdunV06NABMBSghg0bGsVlHkq6/2fJbiipRo0aRjlF\nR0dnOeZdy5YtY/369SxbtgwwnEkV27mGh52tNteDR7yS45f/u6h/ctqqG04ZpePGjzZcffTPP490\nTCHy4lF/lwtC5quOtNb66tWrunTp0vrw4cNZ9kdGRmovLy/9/vvva621TkhI0JcvX854fPDBB7pH\njx46Ojpaa631gAED9MCBA3N87+nTp+tr164ZPa5evar9/f1106ZNtdZaHz9+XHft2lVrrfXy5cvz\n/JC/wKgAAAdJSURBVHPGxcXp+vXrZ2x7e3vry5cva621Dg8P12mZrk7ctWuX3r59u9Za69jYWO3h\n4aHj4uLy/N75LaffK/JwVVKJOGNYNuoM9t+eZe47+/gzMoZSBw4b+h65uZk7NSEKpfu/cZcrV47+\n/fszdepUVq5cabS/SpUqbNmyhebNm2NnZ8dHH31kNG5fpkwZbG1tcXFxASAyMpLXc7jIY9u2bfj6\n+jJx4sQc89q9ezc1atTAycmJwMDAR2qNY29vz9ixY5k2bRpaa8aMGYNb+udC9+7dWbhwYcacQrNm\nzVi2bBlz5szh7NmzBAYGYl9MG2qatCVGfspLS4y0lDQWdjmM7aEYFg4LYtPBY1hfv2HokJpprFSI\nglSSW2IkJyfToEEDjhw5UnyHYcwkP1tiFNvCkHgtieUvBXPVOo6DPdfyw9pDWLi7w7JlkOnbjBAF\nrSQXBmE6RalXkllEHbzBmnp/stfzEmWf+R/LP16ORZcu8OOPUhSEEOJfFLs5hr8Wn+PKiHCWdTvI\nnJAFeF51ht27Db2PhBBC/KtiUxh0muaX946TEniV9e2XsPKXn7CZOAneew9kLFMIIXKtWBSGxJtJ\nrHj1ALevxOHo4cu8v5Ox2bNPzhKEECIPivwcw/mTt/jZ+y/+v717DZGqjOM4/v3lJplKRWRh5oRF\nWaHGIqWJkChkN4uu2t3oRVAZFZX1pgu9qBeRQopIJllewEXKIEpkieiFaWV4TYtNXbPd0G5EF1T+\nvZix3eNlR3d25pnZ+X3e7JyzM4ffnJ2d/3nOc57n/BB7uHbfPdxx6xROXbPORcHMrJtqusWw5v0f\naZu+nZbGL7mrdS7DPvsUDR+eOpZZl3K53BHjBMxKlcvlemxbZS8MkiYDs8i3ThbEkbf1HF/4/Ujg\nzohYUWybEcGS5zbSb/5e/rlgETeO6M9Fq753X4LVhB07dqSOYNalsp5KknQS8CZwDXAZME3S4Yf0\nO4H7gcXHs81//zrA3Imfsn9ZG5F7mUnzHmbUrDl1VRRKvdF3b+J90cH7ooP3RWnK3cdwBfBdROyM\niP3AMiAzFWFE7IqITUDRET8t3/7G4hHNaN8++ox9j1vWrWbQ6DHlSV7F/KHv4H3Rwfuig/dFacpd\nGM4FWjst7y6s65b1477i90FbaXylP/cuXYQaarqLxMysKpX7m/VoPWzdngtg27i1PNP0FA19+5YQ\nyczMulLWuZIkjQFejIjJheWZ5KeAfe0oz10IfHiszmdJnlzGzKwbTnSupHK3GNYBF0rKAT8BU4Fp\nXTz/mOFP9I2ZmVn3lLWPISIOAo8Cq4DNwLKI2CrpJUk3AEgaLakVuA2YJ2ljOTOZmVnXambabTMz\nq4yamBJD0mRJ30raLunZ1HlSkTREUrOkLZI2SpqROlNKkk6S9LWklamzpCbpNEnLJW2VtFnSlakz\npSDpCUmbJG2QtFhSXV2pImmBpHZJGzqtO0PSKknbJH0i6bRi26n6wnCcg+TqxQHgyYi4FBgLPFLH\n+wLgcWBL6hBVYjbwUURcAowCtibOU3GSBgOPAY0RMZJ8H+rUtKkqbiH578rOZgKrI+JioBl4rthG\nqr4wcByD5OpFRLRFxDeFx3+S/+fv9riQWiZpCHAd8FbqLKlJGgiMj4iFABFxICL+SBwrlT5Af0kN\nwKnAnsR5KioiPgd+PWz1TcA7hcfvADcX204tFIYeHSTXW0g6H7gc+CJtkmTeAJ6mhHExvcgwYK+k\nhYVTa/Ml9UsdqtIiYg/wOrAL+BH4LSJWp01VFQZFRDvkDy6Bs4q9oBYKQ48OkusNJA0AmoDHCy2H\nuiLpeqC90HoSXVzmXCcagEZgTkQ0An+RP31QVySdTv7oOAcMBgZIuittqtpUC4VhNzC00/IQ6qx5\n2FmhidwEvBsRH6TOk8g4YIqkFmApMEHSosSZUtoNtEbEl4XlJvKFot5MAloi4pfCpfIrgKsSZ6oG\n7ZLOBpB0DvBzsRfUQmH4f5Bc4QqDqUA9X4XyNrAlImanDpJKRDwfEUMjYhj5z0NzRNyXOlcqhdME\nrZIuKqyaSH12yu8Cxkg6RfkbXkykDjvhObIVvRJ4oPD4fqDoAWXVz0IXEQclHRokd+ieDvX4x0bS\nOOBuYKOk9eRPqT0fER+nTWZVYAawWNLJQAswPXGeiouItZKagPXA/sLP+WlTVZakJcDVwJmSdgEv\nAK8CyyU9SL543l50Ox7gZmZmndXCqSQzM6sgFwYzM8twYTAzswwXBjMzy3BhMDOzDBcGMzPLcGEw\nM7MMFwYzM8twYTArkaThkorOcW9WK1wYzEo3gfz0C2a9gguDWQkkTQYeAs47NIOlWa3zXElmJZK0\nMiKmpM5h1lPcYjArgaRBQFvqHGY9yYXBrDRXAmslja7H22la7+TCYFaaPeTvQT4wIv5OHcasJ7iP\nwczMMtxiMDOzDBcGMzPLcGEwM7MMFwYzM8twYTAzswwXBjMzy3BhMDOzDBcGMzPL+A/0pWGryfAs\nHwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "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", "\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, than 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": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "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": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZUAAAEQCAYAAAB4JulQAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXl4VEXWh9/TWSAb2SCEsAZQdsOiCLiAIMonIiKgiCgy\nqKMzLjMujIojoowiDg6jzrihuAFR0RkWUVEh4gCyCbIJogiEnZBA9q27vj+qO+mE7tBJOul0Uu/z\n1HNv1a2+dTo093erTtUpUUphMBgMBoM3sPjaAIPBYDDUH4yoGAwGg8FrGFExGAwGg9cwomIwGAwG\nr2FExWAwGAxew4iKwWAwGLyGz0VFRIaJyG4R+VlE/uLierCIJIvIXhFZJyJt7OVXisgmEflRRDaK\nyBW1b73BYDAYnPGpqIiIBXgFuBroBtwsIp3LVZsMpCulzgPmALPs5SeBa5VSScDtwPu1YrTBYDAY\n3OLrnkpfYK9S6oBSqghIBkaWqzMSeNd+vggYAqCU+lEpdcx+vhNoJCJBtWO2wWAwGFzha1FpCaQ6\n5Q/Zy1zWUUpZgdMiEuNcQUTGAFvswmQwGAwGHxHo4/bFRVn5uDHl64hzHRHpBjwHDPWuaQaDwWCo\nLL4WlUNAG6d8K+BIuTqpQGvgiIgEAE2UUhkAItIK+BS4VSm1310jImICnBkMBkMVUEq5evl3i6+H\nvzYCHUWkrYgEA+OAJeXqLAUm2s/HAisBRCQKWAY8qpT6/lwNKaVMUopp06b53Ia6kszfwvwtzN+i\n4lQVfCoqSvtI7gVWADuBZKXUTyIyXUSutVd7C2gqInuBPwGP2sv/CHQA/ioiW0TkBxFpWstfwWAw\nGAxO+Hr4C6XUF0CncmXTnM4LgBtdfO5vwN9q3ECDwWAweIyvh78MtcygQYN8bUKdwfwtSjF/i1LM\n36J6SFXHzfwJEVEN4XsaDAaDNxERlJ856g0Gg8FQjzCiYjAYDAavYUTFYDAYDF7DiIrBYDAYvIYR\nFYPBYDB4DSMqBoPBYPAaRlQMBoPB4DWMqBgMBoPBaxhRMRgMBoPXMKJiMBgMBq9hRMVgMBgMXsOI\nisFgMBi8hhEVg8FgMHgNIyoGg8Fg8BpGVAwGg8HgNYyoGAwGg8FrGFExGAwGg9fwuaiIyDAR2S0i\nP4vIX1xcDxaRZBHZKyLrRKSNvTxGRFaKSJaIvFT7lhsMBoOhPD4VFRGxAK8AVwPdgJtFpHO5apOB\ndKXUecAcYJa9PB94Aniolsw1GAwGwznwdU+lL7BXKXVAKVUEJAMjy9UZCbxrP18EDAFQSuUqpdYC\nBbVlrMFgMBgqJtDH7bcEUp3yh9BC47KOUsoqIqdFJEYplV5LNhoMdYq8ojw2HdnE2tS1rD+8nqjG\nUVzS+hIGtB5Ap6adsIiv3xUNDRlfi4q4KFPnqCMu6hgM9RKlFKmZqaxLXcfa1LWsO7SOnSd30j2u\nO/1b9efGbjeSkZdByoEU/vbd3zhTcIb+rfozoPUABrQewEUJFxEWHObrr2FoQPhaVA4BbZzyrYAj\n5eqkAq2BIyISADRRSmVUtqGnnnqq5HzQoEEMGjSosrcwGGqcguICthzbokXk0FrWpa6jyFbEgNYD\n6N+qPy9e/SJ9WvQhJCikzOfuuegeAI5mHWXdIS1Aj33zGNuOb6NL0y4lPZkBrQfQOrK1L76awQ9I\nSUkhJSWlWvcQpXz30m8XiT1oP8lRYANws1LqJ6c6fwC6K6X+ICLjgOuVUuOcrk8ELlRK3VdBO8qX\n39NgcIdDBBwi8uOxHzkv9jwGtBpA/9a6x5EYlYiIq079uckvzmfzkc2sSV3D2tS1rE1dS6PARmVE\nJql5EkEBQV7+Zob6gIiglKrUj8+nogJ6SjHwT/SkgbeUUjNFZDqwUSm1TEQaAe8DvYBTwDil1H77\nZ38DIoBg4DRwlVJqt4s2jKgY6hyPf/M4r256taQX4hiuimgUUWNtKqX4NeNX1qauZc3BNaw9tJYD\npw8w/PzhjO8+nqs7Xk1wQHCNtW/wL/xSVGoDIyqGusaC7Qt4YuUTbLxzI7GhsT615WTOSRbtWsSC\nHQv46eRPjO4ymvE9xnNZ28uM07+BY0TFDUZUDHWJzUc2M2z+MFbetpIezXv42pwyHDh9gA93fsiC\n7QtIy01jXPdxjO8xnl7xvao8BGfwX4youMGIiqGucDz7OH3n9uXFq15kdNfRvjanQnae2MnCHQtZ\nsH0BwQHB3Nz9Zsb3GM95sef52jRDLWFExQ1GVAx1gUJrIUPeG8KgtoN4ZvAzvjbHY5RSrD+8noXb\nF/Lhzg9pHdma8d3Hc1P3m0iISPC1eYYaxIiKG4yoGOoC9yy7h8NZh/nvuP/6ra+i2FbMqt9WsWDH\nAv67+7/0btGbm7vfzOguo4kOifa1eQYvY0TFDUZUDL7m9U2v88/1/+T7O76nSaMmvjbHK+QV5bF8\n73IW7ljIil9XcGmbSxnTdQwjO430+eQDg3cwouIGIyoGX/Ldge8Y8/EY/jfpf/XWH5FVkMVnez9j\n0a5FfLXvK/q27MuYLmO4vvP1NA9v7mvzDFXEiIobjKgYfEXqmVQunnsxb498m2Edh/nanFohpzCH\nL375gkU/LeLzvZ/TM74nY7qO4YYuNxgfjJ9hRMUNRlQMviCvKI9L513KuG7jeOSSR3xtjk/IL85n\nxa8rWLRrEct+XkbXZl0Z3WU0o7uOpk1km3PfwOBTjKi4wYiKobZRSnHrf27FpmzMv2G+WeOBjmv2\nzW/f8MmuT1i8ZzEdYjowpssYRncdTfvo9r42z+ACIypuMKJiqG3+vvbvLNyxkO8mfUdoUKivzalz\nFFmLSNmfwic/fcJ/dv+HlhEtua7TdQxOHMzFLS+mUWAjX5towIiKW4yoGGqTL3/5ktsX3876O9ab\nIR4PsNqsfHfwOz7f+zkr969kd9pu+rfqz+DEwQxOHEzvFr0JtPg6oHrDxIiKG4yoGGqLX9J/4ZK3\nL2HR2EVc1vYyX5vjl2TkZbD6wGpW/raSVftXcfDMQS5ve3mJyHSP6+6363z8DSMqbjCiYqgNMgsy\n6Te3H/dffD93X3i3r82pN5zIOUHK/hRW/raSlb+tJCM/g0HtBjG4nRaZ82PPNz6rGsKIihuMqBhq\nGpuyMerDUcSHxfP6iNd9bU69JvVMKqv2ryoRGauy6l5Mu8Fc3Opizo893wyXeQkjKm4womKoaaat\nmsY3v33DyokrzX4ktYhSin0Z+7TA7F/J5iObOZx1mK7NupLUPIme8T1Jap7EBc0vILJxpK/N9TuM\nqLjBiIqhJvn0p0/50xd/YuOdG83q8TpAdmE2249vZ+uxrWw9tpUfj//IjhM7aB7evIzQ9IzvSZvI\nNmborAKMqLjBiIqhpth+fDuD3xvM57d8zoUJF/raHIMbrDYrv6T/UiIyDsHJK84rIzRJ8Ul0iO5g\nejV2jKi4wYiKpvhMMQERAYjFvJl5g1O5p+g7ty9PD3qaWy64pVbaVAqKi8Fm0+dKgQhYLBAQoI/m\nxdtzTuSc4MdjP5YIzbbj29iXsY/ggGASoxNpF9WOxKhEEqPs5/ayhrL2yIiKGxqyqOTtzyPt0zRO\nfnKS7K3ZSIAQnhROeJ9wInpHENEngtDOoUiAeRJVBqvNytUfXE2v+F68cNULlfpsXh4cOgQHD8KR\nI3DiRGk6fRrOnNHHnBzIzdUpLw+KirSgOIuHQ0CsVi00NhsEBkJQkE6NGpWmkBAIDS09hoWVHsPD\nS4/h4RARUTY1aVJ6DAmp38KllCItN439p/fz2+nf+C3jN347/VtJ/sDpA0Q1jioRmfKi0yayTb3x\nq/mlqIjIMGAOYAHeUko9X+56MPAe0AdIA25SSh20X3sM+B1QDDyglFrhpo0GJSq5P+dy8pOTnPzk\nJAUHCogdGUuz0c2IHhyNNddK9pZssjZnkf2DPhYcKSD8gnAi+kQQ3lsfQ7uEYgkyawHcsXzv8pI9\n5gMsAWddVwqOHoUff4Tt2+Hnn0vT6dPQsiW0aQMJCdC8OcTFQdOmEBMDkZE6RUToh35oKDRuXCoU\nFT3QldLi40gFBTrl5+uUl6dTbm6paGVn6/PsbMjK0kfHuSNlZpaeFxaWFRlXyflaeVFyPgb74bPX\npmwczTrqVnQOZR4iPDicuLA4moU2Iy4sriSVz8eFxRETEuPyN1QX8DtREREL8DMwBDgCbATGKaV2\nO9W5B+ihlPqDiNwEjFJKjRORrsB84CKgFfA1cJ4r9ajvoqKUImd7TomQFKcX03RUU5qNbkbk5ZFY\nAisWh+IzxWRv1QKT9UMW2ZuzyT+YT1j3MCJ6R5T0asK6h2EJNkIDcOt/bqVvQl/uu/g+QD+EN2yA\ntWt12rhR1+vZE3r0gM6d4fzz4bzzoEUL3dPwV4qKyopNZqbuXTnnHeeO8vLXHHmLpbQ35NxDcvSY\nnJNzj6p8cu55hYb6Vqxsysbp/NOcyDnBiZwTnMw5WXJ+IucEJ3PL5s8UnCG6cXSp8IQ1IzYkliaN\nmpRJkY0izypr0qgJjQMb19hkA38UlX7ANKXU/9nzjwLKubciIl/Y66wXkQDgqFIqrnxdEfkceEop\ntd5FO/VOVJRSZG3K4uQnJ0n7JA1bkY1mo5vRbHQzmvRrUm2/SXG2Fprszdlk/ZBF1uYs8vflE947\nnMSnE4ke3HB3+cstyiVhdgLJl+5h87fNWbECNm+GpCQYMECnvn11L6Sq/9eteVaKThZReKKQohP2\n48mi0nOno63Qpj8klD5cxClhL3fKl6lrAUtjCwGhAVhCLFhCLQSEBGAJtWAJKS0vc91dWaiFgLCA\nknNLY4vbB55Suhfl3CNy7iE5955yckrzjp6VIzmGCB3nOTn67+4Y5nMM+ZVPjRuXnjdqpPOO5Mg7\nDx86p+Dg0mP5FBRUegwIOPdvoNhWzKncUyWCczz7OBn5GWQWZJZJZwrOnFWWWZCJ1WZ1KTZhwWGE\nBIboFFT5Y2hQKC0iWlRaVHy9QqglkOqUPwT0dVdHKWUVkTMiEmMvX+dU77C9zCXHjuQQEGghKEjs\nR50CAvznlVFZFWfWntFC8mkallALzUY3o2tyV8J7h3v1bSUwPJCoS6OIujSqpMyaa+XUslPsuWMP\nYReE0eGFDoSe1zAclqD9Gd99BzOXLSMv8yIefK85w4bBY4/B5Zfrh5cnKKsid3cuWZuyyP0592yh\nOFmErcBGcFwwQXFB+tgsqOQ8tFto6bVmwVgaW1BKgeO9SelU8iKlnBKU1C052sCWb8OWZ6U414Yt\nz4Yt14o114ot14Y1z+naiWJsuVZseTasZerqOrZcez5HH1Wh0uLiEBn7eUCoBQl1Eq6wAIIaW4gJ\nFmKDLUiw2JMFS5gg0RZw5O3XCHKqEywQZEGCBAkUikXIL4D8YtGpyJ4KdT6vWF8vKBTy8qGwAPIL\nICdfkZ4DBel6uLCwUF8rKNTnBYVaCAsLS4cYCwugqLi0rLAIiu1HpbSPKzgIAoMgKBAC7D6vwCAI\nDHCITzRBQdEEBHYiwAIBgYrAQP3ZgACdAgMhwgLRgaV+tYAAIKAIa0AWtsBsrAGZWCULqyWbTEse\n6QH52ALysFrysYpOxZKmz8mnmDyK0OdF5FNMPkXKXq7yq/T/xNei4uopWL5L4a6OJ58t4c/t/4jY\nQBQk0ZNe9CSoWF8rDgCbBayBYHOcB4CygC0QbBZBWShNUnqOSJlyLKAs+q1QWcrmwV7H+VuVeXuU\n0jrlv51A813F5MZY2DskmJ/nNCKtQwBINops2O70TLE/TJyfMY6jUqrMM6bS+faKgPcDuCw5i0EX\nbWDj8EC+nBxMXoSc8x6UKzvLNhf2n/UdnO5FuWtnnZfrnbqtV/5+Tp9TaCe4wzdhCQA1rAmNAh/l\n6MT/MQ+YB6jNrtsSmyL+MJz3k6LjHui4R5G4F07HwN7OQmpbyIiGM23hdLQ9RUFuGCgpAopQKues\n+yqAHHC6dNbf9Kz6FeD8c5MQIASIdf5piuu67s5F/4gtVgguUDQuKKZxPjTKRx8L9HmIvaxRAQQX\nQGAOBJ2GwCKdgort58UQZD8GFqmSfFCR0/VCsNggwAoWq/1oz5eU2aCJFaLtZVaL/j9vtf+/tzn+\nH3v4t6oIm0VXVkWgioF8+2/a8fyg9P96SbnTzUVpmy1Kfw+L1V5mU4jNXqacy8GiBJsolIQBYbpc\nCVaLKrm/4zva7M8tm5TatM26le3FW7VNAov42cNvW4qvReUQ4BzGtRXat+JMKtAaOGIf/opUSmWI\nyCF7eUWfLWHhwpEwatRZ5VarjeJiG8VFNoqLFUVF+txqVfpYrCgutmGzKmw2ZT+iz+15ZQOb1YZN\n6bdQm03Zj6BspXnnF0fQbzHYVOk5lHnjLHlI2J+utvMbEdK+ERcASfZ7OP6zu9Iqd9fFXi7VyV8g\nqD8VcdWMIwwed5rGjyXQaFIzLIFS4T3K2ODCRlf2u9Thcr0yTx50zm2dq57VCsuWwZtvwv7fhFtv\nhJtvhvi2Z+j5WhI/3vMjkY0iy35OKQr3F5C3OZvcTdnk/qBTYHQgoReGE9ongtA7wgnrFU5gdOBZ\nbZf/tyr/nct/B5fXKvierq41ZJRSYANVrHTKL0Jl5UBuHuTbZzTk5UNern2Wg5tzR33HeUE+FBSi\nCgqhQHdnVElXxzmvuzOqqAgC7GNmwY1QwY0gMBAJDkCCAiAoAAm0lJ4HBSBBgSXnBAciwYFIoOM8\nqHQKYEAAyhIAAYEoSyBYAlABQShxKpMAVIA+DpNICBiCkgCUBLDoz+9V+u/qa59KALAH7ag/CmwA\nblZK/eRU5w9Ad7ujfhxwfTlH/cXoYa+vqMBRb2vaFFm+HC66qOa/WAMj+8dsfvnzLxQeL6Tjix2J\nuTrG1yZVmcxMeO01eOUVaNcO/vQnuO46/X8UYN6WeSz5eQn/uek/5B/KJ2tTFlkbs/RxUxaWEAsR\nF0aUpj4RBDfzwylO/kJenp5O50iZmWUdM85T2s51LCjQMwGc5107nC7lHTPurjmm6rlzwrjKBwfX\n2Zkbfueoh5Ipxf+kdErxTBGZDmxUSi0TkUbA+0Av4BR6dth++2cfAyYDRZxjSvHqh//LZQv+oKfm\ntG1b81+sgaGU4tSSU/z68K+EnB9Ch9kdCOsc5muzPCYzE15+GebMgauuggcfhD59ytYpzi7m/ifv\n59pj1xK7KZbijGIi+pYVkEYJZnOpSqGUniKWlgbp6VoYMjLKCoW7stOn9T2ioyEqqnQutmMaWfmj\nqzLnY31fgFMF/FJUagMRUSNGKJYMngNz58KaNfrHZ/A6tkIbh185zMHnDhJ3cxztprUjKDbI12a5\npaAAXnoJXngBhg6Fv/5VT/8FPXSZvTWb9C/TSf8ynazNWWxtvpXhk4cT939xhF8QbqITOKOUfutP\nS9Pp1KnSc3cpPV2/3TdtqsXBIRCOY/nz8vnGjX39res1RlTcICIqMlLxy15F0+n36RVon32mxxwN\nNULhyUL2P7Wfkx+fpO0TbUm4J6FOLaZUCv77X3j4YejWDZ5/Hrp0gYJjBWSsyCD9y3QyvsogMCaQ\nmKtjiLk6huSwZNadWscHN3zga/Nrj/z80uX+x4+7PnektDQ9nNO0qU6xsaXnzsm5PDbWP1dANhCM\nqLhBRNS4cYrLL4d77iyGkSP1kubXXzfd3Rome0c2vz70K/kH8uk4uyMx18T43FG8dy/cfbd+Lv7j\neSsXNs4s6Y0UHCwgakiUFpKrYmjctvRNeMBbA5h62VSGnz/ch9ZXE6tV9w5OnjxbFFwJR0GBXu4f\nF1e69N9VvlkzLRKm51CvMKLiBhFRy5Ypnn1Wj3yRlQWXXQa33AKPPOJr8+o9SinSP0/nlwd/oXHb\nxrR5tA3hSeEExVSxp2izL/arpHOzsFDx8vQilr2Sw+RB2fQozCBzzRnCuoURfXU0MVfHEHFRhMsI\nBPtP7+fCNy7kyENH6lZcJ6W0Q+jECfdC4Vyenq6Hfps1KysIDoEoLxyRkebFqwFjRMUNIqIKCmy0\naiV8/z20b4+O6Ne/P/zjHzBmjK9NbBDYimwcee0Ixz84Tu5PuVhChLAOgYS2shIWX0BoTBahYWkE\nW9OQ0xnaOZuero8ZTvmsLP0wLR8N0em8ODianIIEcnLjyDkTQ8bRSM4cCUVEaJJoI6qzEHVhINGX\nhhLUPPTsaIvlgmzN/N9M9p/ez2vXvub9P0z5GUyeOKidr4WElBUIZ1EoXxYba4Z9DR5jRMUNIqIy\n8jJ44uEomjfXzlgAtmyBq6+GpUvh4ot9amO957ff9N956VLYsgWVcZqCkNbkhnYhN/g8clQbcgvi\nycluCiKENs8nrJWN0PYBhHUJIbRHExp1jkEcERdFIDcXa1omudvOkLM9i5yf8snZW0zOPijKgrD4\nAsKa5ZCWfYa9+9K4qM9xunZIw5Jrj/fhiKzoHGXRcW61lhGafYXHaRbbhojIZqXi06iRXmbvnByh\nhD09z8vT38XZEV0+lXdUO6fISG2HwVADGFFxg4ion07+ROa+ztxyi/bTl7yELlsGd92lx8USE31q\nZ73CaoX160uF5ORJGD4cRoyASy7R4XgDz157q5Si6GQRuT/lkrMrh9xdueT8pI/WLCuhXUIJ7RKK\nNcdKzo4cCg4UENIxhLDuYaWpRxiN2zXmZJowaZJuesEC6NixEvY7Hvi5uew9tI07P5rAyrHLsOQX\nlApQQUHpIjNHTI1znZcvcwSbMhjqIEZU3CAiatVvqxjYdhDdusEbb8CllzpVeOUV+Pe/9RqWqCi3\n9zGcg6wsWLFCi8jy5RAfr0VkxAgdYbGaC7yKTmuxyd2ViyXMQlj3MELPD3UZOfn772HsWJgwAZ5+\nunojPn9d+Vdyi3KZffXsalhvMPgfVREVX4dpqTWOZh1FBCZNgnfeKScq996rpwSNHg2ff26mOFaG\nAwdKeyNr12o/1YgR8NRTekm6FwmKCiKyfySR/SteY/TGG/DEE3pJ0nXXVa9NpRQLdywkeUxy9W5k\nMDQQGoyoHMs+Bug3165d4Z//1H7dEl58UccGu+ce/TQyM15cY7PpjUMcQnL0KFxzDdx5J3z8sd59\nyUcUFcEf/wj/+5+OJtypU/XvufHIRkSEPi36nLuywWCg7qxGq2EcotKihd7v4j//KVchIEAPvG/Z\nAjNn1r6BdZ0zZ+Bvf9PreyZP1j6TV1+FY8fg3Xf1DDofCsqZM1rbjh3TrhxvCArAwu0LGd99vM/X\n1hgM/kLDEZWcYyXnt9+uh8DOIjxcO+5ffRU+/LC2TKvbZGTooawOHWD3bvj6a9i5UwvvJZfYN3Tw\nLQcPalM6d9YvCxER3rmv1Wblw50fcnOPm71zQ4OhAdBwRCW7VFRGjICtW7U74CwSEvSwzr33ah9B\nQyUtDaZO1VOmDh6Edevg/fd1TJM6xI8/6p7n736nY3h5U+NWH1hN8/DmdG7a2Xs3NRjqOQ1SVBo3\nhptugvfcbRWQlKQvjh4Nv/5aOwbWFY4fhylT9IbqaWmwaRO8/bbeXL2O8f33OqLwiy/qqMLeHqFa\nuGMhN3c3vRSDoTJUKCoiYhGRG2vLmJrkaNbRMnnHEJgj4sdZ/N//wZNP6rUVGRk1bZ7vOXIE/vxn\nHVUxN1d3AV5/vc6u3Vm5Us/smjcPbqyBX2ihtZBPf/qUcd3Hef/mBkM9pkJRUUrZgCm1ZEuNkpGf\nQZG1qCR/4YXahbJqVQUfuuceLSrXXaeHgOojqal6qK97d53fsUOv22nduuLP+ZBly2DcOD3Z7Jpr\naqaNFb+uoHPTzrSJbHPuygaDoQRPhr++FpGHRaS1iMQ4Uo1b5mViQ2I5mXuyJC+iZ8G++eY5Pjhr\nFlx5JfTqpVfR5eXVrKG1xW+/we9/r4f6QkPhp590HLSEBF9bViGffab9J8uWwcCBNdfOgu0LzNCX\nwVAFPBGVm4A/AquBzfa0qSaNqglaRLQo41cBvWbliy90GA+3BATAtGmweTNs26YXuXz6aemm8v7G\nL7/op/KFF+pAgz//rIWzeXNfW3ZOvvxSL15dulQv0K8pcgpzWL53OWO7ja25RgyGeso5RUUplegi\nta8N47xJfHj8WaISFaW3VnHrsHemXTtYtAjeekv7WoYO1VNr/QGl9Ey2W26Bfv30dsq//AIzZug9\nMPyAr7+GW2/VG2vVdOzPpT8vpV+rfsSFxdVsQwZDPeScoiIiQSJyv4gssqd7RcTvYmfHh8ef5awH\nHUvyzTcr0fEYPFjPRx45EgYNggceqLuO/MxMveamZ0+YOBF699az2aZN05Fv/YQ1a+Dmm+GTT/T0\n4ZrGzPoyGKqOJ8NfrwJ9gH/bUx97WbUQkWgRWSEie0TkSxFxGdBJRCaKyM/2erc5lc8QkYMikulJ\ne/FhZ/dUQD+kLBYd1sNjAgPhvvtg1y4dqbZLF61MVmslblKDbN2qtzZs2xa++UbPud2zBx56SIdK\n9yO2b4cbboAPPtD7qtU0GXkZpOxPYVSXUTXfmMFQD/FEVC5SSk1USq20p0nARV5o+1Hga6VUJ2Al\n8Fj5CiISDTxpb+9iYJqT+CypjB2uhr90G7q38sYblf8CNGsGr72mI/K++64e6F+zpgo38gJ5edoG\nR0DHli318NyiRTBkSLUjBPuCffv0zO5//lNve1MbfPrTp1zZ/kqaNPJdyBmDwZ/x5EljFZEOjoyI\ntAe88Uo+EnjXfv4ucL2LOlcDK5RSZ5RSp4EVwDAApdQGpdRxTxtrEdGiTKgWZ269Vc8mSk+vjPlO\n9O6tuzoPPaRXVU6YAIcPV/FmleTnn/XKv9atdWiZxx7TM7v++tc6P5OrIo4f1wsbp07V04drCzP0\nZTBUD09E5RFglYikiMi36F7FQ15oO84hCkqpY0AzF3VaAqlO+cP2skrjrqcCeofVa691Ew/MU0Rg\n/HgdH6tNG7jgAh0fq6CgGjd1Q1FRaQ/kssv0zn8bNuge03XXudz8yp/IydH/HhMm6KVCtcXRrKNs\nPrqZ4ecNr71GDYZ6RoVPHxGxAHnAeUAnQIDdSimPnpQi8hXgPFdVAAU84aF9rgJvVGku78f/+pid\n23fy1IFWbgkMAAAgAElEQVSnGDRoEIMGDSpz/d579eSoP/2pmiNF4eHw7LN62u5DD+kw+v/4h35K\nVjeOyMGD2nfz1ls6jMrdd+tw/fVoO1mrVTvlu3fX8wlqk492fsR1na4jJCikdhs2GOoIKSkppKSk\nVOse59z5UUS2KKV6VasV1/f9CRiklDouIvHAKqVUl3J1xtnr3G3Pv2av96FTnUylVIUD4CKizuSf\nIWF2AtmPZ7usoxRcdJFe3+jVVdpffKGVymar3sPfZtNx3SdM0IsWu3b1no11BKXg/vt1Z2/58urt\n1lgV+s3tx1ODnmJYx2G127DBUEepqZ0fvxGR0cCnyrt7Dy8BbgeeByYCi13U+RL4m905bwGGoh38\nznj0hSOCI7ApG9mF2YQHh591XUT3Vl55xcuiMmyYXjS5Z0/179Whg179Xk+ZMwdSUvQmW7UtKPsy\n9rEvYx9DEofUbsMGQz3Dk55KFhAGFAP52IewztU7OGfDOtTLR0Br4CAwVil1WkT6AL9XSt1lr3c7\nMBU97DVDKfWevfx5YDzQAjgCzFVKPe2mLaWUosNLHfhywpd0jOno0qa8PO0OWbdOR3w31B6ffaZn\n4a1bp/8Naptnv3uWQ5mH+Pfwf9d+4wZDHaUqPZUKRUX0dnetlVJ+HU3RISqXvH0Jz1/5PJe2udRt\n3b/8RfvBX3yxFg1s4OzcCVdcAUuW6AX/vqDHqz349zX/5rK2tbAYxmDwE6oiKueKUqyAz6plVR3C\n3ap6Z+65R4dtycmpJaMaOGlpelnNP/7hO0HZcWIHZ/LPcEmbS3xjgMFQj/BkntMPIuKNxY4+x92q\nemfatdNb086fXzs2NWQKC/U+aOPG6Zl3vmLh9oWM6z4Oi/jfAlGDoa7hyf+ii4F1IvKriGwTke0i\nsq2mDasJKlqr4sx992mnsdsNvAxe4U9/0lFjZszwnQ1KKbPg0WDwIp7M/qqlABk1T4uIFqxLXXfO\nekOGQHCwng1cU5tANXTeekvv3rhhg28jyKw/vJ7ggGB6xvf0nREGQz3C7X9nERkMoJQ6AFiUUgcc\nCR1U0u+ID493G6rFGRF4+GH4+99rwagGyPff62gyixdDEx+H2Fq4XfdSxNsb3BsMDZSK3hGdH6mf\nlLvm6Yr4OoUnjnoHN92kw2r98EMNG9XAOHoUxozRPZVOnXxri9Vm5aNdH3FzDzP0ZTB4i4pERdyc\nu8r7BZ76VEAvvnvgAZg9u4aNakAUFcGNN+ptnEeM8LU1kLI/hYSIBM6PPd/XphgM9YaKfCrKzbmr\nvF8QFxbHydyTWG1WAiwB56x/112QmKhDbvliQV5945FHtGP+r3/1tSWahTsWMr77eF+bYTDUKyrq\nqbQXkSUistTp3JFPrCX7vEpwQDBRjaM4lXfKo/qRkXpP9JdeqmHDGgALF+q95d9/v25s7VJQXMB/\ndv+Hm7rf5GtTDIZ6RUU9lZFO5+Vd1n7rwnYMgXm6//gDD0CvXnpfDz/agbdOsX27DhT59dd152/4\nxS9f0D2uO62atPK1KQZDvcKtqCilvq1NQ2oLh7P+guYXeFS/TRu9RclLL9V+KPb6wJkzeoHjiy9C\nUpKvrSnFrE0xGGqGOjAQUbtUxlnv4PHHdfTizMwaMqqeopQePrzySr27Zl3Bpmx8/svnjOps9qE3\nGLxNwxMVD0K1lOe88/TWtv/6Vw0ZVU+ZPRsOHdJxveoSe9L20DS0Kc3Dm5+7ssFgqBQNTlRaRLSo\ntKiA9qnMmWMCTXrK6tV68eiiRXVvY8r1h9dzccuLfW2GwVAvcetTsc/ycjt1WCl1XY1YVMPEh8ez\n8cjGSn+ua1cYOBBee03vEmxwz9Gjekvgd9+tm1OxNxzeQN+WfX1thsFQL6lo9pffzvCqiKr4VBw8\n8YTeyPEPf4AQs425S4qKdDSCu+6Cq+to1LgNhzcw4YIJvjbDYKiXNNjZX1Xhggvg4ovh1VfhwQe9\nbFg94fHHISys7ixwLE9+cT67Tu6iV3wvX5tiMNRLzhmlWETOA54DugKNHeVKqfY1aFeNUZ2eCugw\n7VdcAZMn68WRhlI+/RQ+/hg2b64bCxxdsfXYVjo37UxIkOlqGgw1gSf/9ecBr6L3qL8CeA/4oCaN\nqkmiG0eTV5xHXlFelT7frZsOh28iGJdl7164+24tKrGxvrbGPesP+beTvl27doiISSZ5NbVr185r\nv1FPRCVEKfUNej/7A0qpp4Dh1W1YRKJFZIWI7BGRL0XE5Xu/iEwUkZ/t9W6zl4WIyDIR+Un0pmHP\nVqJd4sPjOZ5zvMq2T58O//43HKt6h6dekZMDN9yg/y4X1fE9Qjcc8W8n/YEDB1BKmWSSV9OBAwe8\n9hv1RFTyRcQC7BWRe0VkFBDuhbYfBb5WSnUCVgKPla8gItHAk8BF6B0opzmJzwtKqS5AL+BSEfHY\nLVzdIbC2bWHiRN/uWFhXUEo75fv00T2Vuo6Z+WUw1CyeiMqfgFDgfvTmXLcCE73Q9kjgXfv5u8D1\nLupcDaxQSp1RSp0GVgDDlFJ5yj6RQClVDPwAeBzEqTrOegePPw7JyfDrr9W6jd/zyiuwa5eevCB1\nfEOE9Lx0jmcfp3PTzr42xWCot5zTUa+UcizqyAYmebHtOKXUcXsbx0SkmYs6LYFUp/xhe1kJIhIF\njADmeNpwVVbVl6dpUx1s8vHH4cMPq3Urv2XNGt1bW7fOP6ZYbzy8kT4JfTza9sBgMFQNT2Z/nQ88\nArR1rq+UGuzBZ78CnGNhCHpBpac7R7p69y1ZkCkiAcACYI5San9FN3rqqadKzvMj8zkWXn2HyEMP\n6UWRKSkwaFC1b+dXHDmi16O8/Ta095N5gGYlvcFQMSkpKaSkpFTrHqJUxftticiPwGvAZsDqKFdK\nba5WwyI/AYOUUsdFJB5YZfeRONcZZ69ztz3/mr3eh/b8W0CmUurP52hLOX/P1za9xpajW3h9xOvV\n+QoAfPIJPPUUbNkCgeeU6PpBQYEW0eHD9YJQf+HaBdfyu16/44YuN/jalCojIpzr/6zBUFnc/a7s\n5ZUa2PbEp1KslHpVKbVBKbXZkSrTiBuWALfbzycCi13U+RIYKiKRdqf9UHsZIjIDaHIuQXFFfHg8\nx3K8M3XrhhsgPl7PBmsIKAV//CMkJOihP39BKWWc9AZDLeCJqCwVkT+ISAsRiXEkL7T9PFow9gBX\nAjMBRKSPiLwBoJTKAJ4BNgHrgelKqdMi0hJ4HOgqIltE5AcR+Z2nDXvDUe9ARO+18swzcLzqs5T9\nhtdeg++/h3feqbsLHF1x4MwBAi2BtIxoee7KBp+QmJjIypUrfW2GoZp4MmDjmOn1iFOZAqo1kq6U\nSkeLSfnyzcBdTvl3gHfK1TlMNSIsV3dKcXm6dNFTjB97TPsY6ivffquH+tasgYgIX1tTORy9FKnr\nU9T8nHbt2nHixAkCAwNRSiEi3H777bxUh/bknjlzJkFBQTxUg5FhFy9ezM6dOwkICCAhIYFbz7Gh\n0I8//sh7773H7Nmza8ym2sKT2V9+uR99RTgWPzp+9N7gySf1avtVq3QYl/rGL79ox/z8+dCxo6+t\nqTz+vpLeXxARPvvsM66opf8EVquVgADPZ/Pl5eWxfv161q9fz3333UdwcLDXbcrMzOTpp59m82bt\nJejfvz/XXHMNsW5CTcyePZs1a9YQFRXldVt8wTnf9kUkSETuF5FF9nSviATVhnE1RePAxoQGhZKR\nn+G1ezZpAq+/rmOCZWd77bZ1gtOnYcQI3Uu58qy+pX/g7yvp/Ql3EwksFgv79u0ryU+aNIknn3zS\nZd2jR48yZswY4uLi6NChAy+//HLJtcTERGbNmkVSUhLh4eHYbDaPbVu4cCFz584lLi6OefPmuawz\nZMgQiouLPb5neVavXk23bt1K8klJSaxatcpt/YceeoiRI0dWub26hifDX68CQYDDFX2rveyOmjKq\nNnAMgcWEeMM9pLnmGr3nyl/+Un92iSwu1j2Uq67yjxXzrii2FbPl6BYuTLjQ16Y0aDwdFVBKMWLE\nCEaNGsWHH35IamoqV155JZ07d2bo0KEAJCcn8/nnnxMbG4vFQ+decXEx2dnZxMbG8uijjzJ16lTu\nuuuuMnYdPnwYgECnqZz79u3jzTffLDNDynEuIvTr14/rrivdXurQoUNleh1RUVHs3bvXIxvrA56I\nykVKqSSn/Er7NGO/xuGs79qsq1fv+49/QI8eMGaM/w+DKQX33qsd8v481LvzxE5aR7YmsnH9Dyvt\nLZdRdWYtX3/99WV8Ki+88AKTJ0/2eCr0xo0bSUtLY+rUqYD209xxxx0kJyeXiMoDDzxAQkJCpexa\ntGgRY8eOBeDGG29k2rRpJCcnc/PNNwPw1VdfMXfuXOLj4/nggw+YMEHvudO+fXuee+45j9vJyMig\nceOSgO4EBweTXd+GLyrAE1GxikgHpdSvACLSHqf1Kv6Kt531DqKiSofBtm2DcG9ESfMRM2bAhg3a\nQe/Pa3Aa0lTiurCEZfHixdXyqRw4cIDDhw8TE6NHEZRS2Gw2Lr/88pI6rVp5HJWphBMnTtCiRQtA\nD8VNmTKF5557rkRUhg4dyrx583jwwQfp06dPle2PiIggPT29JJ+Xl0d8fHyV7+dvePKoeARYJSL7\n0Cvc2+LdcC0+wRuhWtxxzTW6l3LPPfDee3U/JpYr3noL5s2DtWv9b6ZXecxK+trFXY8kNDSU3Nzc\nkvyxY8do3br1WfVat25N+/bt2bNnj9s2KjvBZunSpWWGqABuu+02nn76aT777DOGD9eB17du3Urv\n3r3L1HMe/nLG3fBXhw4d2LRpU0n+1KlTZ92zPuPJ7K9vRG/U1QktKruVUgU1blkN0yKiRY2JCsDL\nL0O/fvDmmzqKrz/x2Wd6pfy33+qFnf7OhsMbuPtCP3UI1SN69erFggULmDFjBitWrODbb7/lIhd7\nJfTt25cmTZowa9Ys7r//foKCgti9ezf5+fluexCTJk1CRHjbzZz+HTt2MGDAAE6dOlVSppRi8uTJ\nPPvsswwfPpxdu3bRpUsXRITk5GTGjRsHVH74a+DAgfzlL38pyf/www/MnDkT0AKVmJjoUhTrS6QE\ntx4uERlsP96A3j+lI9ABGG4v82u8uareFaGhsGiRfjhv9kb8gVpi5Uq4/Xb473/h/PN9bU31yS7M\n5teMX7mg+QW+NqXBMGLECJo0aVKSRo8eDcCcOXNYsmQJ0dHRLFy4kFGjRpX5nONBa7FYWLp0KVu3\nbiUxMZG4uDjuvPNOzpw5U6aeM6mpqVx66aUu7Vm1ahVTp04lLi6uTGrevDnTp09n/fr1rFmzhpiY\nGCIjI0lOTmZQNYL5hYaGMmXKFGbMmMEzzzzDI488QlxcHABjxoxh69atZeq/8sorvPXWW3z77bdM\nnz6drKysKrddF3Ab+0tEpiulpomIq3l3Sinl8Qp2X1M+9hfAil9XMGvNLL6+7esabXvRIpgyRQtL\ndHSNNlVtVq+G0aO1zQMH+toa77D6wGqmfDWF7+/43temeAUT++tsioqK6NmzJ9u2bavUmhVDKd6M\n/eV2+EspNc1++rRS6rdyDfn9gsiactSXZ8wYvQL95pth6VIIqqMrfNau1bYmJ9cfQYGG5aRvqAQF\nBbFz505fm2Gw48kE709clC3ytiG1TW2JCsALL2gxmTwZKrFOq9b47ju4/np4/30YMsTX1niXDYc3\nGCe9wVCLVORT6Swio4FIEbnBKd0ONHb3OX+haWhTMgsyKbQW1nhbgYF6I69fftELI+sSS5boSMvz\n58PVHm/I7D+sP7ze9FQMhlqkotlfnYBrAcfOig6ygDtr0qjawCIWmoU140TOCVo1qfyc98oSGgrL\nlsGll0Lz5vDwwzXe5DmZN0+Hr1++HFxMwvF7jmUfI6sgi44xfhiszGDwUyryqSwGFotIf6XUulq0\nqdZwrKqvDVEBiImBL7+Eyy+HoiJ49FHfrGGx2fTCxrff1rtWdupU+zbUBhsPb+SilheZyMQGQy3i\niU/lbvs+8ACISLSI1IsA77XpV3HQurV23Ccnw/33g7WWYxOcPg0jR2pxW7u2/goK2J30CWboy2Co\nTTwRlQuUUqcdGfvGWb1qzqTaoyZX1VdEQoKevrtjB4wbB/n5tdPutm1w4YV6T/lVq7Qd9ZkNRzZw\ncSvjpDcYahNPRMVi38oXAPuuj34cCaqUml5VXxGRkfDFF9qJf/HF+oFfUxQW6p0pBw+G6dPhn/+E\nGthGok5hUzY2HN7ARQn10FlkMNRhPBGV2cBaEXlGRJ4B1gKzatas2sEXw1/ONGoECxbAn/+sp/I+\n/7z3h8PWrYPevfUWwJs3wy23ePf+dZVf0n8hslEkzcOb+9oUg6FBcU5RUUq9B4wBjgMngBuUUu/X\ntGG1QU2HavEEER0WZdMm3XPp31/PxqruoukffoCxY/UK+b/+Vc88a9vWKyb7BWbRo8HgGzza3UYp\ntRP4CFgMZItIm+o2bHf4rxCRPSLypYi43OxCRCaKyM/2erc5lX8uIltEZLuI/FuqMMXHMfurLtC2\nLXzzDTz0kJ4V1qePDpdSGX9LXp4Wj2HD4LrrYMAA+PlnvclWQ5sAZUTF/0hMTGTlypW+NqPWWb16\nNfn5+RQUFPDdd9/52pxqc07fiIhchx4CS0D3VNoCPwHdKvqcBzwKfK2UmiUifwEes5c5tx0NPAn0\nRkdI3iwii5VSZ4CxSqlse71FwFi08HmMr4e/ymOxaAEYO1aLw9//DpMmwWWXaaG44AJo1kynRo3g\n0CE4eBB+/RVWrNDTg3v3hgkTYPFiXaehsuHwBsZ2HetrMxoc7dq148SJE2U26br99tt56aWXfG1a\nCTNnziQoKIiHHnqoxtpYvHgxO3fuJCAggISEBG699Va3dSdOnMiBAweIi4vjjTfeqDGbag2lVIUJ\n+BGIBbbY81cAb53rcx7cdzfQ3H4ejw6pX77OOOBVp/yrwE3l6gQBS9Ai464t5YqsgiwVMiNE2Ww2\nl9frAunpSn30kVKTJyt12WVKdemiVNOmSkVE6POrrlLqzjuVmj9fqVOnfG1t3SC/KF+F/i1UZRdk\n+9oUr+Put1xXaNeunVq5cmWVP/vNN99U6jPFxcWVqp+bm6uuv/561aJFC1VQUFCpz3rKmTNnVO/e\nvUvy/fr1U2lpaW7rv/nmmyo1NbXS38WbuPtd2csr9Wz3ZPirSCl1Cj0LzKKUWgV4Y7PvOKXUcfsT\n/xjQzEWdlkCqU/6wvQwAEfkCOAZkUoV4ZOHB4QRYAsgqrLuhpqOjdc9l7lw9DXnXLjh5EjIz9fmX\nX8Ibb8D48XpxpQG2Hd9Gx5iOhAWH+dqUBoly4xC0WCzs27evJD9p0iSefPJJl3WPHj3KmDFjiIuL\no0OHDrz88ssl1xITE5k1axZJSUmEh4djq0RAvYULFzJ37lzi4uKYN89VAHYYMmQIxcXFHt+zPKtX\nr6Zbt9KBnKSkJFatWuW2flBQEK1atao3EZY9mRp8WkTCgdXAfBE5AeR4cnMR+Qpwnn4jgAKe8NA+\nV56Akl+sUmqYiAQD84HBwDfubvTUU0+VnA8aNKhkvwTHEFiTRk08NMlQ1zGLHusmnro9lVKMGDGC\nUaNG8eGHH5KamsqVV15J586dS/aoT05O5vPPPyc2NhaLxSPXMMXFxWRnZxMbG8ujjz7K1KlTueuu\nu8rYdfjwYQACnfbPdt750SGYjnNXOz8eOnSIqKiS9eJERUWxd+9et3Zt2LABpRSnTp3ivPPOO2uH\nytokJSWFlJSUat3DE1EZCeQBfwZuASKBpz25uVJqqLtrInJcRJorpY6LSDzaX1OeQ8Agp3wroIzk\nK6UKRWSp3U6PRMUZh7P+/Nh6sCOVAdCLHi9t7XrDpvqOTPfOjAw1rerTD6+//voyPpUXXniByZMn\ne7wPzMaNG0lLS2Pq1KmA9tPccccdJCcnl4jKAw88QEIlV+8uWrSIsWO1n+3GG29k2rRpJCcnl+xR\n/9VXXzF37lzi4+P54IMPmDBhAlD5nR8zMjJo3Lg05m5wcDDZ2dlu699xxx306qXXk/fs2ZOBAwcS\nGely3lKN4/zCDTB9+vRK36NCURGRAGCZUuoKwAa8W+kW3LMEuB14HpiInllWni+Bv9lnhlmAocCj\nIhIGRCiljolIIHANuidVaeqas95QfTYc3sBD/WvOCVuXqY4YeIvFixdzxRVXVPnzBw4c4PDhw8TY\nx3OVUthsNi6//PKSOq1aVT5e34kTJ2jRogWgh+KmTJnCc889VyIqQ4cOZd68eTz44INuty32hIiI\nCNLT00vyeXl5xFewL3dSUlLJeXR0NCkpKYwcObLK7fuaCkVFKWUVEZuIRCo948qbPA98JCK/Aw6i\nZ28hIn2A3yul7lJKZdgXXG5CD3tNV0qdFpE4YIl96CsAWAm8VhUjWoT7blW9wfuczj/NocxDdG3W\n1demNFjc9UhCQ0PJzc0tyR87dozWrVufVa9169a0b9+ePXv2uG2jsisIli5detaw0m233cbTTz/N\nZ599xvDhwwHYunUrvXv3LlPPefjLGXfDXx06dGDTpk0l+VOnTp11Twfz589n+fLlzJ8/H4Ds7Gy/\n9614MvyVDWy3+0dKfClKqfur07BSKh240kX5ZuAup/w7wDvl6pwAvDJobnoq9YtNRzbRK74XgZZ6\nEUmoXtGrVy8WLFjAjBkzWLFiBd9++y0XudhzoW/fvjRp0oRZs2Zx//33ExQUxO7du8nPz3fbg5g0\naRIiwttvu451u2PHDgYMGMCpU6dKypRSTJ48mWeffZbhw4eza9cuunTpgoiQnJzMuHHjgMoPfw0c\nOJC/OG2c9MMPPzBz5kxAC1RiYmKJQLVr147f//73AOTk5JCWlsbgwYM9bqsu4sn/vE/tqV4SHx7P\n3nT3TjSDf2EWPfqeESNGlHnbHjp0KJ988glz5sxh4sSJ/Otf/+L6669n1KhRZT7neNBaLBaWLl3K\ngw8+SGJiIoWFhXTq1IkZM2aUqedMamoq48ePd2nPqlWrmDp1Kk884Xp+kIiwZs0aOnToQGRkJMnJ\nyWX8CpUlNDSUKVOmMGPGDJRSPPLII8TFxQEwZswY3nrrrRIfyiWXXML8+fOZM2cO+/fvJzk5mdDQ\n0Cq3XRcQd11VEWmjlDpYy/bUCCKi3H3P5XuX89L6l/hiwhe1bJWhJrg++XrG9xjPjd1u9LUpNYLz\nDCSDpqioiJ49e7Jt2za/HzryFe5+V/bySo01VjQX779ON3a1T329wAx/1R+UUqw/vN7sSd/ACAoK\nKlm9bvA9FYmKszq1r2lDfIVx1NcfDmUewqZstImsdmg6g8FQRSoSFeXmvF7RLKwZp/JOYbXV8haM\nBq/j8KeY7YMNBt9RkaM+SUQy0T2WEPs59rxSStWLJeiBlkBiQmI4mXuS+HD3c8kNdR+zkt5g8D1u\neypKqQClVBOlVIRSKtB+7sjXC0FxUJdC4BuqzoYjZuaXweBrPAuaU88xznr/x2qzsvnIZi5qabYP\nNhh8iREVjLO+PrA7bTfx4fHEhJhQzQaDLzGigump1AfWH15vhr4MhjqAERWMqNQHzEp6g6FuYEQF\nu6M+2zjq/RkjKgZD3cCICqan4u/kFeWx59Qeesb39LUpBg/p3r07q1e73q2ioh0hvdlOfWb16tXk\n5+dTUFDAd999V6ttG1HBOOr9nS3HttC1WVcaBzY+d2VDjdKuXTsaN25cZj8R0JtPWSwWDh7U4QR3\n7NhRZn+UmqIy7SQmJrJy5coqtTNz5kxmz55dpc96yuLFi3n22Wd5/vnnef/99yusO3HiREJDQ2nb\nti0ZGRk1ald5THxwTE/F31l/aL1Z9FhHEBESExNZuHAhf/zjHwH9YM/Pz6+3kQ7y8vJYv34969ev\n57777iM4ONjrbWRmZvL000+zefNmAPr3788111xDbGysy/pTp05l2LBhtGjRotZjopmeCtCkUROK\nbEXkFOacu7KhzmEWPdYtbr31Vt59t3ST2HfffZeJEyeWqePcK9iyZQt9+vQhMjKScePGkZ+ff1bd\nmTNn0q1bN2JjY5k8eTKFhYUA7N69myuuuILo6Gh69OjB0qVL3baTmJjI7NmzSUpKIjo6mnHjxpXc\n57bbbuPgwYOMGDGCJk2a8Pe//93j77tw4ULmzp1LXFwc8+bNc1lnyJAhFBcXe3zP8qxevZpu3bqV\n5JOSkli1apXb+kFBQbRq1conQTaNqKDfrkxvxX8xTvq6Rb9+/cjKymLPnj3YbDY++ugjJkyY4DK0\nelFREaNGjWLixImkp6czduxYPvnk7KDoCxYs4KuvvuLXX39lz549zJgxg+LiYkaMGMGwYcM4efIk\nL730Erfccgt797rfH+njjz9mxYoV/Pbbb2zbto133nkHgPfee482bdqwbNkyMjMzefjhhz36rsXF\nxWRnZxMbG8ujjz7KrFmzzvqehw8fBiAwsHRgaN++fTz22GM8/vjjPPbYY2XOH3/8cZYsWVLmHocO\nHSIqKqokHxUVVeH33LBhA++88w6zZ88+6141jRn+suMQlQ4xHXxtiqESpOWmcSr3FJ2advK1KXUD\nbw0xVXPPFkdvZeDAgXTu3JmEhASX9b7//nuKi4u5/369kezo0aNd7gZ53333ldxj6tSp3H///Vx1\n1VXk5OSU7LJ4xRVXcO2117Jw4UK3jv4HHniA5s2bA3ozsa1bt5a5Xtm9ahYtWsTYsWMBuPHGG5k2\nbRrJyckl+95/9dVXzJ07l/j4eD744AMmTJgAVH43yYyMDBo3LvUZBgcHk52d7bb+HXfcUbIRWM+e\nPRk4cCCRkZGV+m5VxfRU7BhnvX+y8fBGLky4EIuYnzKgxcAbqZpMmDCBBQsW8M4773Dbbbe5rXfk\nyBFatmxZpqxt27Zn1WvVqlWZ60eOHOHo0aNn7XHftm3bkp6BKxyCAnqHxooezJ5w4sQJWrRoAegd\nK7WZ1c4AABsFSURBVKdMmVJGLIYOHUpAQAAPPvhgiaBUhYiIiDKCl5eXR0yM++gRSUlJJefR0dGk\npKRUue3K4rOeiohEAx8CbYH9wI1KqTMu6k0EpqLD7/9NKfVeuetLgHZKqQuqY48Z/vJPzEr6ukmb\nNm1ITEzk888/d7tvPECLFi04dOhQmbKDBw/SsWPHMmWpqakl5wcOHCAhIYGEhISS2WTOn+3UqWq9\n1spOJFi6dCnXXXddmbLbbruNp59+ms8++4zhw4cDsHXrVnr37l2m3r59+3jzzTfPalMphYjQr1+/\nMvfu0KEDmzZtKsmfOnXqrHs6mD9/PsuXL2f+/PkAZGdn16pvxZfDX48CXyulZonIX4DH7GUl2IXn\nSaA3OuT+ZhFZ7BAfERkFZOIFjKj4JxsOb+CuPnf52gyDC95++20yMjIICQnBanW9X1H//v0JCgri\n5Zdf5g9/+AOLFy9mw4YNDB48uEy9f/3rXwwfPpyQkBCee+45xo0bR9++fQkPD2fWrFk8+OCD/O9/\n/2PZsmVMmzatSvbGx8ezb9++krYnTZqEiLgVxR07djBgwABOnTpVUqaUYvLkyTz77LMMHz6cXbt2\n0aVLF0SE5ORkxo0bB1R++GvgwIElw3wAP/zwAzNnzgS0QCUmJpYIVLt27fj9738PQE5ODmlpaWf9\nPWsSX44ZjAQcU0TeBa53UedqYIVS6oxS6jSwAhgGICJhwJ+BGd4wxoiK/6GUMk76Oobzm3diYmKZ\nt2nna47zoKAgPv30U+bNm0dMTAwff/wxo0ePPuu+48eP56qrrqJjx4507NiRqVOnEhQUxJIlS1i+\nfDlNmzbl3nvv5f333+f888+vsE13PProozzzzDPExMTw4osvkpqayiWXXOKy7qpVq5g6dSpxcXFl\nUvPmzZk+fTrr169nzZo1xMTEEBkZSXJyMoMGDar4j1cBoaGhTJkyhRkzZvDMM8/wyCOPEBcXB8CY\nMWPK+IYuueQSUlNTmTNnDlOnTiU5OZnQ0NAqt11ZpLKOKa81LJKulIpxyp9SSsWWq/MQ0Egp9aw9\n/wSQq5R6UUReBFKAH4GlFQ1/iYg61/dcsmcJb2x+g2Xjl1X5Oxlql30Z+xj4zkBS/5x67sr1BBGp\ntDPZ30lMTOStt96q1bftoqIievbsybZt23wyLbe2cfe7spdXalywRoe/ROQroLlzEdo38oSnt3BR\npkQkCeiolHpQRNq5qVeGp556quR80KBBZ701mJ6K/2F6KYaaIigoiJ07d/rajFonJSWl2k79GhUV\npdRQd9dE5LiINFdKHReReOCEi2qHgEFO+VbAKqA/0FtE9gFBQJyIrFRKuX2VcRYVV5jZX/6HWUnf\nMKivK/HrIuVfuKdPn17pe/jSp7IEuN1+PhFY7KLOl8BQEYm0O+2HAl8qpV5TSrVSSrUHLgX2VCQo\nnhAXFseJnBPYlK06tzHUImYlfcPA2XluqPv4UlSeRwvGHuBKYCaAiPQRkTcAlFIZwDPAJmA9MN3u\nsPc6jQIbEdEogvS89HNXNvicImsRPx77kQsTLvS1KQaDwQmfTSlWSqWjxaR8+WbgLqf8O8A7Fdzn\nAFCtNSoO4sPjOZp1lKahTb1xO0MNsuPEDtpFtSOiUYSvTTEYDE6YZchOGGe9/2Cc9AZD3cSIihPG\nWe8/mJX0BkPdxIiKE6an4j+YnorBUDcxouKEERX/IKsgi/2n99MjroevTTEYDOUwouJEfHg8R7OP\n+toMwznYfHQzSfFJBAUE+doUg8FQDiMqTpiein+w4fAGs+jRYKijGFFxwjjq/YPNRzeb9SkGQx3F\niIoTpqfiH+w4sYMezY0/xeA/rF69mvz8fAoKCvjuu+98bU6NYkTFieiQaLILsykoLvC1KQY3FBQX\nsC9jH51izfbBdZF27doRGhpKkyZNSEhIYNKkSf/f3p1HR1VnCRz/3kBoEoEQlpBImrA5SoMGoVGE\nRsAI2DDdaCs0MDSLAs5xY6QF04YDLWKA081ILzIeDFswkhZc0KOOLAkonKMMCmKSVqM2JAFNQghg\nsQfu/FGVIktVSELBy3I/5+RQ79Wv3ruvqNTN+62cOnXK+3yXLl1IS0vzbqemptKmTZtKX7TZ2dmE\nhIRUuWpkVRYvXszSpUtrdxHVtGnTJhITE1myZAnr1q2rsuzkyZMJDQ0lJiaG4uLiqxqX41S1wf+4\nL7N6ov87Wg8UH6h2eXNt7f9hv97095ucDsMxNfksO6Fz586alpamqqr5+fkaGxurc+fOLff8tm3b\nVFV1zZo12q5dO/34448rHWf48OF655136u9+97sax3Dq1Cm99957NSoqSs+ePVvLK6na8ePHtU+f\nPt7t/v3765EjR/yWf/nllzU3N1dLSkquSjxXyt/nyrO/Rt+3dqdSgVWB1W2ZhZn0iujldBimCupZ\nlyMiIoIRI0aUW0Cq1IoVK5g9ezabN2/m9ttvL/dcamoq4eHhxMXF1er869evJykpiYiICFavXu2z\nTFxcHCUlJbU6Prirs3r27Ondjo2NJT093W/54OBgoqOjG8XaLE4uJ1wnWWN93ZZRkEGv9pZU6oO8\nvDzef/997r67/BR/y5cvZ9euXaSlpdGrV/n/yxMnTjB//nzS0tJISkqq8TlLSkpwuVy0bduW+Ph4\nEhISmDFjRrnp8w8dOgRA06aXvv7KrhlfmhRLH/taMz4vL4/WrVt7t1u3bk12drbfuHbv3o2qUlRU\nxA033FBpbfuGxJJKBXanUrdlFGQw8ZaJTodRZ8kVLrBUSq9g6dt773WvDO5yuYiLi6u0ltHWrVsZ\nOnRopYQCMG/ePKZPn07Hjh1rde6NGzcyZswYAMaOHcv8+fNJTU1l/PjxAGzZsoWkpCQiIyN55ZVX\nmDjR/Vmq6ZrxxcXFNG/e3LvdrFkzXC6X3/LTpk3j1ltvBaB3794MHjyYsLCwGl9ffWBJpQJLKnVb\nRkGGVX9V4UqSQaBs2rSJoUOH8tFHHzFhwgSOHDlCq1atvM+/9NJLPPfcczz00EOsXLnSu3/fvn1s\n3brVZ3VZdRUUFBAVFQVAUFAQc+bMYdGiRd6kMmzYMFavXs2sWbPo27dvrc/TsmVLjh69tEzG6dOn\niYyM9Fs+NjbW+zg8PJzt27czevToWp+/LrOkUkFki0j25+93Ogzjw6nzpzj842G6t+nudCimCqXV\nR4MGDWLy5Mn8/ve/58033/Q+HxERwbZt27jzzjt55JFHWL58OQA7duzg4MGDdOrUCVXF5XJx4cIF\nsrKy2LNnz2XP+84771SqVpo0aRILFizg3XffZdSoUYA7efXp06dcubLVXxWvxVf1V7du3crFVFRU\nVOmYpVJSUnjvvfdISUkB3HdwDbptpaYt+/Xxhxr0mHk963UdvX50tcuba2fPoT0a+z+xTofhqJp8\nlp1QtneXqmphYaFed911+vnnn1d6Pjc3V7t27apPPvmkqqqePn1a8/PzvT9PPfWUjhkzRouKilRV\ndcqUKTp16lS/505MTNQjR46U+yksLNRnn31WBwwYoKqqmZmZ+pvf/EZVVdevX1/r6zx58qTefPPN\n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\n", "text/plain": [ "" ] }, "metadata": {}, "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": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "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": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "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": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEWCAYAAAB8LwAVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAH3hJREFUeJzt3Xt0XVW59/Hvr+mdXtNYoHdKS9Hj6wBURI+XzU0o0uKL\nehRFsPB6uNiDgDoUxpGG4RUU8caR47GHQTlyQHkdXO0QfTFYL9QOaIQDJA2XtrSVS5KGXoG0fd4/\nshN2k502NHutvVfy+4yxR9fea+61nszu7CdzzrXmVERgZmbW3ZByB2BmZpXJCcLMzIpygjAzs6Kc\nIMzMrCgnCDMzK8oJwszMispUgpC0VNILkh7tQ9nLJD0uqV7SbyVN77Z/rKQNkn6YXMRmZtmVqQQB\n3ASc0seyjwBvj4ijgP8LfKfb/q8BdaULzcxsYMlUgoiIPwKbC1+TNFvSckmrJD0o6Yh82Qcj4pV8\nsYeAqQXveTswGbg/pdDNzDInUwmiFz8FFkfEO4EvAT8pUuZ8YDmAJAHfzZdVWkGamWXN0HIH0B+S\nDgLeA/wy/8UPMKxbmbOBtwMfyL90MXBfRGzMv8VJwsysiEwnCDpaQJsj4phiOyWdBFwBvD8i2vMv\nvxt4r6SLgbHAMElbI+LKVCI2M8uIVLqYJA2R9Iiku4vsO1fSi/n9j0g6b3+Hyz+IiK3As5I+WnC8\nt+X/PRq4EVgYES2d+yPi7IiYFRGzgS8Cy5wczMx6SmsM4vPAE/vYf1tEHJN//GdvhSTdCvwZOELS\nekmLgE8B5+cvZ/0fYGG++LXAQXR0P62WdGdpfhQzs8FBSU/3LWkaHZenfgO4PCIWdtt/LvCOiPiX\nRAMxM7M3JI0WxPV0XDG0r0x0Zr4F8It8QjEzszJLNEFI+hDwQkTUUzB20M3dwKz8DW3/D7g5yZjM\nzKxvEu1ikvRN4GxgFzCKjquGfhUR5/RSfgjQGhETiuzz0ndmZgcgIg7ocv5EWxARcWVEzMhfMfQJ\n4IHuyUHSIQVPz2Afg9kR4UcES5YsKXsMlfJwXbguXBf7fvRHWe6DkHQ1sCoi7gUukbQQaAdagc+U\nIyYzM9tbagkiIh4EHsxvLyl4/UrA9yGYmVWYgTAX06CTy+XKHULFcF28znXxOtdFaSR+H0SpSIqs\nxGpmVikkEQc4SJ31uZiYNWsW69atK3cYmTJz5kzWrl1b7jDMLGFLH1nar/dnPkGsW7eu3yP1g83r\nE9+a2UC2Yv2Kfr3fYxBmZgNUQ3NDv97vBGFmNgBFhBOEmZn19ML2Fxg6pH+jCE4QZmYDUENzA0fW\nHNmvYzhBJGzWrFmMHj2acePGMXbsWMaNG8cll1ySyLkefPBBpk+fnsixzSxbGpsb+50gMn8VU6WT\nxH333cfxxx+f+LkiwlcomRngFkRmFLsM9+KLL+ZjH/tY1/Mvf/nLnHzyyQC0tbWxYMECJk+ezKRJ\nk1iwYAGbNm3qKrt582bOO+88pk6dyqRJkzjzzDPZsWMHp512Gps2bepqqTz//PPJ/3BmVpEaWpwg\nMuu6667jscceY9myZaxYsYKbbrqJZcuWAbBnzx7OO+88nnvuOdavX8/o0aP53Oc+1/Xes88+m507\nd/Lkk0/y4osvctlllzF69GiWL1/OlClT2Lp1K1u2bOGQQw7p7fRmNsA1NDcwb9K8/h2k3FPRvoEp\na6OY3l7fu0z/Hwdq1qxZMXbs2Jg4cWJMmDAhJk6cGD/72c8iIuKvf/1rVFdXx6xZs+L222/v9Rir\nV6+O6urqiIjYtGlTVFVVxcsvv9yjXF1dXUyfPn2/MfWlzswsu3a8tiNGfG1EtO9u7/x9P6Dv3UEx\nBlHuG63vuuuuomMQ73znO5k9ezYvvfTSXt1NO3fu5NJLL+U3v/kNbW1tRATbtm0jItiwYQPV1dWM\nGzcuzR/BzDKkqbWJw6sP92WuWRC9ZKgbbriB1157jSlTpnDNNdd0vX7dddfR1NTEqlWraGtr4w9/\n+EPXcaZPn05raytbtmzpcTwPUJsZlGaAGpwgymbNmjV89atf5ec//znLli3j2muv5dFHHwVg69at\njBo1inHjxtHa2kptbW3X+w455BDmz5/PxRdfTFtbG7t27WLFio75Vg4++GBaWlqKJg8zGzwamhs4\nclJGEoSkIZIekXR3kX3DJd0mqUnSXyTNSCOmNC1YsGCv+yA+8pGPcM4553DFFVfw1re+lTlz5vDN\nb36TT3/607S3t3PppZeyY8cOampqeM973sNpp5221/FuueUWhg4dypFHHsnBBx/MD37wAwDmzZvH\nWWedxezZs6murvZVTGaDVENzA/Nq+jlATUrrQUi6DHg7MC4iFnbbdxHwvyLiYkkfB/53RHyiyDGi\nWKz5uc4Tinxgcp2ZDWzH/Psx3Hj6jRw79dh+rQeReAtC0jTgNOBnvRQ5A7g5v30HcGLSMZmZDVR7\nYg9rWtb0/xJX0uliuh74EtDbn6xTgecAImI30CapOoW4zMwGnI1bNjJuxDjGjxzf72MlepmrpA8B\nL0REvaQcUKyZ0/010UsyKRyszeVyXnfWzKyb2++9nRErRlC7tbbfx0p0DELSN4GzgV3AKGAs8KuI\nOKegzHKgNiJWSqoC/h4Rk4scy2MQJeI6Mxu4frTyRzzx0hP85PSfAP1bkzrRLqaIuDIiZkTEbOAT\nwAOFySHvHuDc/PbHgAeSjMnMbCAr1T0QUKb7ICRdLen0/NOlQI2kJuBS4CvliMnMbCBobOn/NN+d\nUrnMtRTcxVQ6rjOzgWva96bxp/P+xMwJM4EK7mIyM7P0bH11K5tf2cz08aVZOMwJwsxsgGhsaWRu\n9VyGqDRf7U4QCStccnTKlCksWrSIHTt2ALBo0SKuuuqqrrKPP/44U6ZM4frrr9/rGE1NTYwaNYpz\nzuk+vm9m9rpSDlCDE0TiOpcc3bJlC/X19axevZpvfetbPcrV19dzwgkn8NWvfpXLLrtsr32LFy/m\n2GOPTStkM8uoUqxDXcgJIgWdA8KTJ0/mlFNOob6+fq/9q1at4uSTT+bb3/42F1100V77brvtNiZO\nnMiJJ3oGEjPbt1IsM1rICSJFGzZsYPny5cydO7frtZUrV3Lqqafygx/8gEWLFu1VfsuWLSxZsoTr\nrrvOVx2Z2X6VuotpUKwop6v7v5BOLDnwL+gPf/jDAGzbto0TTzxxrylDHnroIWpqajj11FN7vO+q\nq67is5/9LFOnTj3gc5vZ4LB7z26ean2KudVz91+4jwZFgujPl3spdC45umLFCj75yU/S3NzctWTo\n4sWLefrppznppJP4/e9/z/jxHRNs1dfX87vf/a5Hd5SZWTFr29Yy+aDJHDT8oJId011MKejsHnrf\n+97Hueeeyxe+8IWufVVVVfz85z9nxowZfPCDH2Tbtm0APPjgg6xbt44ZM2Zw6KGH8t3vfpc77riD\nd7zjHWX5GcysspW6ewmcIFJ36aWX8rvf/Y6//e1vXa9VVVXxy1/+kpqaGubPn8+OHTu44IILePrp\np6mvr+dvf/sbF154Iaeffjr3339/GaM3s0rV2NJYkmVGCzlBJEzae/yjpqaGc845h69//et77Rs2\nbBi/+tWvGDVqFAsXLkQSkydP7nqMGTOGkSNHUl3tpTLMrKckWhCei2kQcp2ZDTzvv+n91OZqOeGw\nE/Z63XMxmZkNch6DMDOzHlp3tvLKrlc4dMyhJT2uE4SZWcZ1TrHRfcyzv5wgzMwyLonuJUg4QUga\nIWmlpNWSHpO0pEiZcyW9KOmR/OO8JGMyMxtoGpobmDdpXsmPm/Sa1K8Cx0fE0cBRwHxJxaYlvS0i\njsk//jPJmMzMBppST9LXKfGpNiJiR35zRP58xa6vPOCOs5kzZ5a8322gmzlzZrlDMLMSSqqLKfEE\nIWkI8DBwOHBDRKwqUuxMSe8D1gCXR8SGvh5/7dq1JYnTzCyL2ne3s65tHXOq55T82Gm0IPYAR0sa\nB9wp6S0R8URBkbuBWyOiXdIFwM1A0cUPCmdBzeVy5HK5xOI2M8uCpzc/zfTx0xkxdAQAdXV11NXV\nleTYqd5JLekqYFtEfK+X/UOA1oiYUGRf0TupzcwGszsb7mTp6qXcc9Y9RfdX7J3Ukmokjc9vjwJO\nAhq6lTmk4OkZQGHrwszM9iGpK5gg+S6mQ4Gb8y2DIcDtEfFrSVcDqyLiXuASSQuBdqAV+EzCMZmZ\nDRgNzQ28d8Z7Ezl25ifrMzMbzN699N185+Tv9JokKraLyczMkhMRiV3iCk4QZmaZ9eL2F6lSFTWj\naxI5vhOEmVlGNTQ3MK8mmQFqcIIwM8ushuaGki8zWsgJwswsoxpbGhMbfwAnCDOzzEpygBqcIMzM\nMssJwszMetjZvpNNWzdx2MTDEjuHE4SZWQY1tTYxe+Jshg5JbkIMJwgzswzqXIc6SU4QZmYZlPT4\nAzhBmJllUlLLjBZygjAzy6Akp/nu5ARhZpYxe2IPjc2NiU6zAU4QZmaZs3HLRsaOGMuEkT0W3ywp\nJwgzs4xJeoqNTkkvOTpC0kpJqyU9JmlJkTLDJd0mqUnSXyTNSDImM7OsS3qSvk6JJoiIeBU4PiKO\nBo4C5ks6tlux84HWiJgLfB+4NsmYzMyyLulpvjsl3sUUETvymyPoWAO7+7qhZwA357fvAE5MOiYz\nsyxL4x4ISCFBSBoiaTXwPPDbiFjVrchU4DmAiNgNtEmqTjouM7OsSitBJDeJR15E7AGOljQOuFPS\nWyLiiYIi3RfTFj1bGQDU1tZ2bedyOXK5XGmDNTOrcFtf3UrrzlZmjC8+XFtXV0ddXV1JzqWIot/F\niZB0FbAtIr5X8NpyoDYiVkqqAv4eEZOLvDfSjNXMrBI9vOlhzr/7fOovrO9TeUlERPc/xPsk6auY\naiSNz2+PAk4CGroVuwc4N7/9MeCBJGMyM8uytAaoIfkupkOBmyUNoSMZ3R4Rv5Z0NbAqIu4FlgK3\nSGoCWoBPJByTmVlmpXWJKyScICLiMeCYIq8vKdh+FfinJOMwMxsoGloaOPPIM1M5l++kNjPLkDTW\ngejkBGFmlhG79+ymqbWJIyYdkcr5nCDMzDJi3cvreNPoN3HQ8INSOZ8ThJlZRqR1g1wnJwgzs4xw\ngjAzs6LSHKAGJwgzs8xIYx3qQk4QZmYZ4S4mMzProXVnKzvbd3LomENTO6cThJlZBjQ2NzKvZh7S\nAc27d0CcIMzMMiCtdagLOUGYmWVAmpP0dXKCMDPLgLQHqMEJwswsE9JcB6KTE4SZWYVr393O2ra1\nzKmek+p5k15RbpqkByQ9IekxSZcUKfMBSW2SHsk//jXJmMzMsuaZzc8wbdw0Rg4dmep5k15Rbhdw\neUTUSxoDPCzp/ojovuzoHyJiYcKxmJllUjnGHyDhFkREPB8R9fntbcCTwNQiRdO7sNfMLGMGZIIo\nJGkWcBSwssju4yStlnSfpLekFZOZWRY0tDQwb1K6A9SQUoLIdy/dAXw+35Io9DAwMyKOBn4M3JlG\nTGZmWVGuFkTSYxBIGkpHcrglIu7qvr8wYUTEckn/Jqk6Ilq7l62tre3azuVy5HK5RGI2M6sUEfGG\nEkRdXR11dXUlObcioiQH6vUE0jKgOSIu72X/wRHxQn77WOAXETGrSLlIOlYzs0rz4vYXefMNb6b5\nS80HNA+TJCLigMZ5E21BSPpH4FPAY5JWAwFcCcwEIiJ+CnxU0kVAO7AT+HiSMZmZZUln6yHNSfo6\nJZogIuJPQNV+ytwA3JBkHGZmWdXQXJ4BavCd1GZmFa1cA9TgBGFmVtGcIMzMrKhyrAPRyQnCzKxC\nvbLrFTZu2chhEw4ry/mdIMzMKlRTSxOHTTyMYVXDynJ+JwgzswpVzvEH6GOCkHSYpHTnmTUzG+TK\nscxoob62IL4IHAcg6X2S3ptcSGZmBuUdoIa+J4i/ArMkHRYRK4CaBGMyMzMy0sUETAdeAy6X9ADw\njuRCMjOzzkn60l6HulBfp9p4BrgjIm6VNAk4M8GYzMwGvY1bNzJm+BgmjJxQthj62oK4HXhrfns2\ncEgy4ZiZGZS/ewn62IKIiN3AI/ntVcCqJIMyMxvsGpvLO0ANvg/CzKwiVUILwgnCzKwClWsd6kJO\nEGZmFWjAtyAkTZP0gKQnJD0m6ZJeyv1QUpOkeklHJRmTmVml2/baNlp2tDBj/IyyxpHoinLALuDy\niKiXNAZ4WNL9EdHQWUDSfODwiJgr6V3AjeTv2jYzG4zWtKxh7qS5VA3Z54KciUu0BRERz0dEfX57\nG/AkMLVbsTOAZfkyK4Hxkg5OMi4zs0pWCd1LkOIYhKRZwFHAym67pgLPFTzfSM8kYmY2aJRzHepC\nqSSIfPfSHcDn8y2JvXYXeUskH5WZWWWqlBZE0mMQSBpKR3K4JSLuKlJkAx1zPXWaBmwqdqza2tqu\n7VwuRy6XK1mcZmaVoj8Joq6ujrq6upLEoYhk/1iXtAxojojLe9l/GvC5iPiQpOOA70dEj0FqSZF0\nrGZm5bZ7z27GfGsML33pJcYMH9Pv40kiIor11OxXoi0ISf8IfAp4TNJqOrqOrgRmAhERP42IX0s6\nTdJTwHZgUZIxmZlVsvUvr+dNo99UkuTQX4kmiIj4E7Df67QiYnGScZiZZUWljD+A76Q2M6solXIF\nEzhBmJlVFLcgzMysqIYWJwgzMyuiEtaB6OQEYWZWITbv3Mz29u1MGTul3KEAThBmZhWjsaWReZPm\nIR3QbQsl5wRhZlYhKmmAGpwgzMwqhhOEmZkV1dhSOQPU4ARhZlYx3IIwM7Me2ne38+zmZ5lTPafc\noXRxgjAzqwDPbH6GqeOmMnLoyHKH0sUJwsysAlRa9xI4QZiZVYTGlkaOnOQEYWZm3bgFYWZmRTU0\nNzCvpjKm+e6UaIKQtFTSC5Ie7WX/ByS1SXok//jXJOMxM6tEEVGRLYhEV5QDbgJ+BCzbR5k/RMTC\nhOMwM6tYL+14CYA3jX5TmSPZW6ItiIj4I7B5P8UqY1YqM7My6Zziu1Im6etUCWMQx0laLek+SW8p\ndzBmZmmrxO4lSL6LaX8eBmZGxA5J84E7gSN6K1xbW9u1ncvlyOVyScdnZpa4Uq5DXVdXR11dXUmO\npYgoyYF6PYE0E7gnIt7Wh7LPAm+PiNYi+yLpWM3MyuFDt36Ifz7mnznjyDNKfmxJRMQB9V2l0cUk\nehlnkHRwwfaxdCSsHsnBzGwgG5RdTJJuBXLAJEnrgSXAcCAi4qfARyVdBLQDO4GPJxmPmVmleWXX\nK2zcspHZE2eXO5QeEk0QEfHJ/ey/AbghyRjMzCrZU61PcdjEwxhWNazcofRQCVcxmZkNWqUcoC41\nJwgzszKq1PEHcIIwMysrJwgzMyvKCcLMzHqICBpbGj0GYWZme9u0dROjh41m4qiJ5Q6lKCcIM7My\nqeTuJXCCMDMrm4bmhopbZrSQE4SZWZm4BWFmZkU1tjQ6QZiZWU9uQZiZWQ/bXtvGSzteYsb4GeUO\npVdOEGZmZbCmZQ1zq+dSNaSq3KH0ygnCzKwMKr17CZwgzMzKorG5sgeowQnCzKwsGloGeQtC0lJJ\nL0h6dB9lfiipSVK9pKOSjMfMrFJU8joQnZJuQdwEnNLbTknzgcMjYi5wAXBjwvGYmZXd7j27aWpp\nYl7NIE4QEfFHYPM+ipwBLMuXXQmMl3RwkjGZmZXb+pfXM2n0JMYMH1PuUPap3GMQU4HnCp5vzL9m\nZjZgVfod1J2Glvn8KvJa9Fa4tra2azuXy5HL5UofkZlZwpKcpK+uro66urqSHEsRvX4fl+YE0kzg\nnoh4W5F9NwK/j4jb888bgA9ExAtFykbSsZqZpeHCey/krZPfyuJjFyd+LklERLE/xvcrjS4mUbyl\nAHA3cA6ApOOAtmLJwcxsIMnCTXKQcBeTpFuBHDBJ0npgCTAciIj4aUT8WtJpkp4CtgOLkozHzKwS\nOEEAEfHJPpRJvo1lZlYh2l5pY3v7dqaOrfzrccp9FZOZ2aDS2NzIvEnzkA5oWCBVThBmZilqaG6o\n+BvkOjlBmJmlqNLXoS7kBGFmlqIsTNLXyQnCzCxFWZjmu5MThJlZStp3t/PM5meYO2luuUPpEycI\nM7OUPNv2LFPGTmHk0JHlDqVPnCDMzFKSlRvkOjlBmJmlxAnCzMyKcoIwM7OisrIORCcnCDOzFEQE\nT770ZMWvQ13ICcLMLAXNO5oJgskHTS53KH3mBGFmloLO8YcsTNLXyQnCzCwFWRugBicIM7NUNLY0\nZmaSvk6JJwhJp0pqkLRG0peL7D9X0ouSHsk/zks6JjOztGVpmu9OSS85OgT4MXAisAlYJemuiGjo\nVvS2iLgkyVjMzMrJXUw9HQs0RcS6iGgHbgPOKFIuO6M2ZmZv0Cu7XmHDlg0cPvHwcofyhiSdIKYC\nzxU835B/rbszJdVL+oWkaQnHZGaWqqdan2LWhFkMqxpW7lDekES7mCjeMohuz+8Gbo2IdkkXADfT\n0SXVQ21tbdd2Lpcjl8uVJkozswSluQZEXV0ddXV1JTmWIrp/X5eOpOOA2og4Nf/8K0BExDW9lB8C\ntEbEhCL7IslYzcyS8o0/fIMtr27hmpOLfvUlShIRcUDd+El3Ma0C5kiaKWk48Ak6WgxdJB1S8PQM\n4ImEYzIzS1WWlhktlGiCiIjdwGLgfuBxOq5WelLS1ZJOzxe7RNL/SFqdL/uZJGMyM0tbFq9ggoS7\nmErJXUxmlkURwfhvj2ftpWupHlWd+vkruYvJzGxQ+/u2vzNq2KiyJIf+coIwM0tQVruXwAnCzCxR\nDc0NmVoDopAThJlZgtyCMDOzopwgzMysqKytQ13ICcLMLCHbX9vOi9tfZOb4meUO5YA4QZiZJWRN\nyxrmVM+hakhVuUM5IE4QZmYJyfL4AzhBmJklpqG5IXPLjBZygjAzS0iWB6jBCcLMLDHuYjIzsx72\nxB7WtKzhiElHlDuUA+YEYWaWgPUvr6d6VDVjR4wtdygHzAnCzCwBWe9eghQShKRTJTVIWiPpy0X2\nD5d0m6QmSX+RNCPpmMzMkuYEsR/5NaZ/DJwC/ANwlqTuNXY+HetQzwW+D1ybZEwDQakWJB8IXBev\nc128rhLqorE521cwQfItiGOBpohYFxHtwG10rDtd6Azg5vz2HcCJCceUeZXw4a8UrovXuS5eVwl1\n0dCS3Wm+Ow1N+PhTgecKnm+gI2kULRMRuyW1SaqOiNaEYzMz67In9tC+u532Pe28tvs12nd3/Pva\n7te6Xnsjrz/6wqOZb0EknSCKrYPafWHp7mVUpAwAC/57QSliyrzGxxp5+L8fLncYFcF18bpKqItK\nWTe+4dEGVixb8Ya+0Hft2cWwIcMYXjWcYVUd/w6vGr7P1/b1+uJ3LmbauGnlrop+UZL/oZKOA2oj\n4tT8868AERHXFJRZni+zUlIV8PeImFzkWJXxyTMzy5iIKPbH+n4l3YJYBcyRNBP4O/AJ4KxuZe4B\nzgVWAh8DHih2oAP9Ac3M7MAkmiDyYwqLgfvpGBBfGhFPSroaWBUR9wJLgVskNQEtdCQRMzMrs0S7\nmMzMLLsq7k5q31j3uj7UxWWSHpdUL+m3kqaXI8407K8uCsp9VNIeScekGV+a+lIXkv4p/9l4TNJ/\npR1jWvrwOzJd0gOSHsn/nswvR5xJk7RU0guSHt1HmR/mvzfrJR3VpwNHRMU86EhYTwEzgWFAPXBk\ntzIXAf+W3/44cFu54y5jXXwAGJnfvnAw10W+3BjgQeDPwDHljruMn4s5wMPAuPzzmnLHXca6+Hfg\ngvz2m4Fnyx13QnXxXuAo4NFe9s8H7stvvwt4qC/HrbQWhG+se91+6yIiHoyIV/JPH6LjnpKBqC+f\nC4CvAdcAr6YZXMr6UhefBW6IiC0AEdGccoxp6Utd7AHG5bcnABtTjC81EfFHYPM+ipwBLMuXXQmM\nl3Tw/o5baQmi2I113b/09rqxDmiTVJ1OeKnqS10UOh9YnmhE5bPfusg3madFxK/TDKwM+vK5OAKY\nJ+mPkv4s6ZTUoktXX+riauDTkp4D7gX+JaXYKk33utpIH/6gTPoy1zeqpDfWZVxf6qKjoHQ28HY6\nupwGon3WhSQB19NxufS+3jMQ9OVzMZSObqb3AzOAFZL+obNFMYD0pS7OAm6KiOvz92X9Fx3zwg02\nff4+KVRpLYgNdHygO00DNnUr8xwwHSB/Y924iNhX0yqr+lIXSDoJuAJYkG9mD0T7q4uxdPzS10l6\nFjgOuGuADlT35XOxAbgrIvZExFqgEZibTnip6ktdnA/8AiAiHgJGSqpJJ7yKsoH892Ze0e+T7iot\nQXTdWCdpOB33RNzdrUznjXWwjxvrBoD91oWko4EbgYUR0VKGGNOyz7qIiC0RMTkiZkfEYXSMxyyI\niEfKFG+S+vI7cidwAkD+y3Au8EyqUaajL3WxDjgJQNKbgREDeExG9N5yvhs4B7pmuGiLiBf2d8CK\n6mIK31jXpY91cS1wEPDLfDfLuoj4cPmiTkYf62KvtzBAu5j6UhcR8RtJH5T0OLAL+OJAbGX38XPx\nReA/JF1Gx4D1ub0fMbsk3QrkgEmS1gNLgOF0TG3004j4taTTJD0FbAcW9em4+cuezMzM9lJpXUxm\nZlYhnCDMzKwoJwgzMyvKCcLMzIpygjAzs6KcIMzMrCgnCDMzK8oJwszMinKCMOsnSUdKuqLccZiV\nmhOEWf8dD6wudxBmpeYEYdYPkk4F/g8wvS8LsJhliediMusnSXdHxMJyx2FWam5BmPWDpMnA8+WO\nwywJThBm/fMu4K+S3iFpVLmDMSslJwiz/tlEx9q+YyNiZ7mDMSslj0GYmVlRbkGYmVlRThBmZlaU\nE4SZmRXlBGFmZkU5QZiZWVFOEGZmVpQThJmZFeUEYWZmRf1/LQhsJ3uxzxcAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "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", "\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 this 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": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "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", "\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$. 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", "\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": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "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": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\naGZm1hT+P5bF+zhO79DrAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "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", "\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": { "collapsed": true }, "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": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZEAAAEPCAYAAACDTflkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmYVNWZx/HvC8oiIAgiuCAawI0kogghjkonyiIaQVAE\nHQeXuEUfnUlM0EQjjgnGRJMMMTFRUYiJe1yIiLhgu4soihsIxA1EEFkkNMrSfeaPt1oabHqprq5z\nb9Xv8zz13OruS/O7FN1vneWeYyEEREREstEkdgAREUkvFREREcmaioiIiGRNRURERLKmIiIiIllT\nERERkawlooiY2UQzW2Zmr9dwzgQzW2Bmr5lZr3zmExGR6iWiiAC3AoO29UUzOxroFkLoAZwD/Dlf\nwUREZNsSUURCCM8Cq2o4ZSjw18y5M4G2ZtYpH9lERGTbElFE6mB3YFGVjz/KfE5ERCJKSxGxaj6n\n9VpERCLbLnaAOloMdKny8R7Akq1PMjMVFhGRLIQQqnuzXqsktUSM6lscAFOA/wIws37A6hDCsupO\nDCEU7OOKK66InqEQr6+sLHDTTYGvfz3gDdwtH02bBkaODEyaFPjoo/xeX3l54OWXA+PHB/r3rz4f\nBAYNCjzySKCiovheP11bwx8NkYiWiJndDpQAHczsQ+AKoBkQQgg3hhAeNrMhZrYQKANOj5dW0u7z\nz+EPf4BLLoGtf34OOQR+8AM48URo3TpOvqqaNIHevf1x6aVbfm3hQpg0CW6+GaZP90elAw6Aq66C\n448Hy+r9pUjdJKKIhBBOrsM5F+QjixSmZ5/14vDGG1t+/vzz4cc/hq5d4+RqiO7d4Re/8Ad4QZwx\nwz8uLYURIzafe9pp8KtfQSfNaZQcS1J3ltSipKQkdoRGlcvrCwEeeABatfJ34ocf7gXkuOPgzTf9\n6yHA9dfnr4A09utnBkceCU8+6ddWUQFTpsCee3qLpXNnP6dvX5g7N/d/fyH//yzka2soa2h/WJKY\nWSik65H6e+opOOYYKCvb/LkrrvCuoObN4+VKgkWL4KKL4P77N39u0CC49VbYddd4uSQ+MyMUwMC6\nSFY+/RQGD/Z32SUlXkCuvho2bfJ35OPGqYAAdOkC993n/yZLl3qxnT4ddtvN/+3GjfPWi0h9qCUi\nqXXvvT4AXumEE3yQuW3beJnSaO5cLyjvvecfd+3qYytf+1rcXJI/aolI0Sgvhwsu8HfOlQXk2Wf9\n3fU996iAZGP//eHdd70VcvXV8MEH0K2b/xvffXfsdJJ0aolIKqxZAwMHwsyZ/vF3v+t9+zvuGDdX\noXrrLTjoINi40T+++moYO1bThQuVWiJSsFavhn339RbGzJk+SF5RAU88oQLSmHr2hA0bYNUqLyaX\nXur3rFx00VfvrZHipiIiibRmjRePnXaC+fPhL3/ZPEiud8P5064dzJ4N69fDsGEwYYIXk5/+NHYy\nSQoVEUmUTZu8q6pt2y2Lx9lnx05W3Jo18+7DjRth6FDv3jKDG26InUxiUxGRxBg3Drbf3m+Wu+Ya\nFY8k2m47v4lz3To4+GBfBcDM75CX4qSBdYnu8cdhwAB/fsIJcNdd3mUiybd8ud8JX3l/yYoV0L59\n3ExSfxpYl1Ras8aLxYAB0KaND6Lfc48KSJp07OjTrp97zj/u0AHOOEOD78VEP64SxS9/6eMeIfgv\noDVrdI9Hmh16qL+Wl1ziy6g0aQIvvBA7leSDurMkrxYt8gUBAU49FSZP1myrQvPvf/usrooK6NfP\n3ySodZls6s6SVLj00s0F5MMP4a9/VQEpRG3aeBfXHXfAiy9C06abu7uk8KglIo3us8/8nSnAj34E\n114bN4/kzxdfwM47+6KYgwfDww/rjUMSqSUiiXXnnZsLyPz5KiDFpkULWLsWbrkFHnnEu7U+/jh2\nKskltUSkUYTgg60vvghHHOH3EegdaHH79FOfzQW+SdaYMVHjSBUNaYmoiEjOrVq1+V6B++7zfb5F\nKh17LEyd6vvZv/SS3lwkgYpIhopIfDNm+Bat4BsfaU9vqc4//+lbFYOPmWkxzbg0JiKJcNllXkC6\ndfPpnSogsi3f+97msZG2beH11+PmkeypiEhO9OnjNxD+/OewcKG6KKR2nTv7gpsABx4IEyfGzSPZ\n2S52AEm3TZt80USAadN8GqdIXTVt6pMwRo2C73/f94y58cbYqaQ+NCYiWat6/8c778A++8TNI+n2\nhz/AhRd6q/all2KnKS4aWM9QEcmfqsuXrF6tda8kN6ZNgyFDoHlz+PxzdYvmi4pIhopIfsyf77sO\ngm+hWtmdJZILr77qe5WAd5c2bRo3TzFQEclQEWl8r73me26Dz8DSO0VpDB9+CF27+vP1631nRWk8\nmuIreTFzpheQFi1UQKRx7bknLFvmz5s39215JZlURKROZs3yZb07dlRfteTHLrv4zongLREVkmRS\nd5bU6u23oWdPn4m1alXsNFJsqq65pTGSxqExkQwVkdz74APYay9/rn9aiWX5cm+ZgLpSG4PGRKRR\nrFixuYBUVESNIkWuY0cfbAcfI5HkUBGRalVuJgTehaB3fhJbly4+O3DjRujbN3YaqaQiIl8RArRs\n6c/LytQHLclx4IG+O+KsWXDWWbHTCKiISDUq5+cvWgQ77BA3i8jWjj4a/vhHuPlmuOmm2GlERUS2\ncOaZXjyeeQb22CN2GpHq/eAHcMopcPbZMHt27DTFTbOz5Et33gmjR/u7vB/8IHYakdptv72P2Wlj\nq4bRFN8MFZHsvf8+7L03DBoEjzwSO41I3ZSXw3aZDS009Td7KiIZKiLZqfqDqH8+SZtly3yDq169\nfPFGqT/dJyINUjmVd+3auDlEstGpE0yd6tN///KX2GmKj4pIkfvlL30/kBdegFatYqcRyc6QITBi\nBJx7Lnz0Uew0xUXdWUVs4ULo0QMuuMB3lRNJu8oxEY2P1I/GRDJUROouBGjSZPNzkUKwYoV3z37n\nOzBjRuw06aExEam3Y47xo1bllULSoQPcdhs8+aQ/pPGpJVKEnnsODjsMbrkFTj89dhqR3Nt5Z2+V\naOn4ulF3VoaKSO0qKvyHqmVLWLcudhqRxrF+ve/AqWm/daPuLKmzo47y44oVcXOINKbmzeGee3za\n7zPPxE5T2BJRRMxssJnNM7P5Zja2mq+PMbNPzGx25nFGjJxpN2+e9xPfdNPmVXpFCtUJJ/j/8yOO\n0OSRxhS9O8vMmgDzgSOBJcAsYFQIYV6Vc8YAvUMIF9byvdSdVYPKKY/6J5JiUVYGrVvDyJFw112x\n0yRX2ruz+gILQggfhBA2AncCQ6s5T7O+G+Cqq/y4ZEncHCL51KqV/9+/+2745JPYaQpTEorI7sCi\nKh8vznxua8PN7DUzu9vMtEh5PXzxBfz853DSSbDrrrHTiOTXZZf5sVOnuDkK1XaxA1B9C2PrDpcp\nwO0hhI1mdg4wGe/++opx48Z9+bykpISSkpLcpEyxb33Lj3fcETeHSCwzZ/rPwfTpvlJ1sSstLaW0\ntDQn3ysJYyL9gHEhhMGZjy8BQgjhmm2c3wRYGUJoV83XNCaylcWLfW9q3RMixa5NG19kVL8ivirt\nYyKzgO5m1tXMmgGj8JbHl8ysc5UPhwJv5zFfqnXp4kcVECl2H3zgx1//Om6OQhO9iIQQyoELgEeB\nt4A7QwhzzexKMzs2c9qFZvammb2aOfe0OGnTZeZMP774YtwcIknQvj307w9jx6o1kkvRu7NySd1Z\nW9KUXpEtVd7J/t//Db/7Xew0yZH27ixpBJVjZvPnR40hkijNm8OoUfD73/sSQNJwaokUKLVCRKpX\nuX7cmWfCzTfHTpMMaonIFp57zo/z5tV8nkgxatIETj0VJk7Um6xcUEukAKkVIlKz8nLYbjv46U99\ni+hip5aIfGnuXD++9lrcHCJJ1rQpHH44jB8fO0n6qSVSYJo1g40b1QoRqc3atX4Dom7EVUtEMtau\n9QKi5U1Eate6td87coY2lmgQFZECctJJfhw1Km4OkbSovCH3jTfi5kgzdWcVEDNNWxSpLzNo1w5W\nrYqdJB51ZwmTJvnxT3+KGkMkda6/Hlavhk2bYidJJ7VECoSZz38vL4+dRCRdQvCfnR/9CK69Nnaa\nONQSKXJr1vjxySfj5hBJIzP45jfhuutiJ0knFZECcPbZfjziiLg5RNLqgQf8+K9/xc2RRurOKgBm\ncNRR8NhjsZOIpJeZ735YjFsnqDuriFWu0nvbbXFziKTdySdvnvIrdaeWSMr16QMvv6w71EUaatUq\nv/lw9mw46KDYafJLLZEi9vLLcMIJsVOIpN9OO/lRN+vWj4pIilXuGT1hQtwcIoXi9NO1kVt9qTsr\nxY45Bh5+WF1ZIrmyciV06AALF0K3brHT5I+6s4rUww9Dv36xU4gUjvbt/XjxxXFzpIlaIin1xRfQ\nsiXMmgWHHBI7jUjh+OY3fUHGIvlVAqglUpT+/Gc/qoCI5Nb11/tRa2nVjVoiKdWiBaxfX1zvlkTy\nxcz3YC+WvUbUEilC69fD+efHTiFSuH72s9gJ0kFFJIVWrvTjZZfFzSFSqEaMgKVLY6dIBxWRFKrs\ns+3cOW4OkUJ16aV+1NYKtdOYSAq1bg1lZRoPEWlMZnDXXTByZOwkjU9jIkWmrMyb2yLSuH7zm9gJ\nkk9FJGUqWx8XXBA3h0ih239/X5tOaqYikjKVex307x83h0ihO/fc2AnSQUUkZSZO9KNl1XspInU1\nerQfP/88bo6kUxFJmb/+NXYCkeLQsaMfK7fOleqpiKTMxo0waFDsFCLFY/Lk2AmSTUUkhYYPj51A\npDg0bQrTp8dOkWwqIimycaMfhw6Nm0OkWBx/fOwEyacikiLPPOPHTp3i5hApFuo6rp2KSIo8+mjs\nBCLFZcAAP2p1iG1TEUmRJ5+MnUCkuHTt6se3346bI8lURFLkpZdiJxApTqWlsRMkl4pIyvTuHTuB\nSPGZOTN2guRSEUmZfv1iJxApPrNnx06QXCoiKXPQQbETiBQfjYlsm4pIyvTsGTuBSHHZZx/NzqqJ\nikjKdOsWO4FIcTnggNgJkk1FJCXKyvy4885xc4gUG71xq5mKSEosWuRHLQEvkl9dusROkGwqIilR\nWUREJL86dIidINkSUUTMbLCZzTOz+WY2tpqvNzOzO81sgZm9YGZ7xsgZ08qVsROIFKeddoqdINmi\nFxEzawJcDwwCegKjzWy/rU47E1gZQugB/B74dX5TxvfZZ7ETiBSn9u1jJ0i26EUE6AssCCF8EELY\nCNwJbL3Y+VCgcmuYe4Ej85gvESqXgReR/Npxx9gJkm272k4wszuBtcDzwHMhhHdynGF3oGqP/2K8\nsFR7Tgih3MxWm1n7EELRdPKoiIjEsf32sRMkW61FJIQwysy6A/2AC83sSOBB4PIQwoYcZKhuvtHW\nt/ZsfY5Vcw4A48aN+/J5SUkJJSUlDYiWHJs2xU4gUpyaN4+dIPdKS0spzdGqkhZquRXTzL6VOe/F\nzMcnAnOAY0MIv21wALN+wLgQwuDMx5cAIYRwTZVzpmXOmWlmTYGPQwi7VPO9Qm3Xk1bXXQcXX6w7\nZ0XybelS6NXLj4XKzAghZHUDQa0tEWAAsNHM/gcoAz4ElgMLsvkLqzEL6G5mXYGPgVHA6K3O+Scw\nBpgJnAjMyNHfnRotWsROIFKcysuhSRJGjxOqLkXkfqDNVi2D7wPv5SJAZozjAuBRfKB/Yghhrpld\nCcwKITwETARuM7MFwAq80BSVtm1jJxApThUVKiI1qcuYyFvVfO7mXIYIITwC7LvV566o8nw9MDKX\nf2fa7PKVzjsRyYd162CHHWKnSC7V15To2DF2ApHi9Nln6gmoiYpISqglIhLHZ5/pXpGaqIikROfO\nfly/Pm4OkWKjlkjNVERSomlTP76Xk+kMIlJXKiI1UxFJmTfeiJ1ApLisWgXt2sVOkVwqIikzZ07s\nBCLFZckS2H332CmSS0UkZVRERPJr8WLYY4/YKZJLRSRlXn45dgKR4rJ4sVoiNVERSZEuXQp7/R6R\nJProI7VEaqIikiIFsiCxSGpUVMDHH8Nuu8VOklwqIily9NGxE4gUlw8/9Bt9C3E5+FxREUmRgQP9\nuCEXu7iISK3mzoX994+dItlURFKkQwc/Pv983BwixUJFpHYqIil0332xE4gUh7lzYb/9YqdINhWR\nFLrjjtgJRIqDWiK1UxFJme98Bz79NHYKkcIXArz9NhxwQOwkyaYikjJnnhk7gUhxePddaNUKOnWK\nnSTZVERSZvhwP+qmQ5HG9dJL0Ldv7BTJpyKSMi1b+nHixLg5RAqdikjdqIik1P/9X+wEIoVNRaRu\nVERSaPhwWL48dgqRwrVxo6+YfcghsZMkn4pICl1+uR83bYqbQ6RQzZoFPXpAmzaxkySfikgK9erl\nx7//PW4OkUL1+ONw5JGxU6SDikiKjRsXO4FIYXriCTjqqNgp0kFFJKVGjID334+dQqTwlJXBK6/A\n4YfHTpIOKiIpdfXVfvzss7g5RArNM89A795+o6HUTkUkpXr08KO6tERy65FHYMCA2CnSw0IIsTPk\njJmFQrqe2rRvD6tW+Ro/ItJwIcBee8HUqfD1r8dOkz9mRgjBsvmzaomk2I03+rGiIm4OkUIxezY0\nawY9e8ZOkh4qIik2YoQfb7klbg6RQnH//X4zr2X1nrw4qTsr5Sr/sxfZZYs0ip49fV26fv1iJ8kv\ndWcVsVtv9aO6tEQaZu5cWL1a62XVl4pIyo0Z48drr42bQyTtbrsNRo+GJvqtWC/qzioArVv7DVJF\neOkiOVFeDl27wrRp8I1vxE6Tf+rOKnJTp/pxzZq4OUTS6oknoHPn4iwgDaUiUgD69/fj6afHzSGS\nVpMmwWmnxU6RTurOKhDDhsGDD6pLS6S+Vq/2Gwz/9S/o0CF2mjjUnSX87W9+fPDBuDlE0ubWW+Ho\no4u3gDSUWiIFRPeMiNRPebmvQ3f77cV3b0hVaokIAE8/7cePP46bQyQtpk6Fjh2Lu4A0lFoiBcYM\n9tkH3nkndhKR5DvySDjjDDjllNhJ4lJLRL7029/C/PnwxRexk4gk2xtv+F3qJ54YO0m6qSVSgMxg\nyJDN94+IyFedcoov937ppbGTxNeQloiKSAH6n/+B3/8eNm2Cpk1jpxFJnnfegcMO82m9O+4YO018\n6s6SLVx3nR/POituDpGkGj8eLrpIBSQX1BIpUKedBpMn+xRGLSgnstnChfDtb/uxbdvYaZJBLRH5\nisqNqk4+OW4OkaQZPx4uuEAFJFeitkTMbCfgLqAr8D4wMoTwWTXnlQNzAAM+CCEM28b3U0ukih//\n2JeIX7cOWraMnUYkvrfegu98x2cwtmsXO01ypHZg3cyuAVaEEH5tZmOBnUIIl1Rz3poQQq29lyoi\nWwrBu7IOPhheeSV2GpH4hgyBQYN8PEQ2S3N31lBgcub5ZKDaFgbeApF6MoMbboDZs2Hp0thpROJ6\n7DFYsADOOy92ksISuyWyMoTQvsrHK0IIX1kGzcw2AK8Bm4BrQgjVLjOolkj1tKaWFLvycm+RX3EF\nDB8eO03yNKQlsl2uw2zNzB4DOlX9FBCAy+rxbfYMISw1s72BGWb2egjhvepOHDdu3JfPS0pKKCkp\nqXfmQvP883Doof5ObMCA2GlE8m/yZJ/Oe/zxsZMkQ2lpKaWlpTn5XrFbInOBkhDCMjPrDDwZQti/\nlj9zK/DPEMJ91XxNLZFt2Gkn3zehomJzy0SkGHz6qd+ZPnUq9O4dO00ypXlMZApwWub5GOAr3VRm\n1s7MmmWe7wwcCrydr4CFYtEiP+oGRCk2P/kJjB6tAtJYYrdE2gN3A12AD4ETQwirzaw3cE4I4Wwz\n+zbwF6AcL3q/CyFM2sb3U0ukBj/9KVx9tQ+yd+pU+/kiaffUU3DqqT61t02b2GmSK7VTfHNNRaR2\nGmSXYrF+PfTq5W+chm1r3qcA6e7OkjybN8+PlRtYiRSq8eN9bx0VkMallkgRevBBuPhimDMHdtgh\ndhqR3Js5E447Dl59FXbbLXaa5FNLROpl6FDo0wcuq88ka5GUKCvzcZA//lEFJB/UEilSK1Z4f/HN\nN/syECKF4rzzfL24yZNrP1dcom82lGTq0AH+9jef+vjKK7DrrrETiTTcww/DtGneVSv5oe6sIta/\nv983cuqpfhOiSJotXgxnnuktEC3znj8qIkXu8sthwwa45prYSUSyt2EDnHiir87bv3/sNMVFYyLC\n4sVwyCFw++3w3e/GTiNSfxdeCB98APffr508s6HZWdIge+wBf/+774L4XrXLWook1x13+FjI5Mkq\nIDGoJSJfmjDBZ2s9/zy0bh07jUjt5syBo47yFap79YqdJr207EmGikjDhADf/z6sWgX33qt3dZJs\nS5ZAv36+BfTIkbHTpJu6syQnzOBPf/IFGqtsyyKSOGvXwrHHwrnnqoDEppaIfMWyZb6J1dixcPbZ\nsdOIbKm83DeX2nlnmDhR++Pkgm42lJzq1AmmT4cjjoBddtECdpIcIcAPf+gtkXvvVQFJAhURqVb3\n7jBlCgwZ4u/4DjssdiIRuPJKKC31R7NmsdMIaExEanDIIb40yogR8MYbsdNIsbvuOp/O++ijvt2z\nJIOKiNRo4ECf+jtoELz5Zuw0UqxuvBGuvx4ef1y7ciaNurOkVied5GtrDRzo8/F79oydSIrJ3/4G\n//u/3oXVpUvsNLI1FRGpk9GjfVBzwAAVEsmfiRPh5z/3Lqzu3WOnkeqoiEidnXzy5kIyfTp84xux\nE0khmzDBx0FKS6FHj9hpZFtURKReTjkFmjb1pSbuvRcOPzx2IilEV1/trZCnn4auXWOnkZroZkPJ\nymOPeUG56SbfblckFyoq4NJL4aGHfBBdm6Xlh242lLwbMMBXTv3e9+DTT30zIJGG+OILOO00WLQI\nnnrK70+S5NMUX8naIYf4D/svfwlXXKHdESV7n37qXaQhwBNPqICkiYqINMg++8ALL3j31siRUFYW\nO5GkzYIF8O1v+/jaHXdAixaxE0l9qIhIg3XqBE8+CW3awH/8h+8wJ1IX06b5kjo/+YkPpmv7gfTR\nSyY50bw53HILjBnjezw8/XTsRJJkFRW+DtZZZ8E//uFHSSfNzpKcmz7di8lFF/ly8np3KVWtXAmn\nngr//jfcdZdmYCWBNqWSRBk0CGbN8tlbRx/t+5OIALz0EvTpA/vu6wPoKiDppyIijaJLFx8n6dsX\nDj7Yf2FI8dq0yde/+t734Ne/ht/+FrbfPnYqyQV1Z0mje/xx794aNQp+8Qto2TJ2Ismnf/0L/vM/\noXVrmDQJdt89diLZmrqzJNGOOgrmzIElS6BXL3juudiJJB9CgJtv9okWo0b5WJkKSOFRS0Ty6r77\n4PzzfTHHq66CHXaInUgaw/z5cM45Png+aRJ8/euxE0lN1BKR1Bg+3HdJXLIEDjzQ7xOQwrFhg3dZ\nHnooDBsGM2eqgBQ6tUQkmocfhgsv9F8yv/sd7L137ETSEE8/DeedB1/7Gvzxj7DnnrETSV2pJSKp\nNGSIb7nbp4+vw3XllfD557FTSX0tXAgjRvi9H+PGwZQpKiDFREVEomrRAn72M3j1Ve/m2m8/70Mv\nL4+dTGqzahX88Ic+cN6nD8ybByeeCJbV+1lJKxURSYQ99/RNru64w5dP+eY34f77fYaPJEtZGVx7\nrd8wuG4dvPUWXHKJpm4XK42JSOKEAI884psTNW/us7gGDNA73NjKyuCGG7yAHHGEL//fs2fsVJIL\nDRkTURGRxKqo8LWVfvEL7/YaO9b73ps2jZ2suKxdC3/+8+bicfnl8I1vxE4luaQikqEiUpgqKny7\n1F/9CpYvh4sv9jvgte9E43r/fbj+erj1Vr9h9PLLNV23UGl2lhS0Jk3guOP8Tvdbbtk8+2fsWF9S\nQ3InBHj2WTjhBOjd2z/3yiveIlQBkeqoJSKpNH8+3HgjTJ7sv+zOPReOPRa22y52snRavhz+/ndv\ndaxb58v4jxnjG41J4VN3VoaKSPH5/HOf1XXDDd79MmqUL6nSu7cG4muzaZOvGHDrrTBjhq+we/rp\nUFKiPWCKjYpIhopIcZs716cI3367/xIcPdof++0XO1lybNjgBeMf/4AHH4Tu3b1wjBwJbdvGTiex\nqIhkqIgIeL/+rFleUO66C3bc0bu6jjnG9/Mutn0s1qzxwnHffT5BYb/9fJbb8OFaakZcaouImZ0A\njAP2B/qEEGZv47zBwO/xiQATQwjXbOM8FRHZQkWF3w3/0EMwdSosWOD3nAwc6NNVe/QovG6vTZt8\nB8HHHvPHnDl+V/mwYXD88bDbbrETStKkuYjsC1QAfwEurq6ImFkTYD5wJLAEmAWMCiHMq+bcgi4i\npaWllJSUxI7RaPJxfUuX+jjAjBnw1FPevXP44V5QDjvMb55r1qxx/u7Gur4VK7xozJzpjxdegL32\n8mI5YIBfXz7uJi/k/5+FfG2Q4im+IYR3QggLgJrC9wUWhBA+CCFsBO4EhuYlYMKUlpbGjtCo8nF9\nnTv7GMBtt8GHH/ov3eOOg9df99332rWDgw7ycyZM8JVply/PzfIrDb2+TZt8VtoDD8D48XDKKbDP\nPt4l9ZvfeEE891w/57XX/HMDB+ZvOZJC/v9ZyNfWUGmYELk7sKjKx4vxwiLSYF27+uqzp57qH69b\n5ysLv/qq/yK+/XZ45x1fELJ7d+jWzY977w2dOvljl1380bp19jkqKnwDp5Ur4aOPYNGiLR/vvutd\ncbvuCgcc4C2mgQN9aZj999dd/BJPoxcRM3sM6FT1U0AAfhZC+GddvkU1nyvcPiuJaocdoG9ff1S1\ncqXf2LhwoR9nzoRPPvHHsmX+aNLEZzi1bOnfp/LYooUXiQULoLTUC1J5uU9PXr3aH//+N7Rq5S2h\n3XaDLl380a2bT7nde29f8LBVqxj/KiLblojZWWb2JPCjbYyJ9APGhRAGZz6+BAjVDa6bWfyLERFJ\noWzHRJLUnbWtC5gFdDezrsDHwChgdHUnZvuPICIi2Yk6sG5mw8xsEdAPeMjMpmU+v6uZPQQQQigH\nLgAeBd6KyHidAAAEqElEQVQC7gwhzI2VWURENktEd5aIiKRTqlfIMbMTzOxNMys3s4NrOO99M5tj\nZq+a2Uv5zNgQ9bi+wWY2z8zmm9nYfGZsCDPbycweNbN3zGy6mVW78Ebm+mdnXr8H8p2zvmp7Pcys\nmZndaWYLzOwFM0vNjuR1uLYxZvZJ5vWabWZnxMiZLTObaGbLzOz1Gs6ZkHntXjOzXvnM1xC1XZuZ\n9Tez1VVeu8vq9I1DCKl9APsCPYAZwME1nPcusFPsvI1xffgbgYVAV2B74DVgv9jZ63h91wA/yTwf\nC/xqG+etiZ21HtdU6+sBnAf8KfP8JLyLNnr2HF3bGGBC7KwNuMbDgF7A69v4+tHA1MzzbwEvxs6c\nw2vrD0yp7/dNdUsk1O1mRTJfT9211vH60nwz5lBgcub5ZGDYNs5L04SJurweVa/7Xnw1hjSo6/+1\nNL1eWwghPAusquGUocBfM+fOBNqaWacazk+MOlwbZPHape4Xa5YCMN3MZpnZWbHD5Fh1N2PuHilL\nfe0SQlgGEEJYCnTcxnnNzewlM3vezJJeIOvyenx5TvCJI6vNrH1+4jVIXf+vDc909dxtZnvkJ1re\nbP1v8BHp+Xmri36ZbuOpZnZAXf5Akqb4VisHNysCHBpCWGpmHYHHzGxupipHV+g3Y9ZwfXXrb3V7\nZl6/vYEZZvZ6COG9XObMobq8HlufY9Wck0R1ubYpwO0hhI1mdg7e4kpLS6suEv3z1kCvAF1DCOvM\n7GjgAWCf2v5Q4otICGFADr7H0sxxuZndjzfLE1FEcnB9i4GqA7N74AtVJkJN15cZ5OsUQlhmZp2B\nT7bxPSpfv/fMrBQ4CEhqEanL67EI6AIsMbOmwI4hhNq6GZKg1mvb6jpuwse9Csli/LWrlKift4YI\nIayt8nyamf3JzNqHEFbW9OcKqTur2r48M9vBzFpnnrcCBgJv5jNYjtR6M6aZNcNvxpySv1gNMgU4\nLfN8DPDg1ieYWbvMdWFmOwOHAm/nK2AW6vJ6/BO/XoAT8YkTaVDrtWXeDFQaSrJfq20xtv3zNgX4\nL/hyNY3VlV2yKbHNa6s6tmNmffFbQGosIEDqZ2cNw9/VfY7fzT4t8/ldgYcyz/fGZ5G8CrwBXBI7\ndy6vL/PxYOAdYEHKrq898Hgm+2NAu8znewM3Zp5/G3g98/rNAU6LnbsO1/WV1wO4Ejg287w5cHfm\n6y8Ce8XOnMNrG4+/SXsVeALYJ3bmel7f7XjLYj3wIXA6cA5wdpVzrsdnqc2hhlmhSXvUdm3A+VVe\nu+eBb9Xl++pmQxERyVohdWeJiEieqYiIiEjWVERERCRrKiIiIpI1FREREcmaioiIiGRNRURERLKm\nIiIiIllTERERkawlfgFGkTTLLLB4EvA1fAmbvsC1IbmrEIvUi1oiIo3rQHzjqXfxhe/uwddBEykI\nKiIijSiEMDuEsAFfSPKpEEJpCOGL2LlEckVFRKQRmVkfM+sA9Ay+H8rhsTOJ5JLGREQa12BgKfC8\nmQ0DPo2cRySntBS8iIhkTd1ZIiKSNRURERHJmoqIiIhkTUVERESypiIiIiJZUxEREZGsqYiIiEjW\nVERERCRr/w9zf16rRLgtdwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "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": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# These produce an elliptical orbit: x = 1, y = 0, vx = 0, vy = 0.1\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": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "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, decreasing. There is a secular orbital decay. 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 lost 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": { "collapsed": false }, "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": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "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": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nt3fXrqq1a3vex95tPf64py3vbfHEE4HfB61aeT7T7dt7Pmug+tRTnvS99/quY2Skk/b+rJcrp9q2\n7TcK47VKlfHardt4dUJLPsaQwghUpwli64BYVzoOWBegzCjgCa/pscAor+kWwPpclhECJLrSA4A3\nvea9CdycY6CacPrHqbRTCqr9+qn++KOzVRMSVFU9HyZVzxtdVXX1amd6/nzPi+4Gzo51wwYnPX26\nk+/eeWZkOM8xMU7+wYPO9Mcfq77yipNOTFTNzPS8mQ4dcp5ffdWp8/HHzvThw6qVK3uW72570iTV\njz5y0hs2OPMaN3am3e2OGePkL1niTG/cqHrZZdnbGj5cdcECJ/3dd86866/33S59+jjpP/5wpv/v\n/zw7aFXV1FQnfemlqr/+6qRnznTmuXfq7rbq13fS+/Y50/PmqT77rJM+flw1JcVJly2rumOHk548\n2anzzjvOdHq6aliYp92jR53022+rvvuuk96yxemXe2fvbnfCBKfOnDme18L9pcH79brvPk+ZZcuc\nttq08V2XwYOd9PffO9ObNqnecounzN69Tvqqq1R/+slJ//e/qmlpzk7Su602bZz0qlWebezeKaWl\nqe7a5aSrVXPWDVTff9+Z5w4Q7rZKl3bSv/3mee+99ZaT3rNHdfduz3vvxAnn+Z//dLar+32cnq5a\nt66n3WXLnPTf/qY6e7aTXr3aaa9qVd/l33WX8z50v17Hjnm+DKk67zNw3kPudr/91nlPtG/v21bX\nrk76X/9yprdv931Pud+7N9+sum2bk/78c9X9+1Wvuca3rcqVnbR7HVes8LxfTp1S/eorZ9v17Ol5\nv7z7rvOecH9pUfX9TLq3/eLFql9+6dnGn3/ulHN/dtwBJClJtWlTz77C+zM5eLDzRe2//3X65t7G\ns2c7wXnQIE9bPXo4r72I8zolJ3sCt/szXKWKU9e9XRYvdtdHNZf9/pk+gmHobw4wDJgIDAW+CFBm\nOzBCRJ7DCTpdgZe85g8EPvGuICJxquo+mdQHJyACzAf+LiLlXW11I/s5sZw9c5IpSxL4bOK1fLnv\nDR75x/98rvxzDw25n3NSubLzXKlSzmX82woJ8X0OVO6U61645co5wwVu5cr5PpcvH7if3m1HR/s+\nu9vzf46Lc55jY3Nuy3/5oaEEVKOG81ytmm9+qVI5t1W6dOC2YmI85dzDEZGRnn6FhmZvy/26+PfP\n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\nnbHXU1ztuAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "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." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "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.11" } }, "nbformat": 4, "nbformat_minor": 0 }